springboot第61集:Jenkins-Boss万字挑战,一文让你走出微服务迷雾架构周刊

科技   其他   2024-03-01 21:41   广东  
名词 CONTAINER ID(容器ID)
名词 IMAGE ID(镜像ID)

cat /etc/os-release //查看系统信息
pwd //查看当前路径
ls //查看当前目录文件
docker -v //查看docker版本
docker-compose up -d //在后台运行(取消-d是在控制台运行)
docker-compose stop //所有容器停止运行
docker ps -a //查看正在运行的容器
docker images //查看安装的镜像
docker stop [CONTAINER ID] //停掉运行的容器
docker rm [CONTAINER ID] //删除运行的容器
systemctl status docker  //查看docker状态
systemctl stop docker    //停止docker
systemctl start docker    //启动docker
systemctl restart docker    //重启docker

Docker + Jenkins + Nginx 实战前端自动化部署

image.png
version: '3.8'
# 执行脚本;docker-compose -f docker-compose-v1.0.yml up -d
services:
  jenkins:
    image: jenkins/jenkins:2.439
    container_name: jenkins
    privilegedtrue
    user: root
    ports:
      - "9090:8080"
      - "50001:50000"
    volumes:
      - ./jenkins_home:/var/jenkins_home # 如果不配置到云服务器路径下,则可以配置 jenkins_home 会创建一个数据卷使用
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/local/bin/docker
      - ./maven/conf/settings.xml:/usr/local/maven/conf/settings.xml # 这里只提供了 maven 的 settings.xml 主要用于修改 maven 的镜像地址
      - ./jdk/jdk1.8.0_202:/usr/local/jdk1.8.0_202 # 提供了 jdk1.8,如果你需要其他版本也可以配置使用。
    environment:
      - JAVA_OPTS=-Djenkins.install.runSetupWizard=false # 禁止安装向导「如果需要密码则不要配置」docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
    restart: unless-stopped

volumes:
  jenkins_home:

Jenkins-Mac

image.png
1、安装jenkins

brew install jenkins

2、链接launchd配置文件

ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents

ln -sfv /usr/local/opt/jenkins-lts/*.plist ~/Library/LaunchAgents

3、启动jenkins

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins-lts.plist

4、停止jenkins

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins-lts.plist

访问:http://localhost:8080 
清华大学镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
tar -xvzf jdk-8u281-linux-x64.tar.gz
vi /etc/profile.d/java8.sh
export JAVA_HOME=/usr/local/java/jdk1.8.0_281
export JAVA_BIN=/usr/local/java/jdk1.8.0_281/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
source /etc/profile
java -version

tar -xvzf apache-maven-3.6.3-bin.tar.gz
mv apache-maven-3.6.3 maven3
vi /etc/profile

MAVEN_HOME=/usr/local/tools/maven3 
export MAVEN_HOME 
export PATH=${PATH}:${MAVEN_HOME}/bin

source /etc/profile 
mvn -version
  • 添加访问凭据:点击添加,添加访问认证(我是用的UserName+Password模式也可以选择其他方式)
image.png
image.png
  • 源码管理:选择Git填写仓库地址,并添加访问账号和密码或者秘钥
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

Jenkins是开源CI&CD软件领导者,是Devops神器

安装Jenkins->编写pipeline脚本->编写Dockerfile脚本。

FROM openjdk:8-jdk-alpine

MAINTAINER liunewshine@qq.com

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && mkdir -p /esms

WORKDIR /esms

EXPOSE 8090

ADD ./target/esms.jar ./

CMD java -Djava.security.egd=file:/dev/./urandom -jar esms.jar

image.png
docker run -u root -itd --name jenkins -p 6001:8080 -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro -v /volume1/docker/jenkins:/var/jenkins_home jenkins/jenkins

docker pull jenkins/jenkins

  • docker-ce 18.09.1(务必使用docker-ce,老版本的docker会导致Jenkins中无法使用docker daemon)

流水线+docker,流水线可以让项目发布流程更加清晰,docker可以大大减少Jenkins配置。

尽量减少Jenkins的配置和发布脚本的书写。

CPU使用率、内存使用率和磁盘使用率的提高通常与系统中发生的特定操作和情况相关。以下是一些常见情况和操作,可能会导致这些资源的使用率增加:

  1. CPU使用率增加

  • 运行计算密集型任务:例如,执行大量数学计算、加密解密操作或图像处理。
  • 运行多个并发应用程序:同时运行多个应用程序或服务,尤其是需要大量计算资源的应用程序,可能会导致CPU使用率增加。
  • 资源竞争:如果系统上运行了多个高优先级的任务或进程,它们可能会竞争CPU资源,导致CPU使用率上升。
  • 内存使用率增加

    • 运行内存密集型应用程序:例如,大型数据库、缓存服务或虚拟机。
    • 创建大型数据结构:例如,加载大型文件或数据集到内存中。
    • 内存泄漏:如果应用程序存在内存泄漏问题,内存使用率可能会持续增加,直到系统耗尽可用内存。
  • 磁盘使用率增加

    • 写入大量数据:例如,进行大规模的日志记录、数据库写入操作或文件传输。
    • 读取大量数据:例如,从磁盘加载大型文件或执行大型数据库查询。
    • 运行IO密集型应用程序:例如,视频编码、解码或批量文件处理。
    • 文件系统碎片化:如果文件系统碎片化严重,可能会导致文件读取和写入操作变慢,进而导致磁盘使用率增加。
    • 查看某个端口是否开放:netstat -lnt | grep 80
    • 查看nginx配置是否正确:nginx -t
    • 查看nginx是否正常启动:ps -ef | grep nginx
    • 查看防火墙状态: systemctl status firewalld
    • 启动防火墙: systemctl start firewalld
    • 停止防火墙: systemctl stop firewalld
    • 永久停用: systemctl disable firewalld
    • 启用防火墙: systemctl enable firewalld
    • 查看某个端口占用情况:netstat –apn | grep 8080
    • 升级版本内核:yum update -y
    docker run -p 3306:3306 --restart=always -e TZ="Asia/Shanghai" \
    --name mymysql -v /usr/local/gourd/docker/mysql/conf:/etc/mysql/conf.d \
    -v /usr/local/gourd/docker/mysql/logs:/logs \
    -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

    docker run -p 8080:8080 --name gourdtomcat \
    --restart=always -e TZ="Asia/
    Shanghai" \
    -v /docker/tomcat/test:/usr/local/tomcat/webapps/test -d tomcat

     docker run -p 6379:6379 --restart=always -e TZ="
    Asia/Shanghai" \
     -v /usr/local/gourd/docker/redis/data:/data \
     -v /usr/local/gourd/docker/redis/conf/redis.conf:/etc/redis/redis.conf \
     --name myredis -d redis redis-server --appendonly yes
     
     docker run --name gourdnginx -p 80:80 \
     --restart=always -e TZ="
    Asia/Shanghai" -d \
     -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
     -v $PWD/logs:/var/log/nginx nginx
    // 查看运行中的容器
    docker ps
    // 查看所有的容器
    docker ps -a
    // 搜索镜像
    docker search keyword
    // 例:docker search mysql
    // 查看下载的镜像
    docker iamges
    // 启动容器
    docker start [容器名/容器ID]
    // 停止容器
    docker stop/kill [容器名/容器ID]
    // 重启容器
    docker restart [容器名/容器ID]
    // 删除已停止的容器
    docker rm [容器名/容器ID]
    // 强制删除容器
    docker rm -f [容器名/容器ID]
    // 删除镜像
    docker rmi 镜像id
    // 查看容器日志
    docker logs [容器名/容器ID]
    // 查看容器运行状态信息
    docker stats
    // 获取容器/镜像的元数据
    docker inspect [OPTIONS] NAME|ID [NAME|ID...]
    // 查看容器中运行的进程信息,支持 ps 命令参数
    docker top [OPTIONS] CONTAINER [ps OPTIONS]
    // 将宿主机目录拷贝到容器目录
    docker cp [path1] [容器ID]:[path2]
    // 将容器目录拷贝到宿主机目录
    docker cp [容器ID]:[path2] [path1]
    1. Web 应用程序,如 Nginx、Apache、Node.js、Tomcat 等。
    2. 数据库,如 MySQL、PostgreSQL、MongoDB 等。
    3. 消息队列,如 RabbitMQ、Kafka 等。
    4. 缓存,如 Redis、Memcached 等。
    5. 日志管理,如 ELK(Elasticsearch、Logstash、Kibana) 等。
    6. 容器管理,如 Kubernetes、Docker Compose 等。
    docker search postgres
    docker pull postgres
    docker images

    [root@localhost ~]$ cd /data/
    [root@localhost data]$ mkdir postgres
    [root@localhost postgres]$ pwd
    /data/postgres

    docker run --name postgresql --privileged -e POSTGRES_PASSWORD=password -p 15433:5432 -v /data/postgres:/var/lib/postgresql/data -d postgres

    docker ps -a

    docker pull postgres
    docker volume create postgre-data
    docker run -id --name=postgresql -v postgre-data:/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e LANG=C.UTF-8 postgres

    1 搜索镜像 docker search <镜像名称>
    2 下载镜像 docker pull <镜像名称>:<标签>
    3 运行容器 docker run <选项> <镜像名称>:<标签>
    4 配置容器 docker exec <容器名称> <命令>
    5 保存容器 docker commit <容器名称> <新镜像名称>:<标签>
    6 导出容器 docker save -o <文件名称> <镜像名称>:<标签>
    7 导入容器 docker load -i <文件名称>
    image.png

    Navicat for PostgreSQL 是一个简单易用的 PostgreSQL 数据库开发图形工具。从编写简单的 SQL 查询到开发复杂的数据库,Navicat for PostgreSQL 旨在满足广泛的用户需求,从 PostgreSQL 初学者到经验丰富的开发人员。连接到本地/远程 PostgreSQL 服务器,并与 Amazon Redshift、Amazon Aurora、Amazon RDS、Google Cloud 和 Microsoft Azure 等云数据库以及所有 PostgreSQL 数据库对象兼容。

    image.png
    1. Apache Bench (ab) :Apache Bench是一个简单而强大的HTTP性能测试工具,它通常随着Apache Web服务器一起提供。您可以使用Homebrew来安装它:brew install ab
    2. Wrk:Wrk是一个现代的HTTP性能测试工具,具有线程化设计和支持Lua脚本等特性。您可以使用Homebrew来安装它:brew install wrk
    3. Siege:Siege是另一个流行的HTTP性能测试工具,具有简单易用的特性。您可以使用Homebrew来安装它:brew install siege
    4. Vegeta:Vegeta是一个命令行工具,用于基于HTTP进行负载测试和性能分析。您可以使用Homebrew来安装它:brew install vegeta
    5. JMeter:Apache JMeter是一个功能强大的Java应用程序,用于执行各种负载测试和性能测量,不仅限于HTTP。您可以从官方网站下载并手动安装它:Apache JMeter。

    创建MQTT pub Sampler录入要发送MQTT的topic,如果需要发送不同数据,可以创建一个CVS,从表里获取数据。这时候在Pub sampler 里就需要使用${}来获取数据,字符串要加“”。

    如果要模拟多个设备,那就创建多个线程组即可。如果想要测试MQTT服务能承受多大的并发, 可以根据需要设置线程数和间隔时间,不过这个数量如果特别大的话,并发量会不精准,但总体上还是可以达到我们的测试目的。

    image.png
    image.png
    • 最好设置一个定时器,控制发送的频率。比如设置10毫秒一次,相当于1个线程1秒发送100次数据
    image.png

    注意超时时间,这里默认的是10毫秒,如果MQTT服务不稳定,可能会出现偶尔连不上的问题,建议1000毫秒

    image.png
    image.png
    image.png
    public enum ServiceError {

        NORMAL(1, "操作成功"),
        UN_KNOW_ERROR(-1, "未知错误"),

        /** Global Error */
        GLOBAL_ERR_NO_SIGN_IN(-10001,"未登录或登录过期/Not sign in"),
        GLOBAL_ERR_NO_CODE(-10002,"code错误/error code"),
        GLOBAL_ERR_NO_AUTHORITY(-10003, "没有操作权限/No operating rights"),
        ;

        private int code;
        private String msg;

        private ServiceError(int code, String msg)
        {
            this.code=code;
            this.msg=msg;
        }

        public int getCode() {
            return code;
        }

        public String getMsg() {
            return msg;
        }
    }

    springboot 启动类

    jar启动请忽略,war启动请继承 SpringBootServletInitializer

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

    @SpringBootApplication
    public class SecurityApplication extends SpringBootServletInitializer {

        public static void main(String[] args) {
            SpringApplication.run(SecurityApplication.class, args);
        }

        // war启动请实现该方法
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(SecurityApplication.class);
        }
    }
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

    Docker Compose是一个用于定义和运行多个Docker容器的工具。它允许您使用YAML文件来配置应用程序的服务、网络和卷,并使用单个命令启动、停止和管理整个应用程序。通过Docker Compose,您可以在一个命令中启动包含多个容器的应用程序,而无需手动运行多个docker run命令。

    Docker Compose的核心概念包括:

    1. 服务(Services) :指应用程序中的不同组件,每个服务通常对应一个容器。
    2. 项目(Project) :指由一组关联的服务组成的完整应用程序。
    3. YAML文件:用于定义项目结构、服务配置和依赖关系的文本文件,通常称为docker-compose.yml

    使用Docker Compose,您可以轻松地在开发、测试和生产环境中部署和管理复杂的容器化应用程序。

    全局参数

    filter

    监测数据项统一过滤,保留两位小数。

    {{10.23123|montionFilter }}

    扫码登录流程讲解、获取授权登录二维码

    image.png

    微信开放平台的方式应该是最舒服的微信扫码登陆了,但是前提需要交认证300元的认证费用,网站的话还需要提交《微信开放平台网站信息登记表》,也是审核最麻烦的方式,只好先pass啦

    开发者认证
    网站审核
    image.png

    时序图总结流程:

    1、用户点击网站微信登陆图标。

    2、网站带上AppID和AppSecret和回调域名参数请求微信OAuth2.0授权登陆。

    3、第二步通过后,微信返回二维码供用户扫码。

    4、用户扫码确定授权。

    5、微信带上code参数回调java后端相关接口。

    6、java后端获取到code后,在带上带上AppID和AppSecret和code再去调微信接口。

    7、获取access_token后就可以解析用户的一些基本信息,比如:微信用户头像、用户名、性别、城市等一些基本参数。

    准备工作

    网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者账号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

    授权流程说明

    微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。 微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:

    1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
    2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
    3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

    第一步:请求CODE

    第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在PC端打开以下链接: https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login。

    image.png
    image.png
    1. 若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
    2. 若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。

    请求方法

    获取第一步的code后,请求以下链接进行refresh_token:

    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
    1、Appsecret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);
    2、access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;
    3、refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上;
    4、如无特别业务需求,建议开发者自行管理业务登录态并合理设置过期时间,减少用户重新授权登录次数,优化用户体验。

    建议将secret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求。

    对于接口作用域(scope),能调用的接口有以下:

    授权作用域(scope)接口接口说明
    snsapi_base/sns/oauth2/access_token通过code换取access_token、refresh_token和已授权scope
    snsapi_base/sns/oauth2/refresh_token刷新或续期access_token使用
    snsapi_base/sns/auth检查access_token有效性
    snsapi_userinfo/sns/userinfo获取用户个人信息
    1. 什么是授权临时票据(code)? 答:第三方通过code进行获取access_token的时候需要用到,code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。code的临时性和一次保障了微信授权登录的安全性。第三方可通过使用https和state参数,进一步加强自身授权登录的安全性。
    2. 什么是授权作用域(scope)? 答:授权作用域(scope)代表用户授权给第三方的接口权限,第三方应用需要向微信开放平台申请使用相应scope的权限后,使用文档所述方式让用户进行授权,经过用户授权,获取到相应access_token后方可对接口进行调用。
    image.png
    image.png
    image.png
    1. 当认证完成之后,我们即可以创建网站应用
    Spring学习笔记(二十三)——实现网站微信扫码登录获取微信用户信息Demo-左眼会陪右眼哭の博客
    image.png

    1、微信开放平台介绍(申请里面的网站应用需要企业资料) 微信开放平台网站:https://open.weixin.qq.com/

    2、什么是appid、appsecret、授权码code appid和appsecret是 资源所有者向申请人分配的一个id和秘钥 code是授权凭证,A->B 发起授权,想获取授权用户信息,那a必须携带授权码,才可以向B获取授权信息 (你要从我这里拿东西出去,就必须带身份证)

    3、先仔细阅读下微信开放平台 官方给出的微信登录开发指南: https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

    #    1、扫码支付文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=2_2
    #    2、名称理解
            appid:公众号唯一标识
            appsecret:公众号的秘钥
            mch_id:商户号,申请微信支付的时候分配的
            key:支付交易过程生成签名的秘钥,设置路径 
                微信商户平台(pay.weixin.qq.com)-->账户中心-->账户设置-->API安全-->密钥设置
    #    3、和微信支付交互方式
            1、post方式提交
            2、xml格式的协议
            3、签名算法MD5
            4、交互业务规则 先判断协议字段返回,再判断业务返回,最后判断交易状态
            5、接**易单位为 分
            6、交易类型:JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付

    微信支付业务流程说明:

    (1)商户后台系统根据用户选购的商品生成订单。

    (2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;

    (3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。

    (4)商户后台系统根据返回的code_url生成二维码。

    (5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。

    (6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。

    (7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。

    (8)微信支付系统根据用户授权完成支付交易。

    (9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。

    (10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。

    (11)未收到支付通知的情况,商户后台系统调用【查询订单API】。

    (12)商户确认订单已支付后给用户发货。

    加群联系作者vx:xiaoda0423

    仓库地址:https://github.com/webVueBlog/JavaGuideInterview

    算法猫叔
    程序员:进一寸有一寸的欢喜
     最新文章