Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个实例,容错率低如何去解决?

之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个实例,容错率低


如何去解决?


  1. 在一个Jenkins工程中可以选择多个微服务同时发布
  2. 在一个Jenkins工程中可以选择多台生产服务器同时部署
  3. 每个微服务都是以集群高可用形式部署

 

Jenkins+Docker+SpringCloud集群部署流程说明

 

修改所有微服务配置:


再开一台生产服务器  装有docker环境

从jenkins服务器拷贝公钥去这一台生成服务器2的


2387773-20220304151951684-1961346714.png


然后修改docker的私服地址:


2387773-20220304152659457-34642659.png

记得重启docker!

 

注册中心配置:(原来的单机版改成集群版)


# 集群版
spring:
  application:
    name: EUREKA-HA
---
server:
  port: 10086
spring:
  # 指定profile=eureka-server1
  profiles: eureka-server1
eureka:
  instance:
    # 指定当profile=eureka-server1时,主机名是eureka-server1
    hostname: 20.0.0.60
  client:
    service-url:
      # 将自己注册到eureka-server1、eureka-server2这个Eureka上面去
      defaultZone: http://20.0.0.60:10086/eureka/,http://20.0.0.40:10086/eureka/
---
server:
  port: 10086
spring:
  profiles: eureka-server2
eureka:
  instance:
    hostname: 20.0.0.40
  client:
    service-url:
      defaultZone: http://20.0.0.60:10086/eureka/,http://20.0.0.40:10086/eureka/


2387773-20220304152659457-34642659.png


其它微服务的配置:


eureka:
  client:
    service-url:
      defaultZone: http://20.0.0.60:10086/eureka,http://20.0.0.40:10086/eureka/
#上面的这个是eureka访问地址 
instance:
    lease-renewal-interval-in-seconds: 5 # 每隔5秒发送一次心跳
    lease-expiration-duration-in-seconds: 10 # 10秒不发送就过期
    prefer-ip-address: true

2387773-20220304152659457-34642659.png


全部修改完就去吧代码提交到Gitlab中!push!

 

编写deployCluster.sh部署脚本,放到两台生产服务器中路径:/opt/jenkins_shell/deployCluster.sh  


#! /bin/sh
#接收外部参数
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5
profile=$6
imageName=$harbor_url/$harbor_project_name/$project_name:$tag
echo "$imageName"
#查询容器是否存在,存在则删除
containerId=`docker ps -a | grep -w ${project_name}:${tag}  | awk '{print $1}'`
if [ "$containerId" !=  "" ] ; then
    #停掉容器
    docker stop $containerId
    #删除容器
    docker rm $containerId
 echo "成功删除容器"
fi
#查询镜像是否存在,存在则删除
imageId=`docker images | grep -w $project_name  | awk '{print $3}'`
if [ "$imageId" !=  "" ] ; then
    #删除镜像
    docker rmi -f $imageId
 echo "成功删除镜像"
fi
# 登录Harbor
docker login -u lvbu -p Lvbu1234 $harbor_url
# 下载镜像
docker pull $imageName
# 启动容器
docker run -di -p $port:$port $imageName $profile
echo "容器启动成功"


然后就是更改Jenkinsfile  代码!!增加循环构建编译打包!还有集群部署的代码!


//git的凭证
def git_auth="d5bb0e98-15f2-477f-8db7-2c33ecc6c644"
//git的URL
def git_url="git@20.0.0.20:root/tensquare_back.git"
//镜像标签
def tag="latest"
//harbor的url地址
def harbor_url="20.0.0.50:85"
//镜像仓库名
def harbor_name="tensquare"
//harbor的凭证
def harbor_auth="da853891-2b06-4f40-ad1f-f833b0cd96b7"
node {
    //获取当前选择项目名称
    def selectedProjectNames="${project_name}".split(",")
           //获取当前选择服务器
           def selectedServers="${publish_server}".split(",")
    stage('pull code') {
        checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
    stage('check code') {
    for(int i=0;i<selectedProjectNames.length;i++){
        //项目信息  tensquare_eureka_server@10086
        def projectInfo=selectedProjectNames[i]
        //当前的项目名称
        def currentProjectName="${projectInfo}".split("@")[0]
        //当前的项目端口
        def currentProjectPort="${projectInfo}".split("@")[1]
        //定义SonarQubeScanner工具
        def scannerHome = tool 'sonar-scanner'
                   //引用SonarQube系统环境
                   withSonarQubeEnv('sonarqube') {
                   sh """
                       cd ${currentProjectName}
                       ${scannerHome}/bin/sonar-scanner
                        """
                   }
        }
    }
     //添加公共子工程
    stage('make install public sub project') {
                sh  "mvn -f tensquare_common clean install"
        }
     //打包微服务项目,制作镜像
        stage('make package') {
            for(int i=0;i<selectedProjectNames.length;i++){
                //项目信息  tensquare_eureka_server@10086
                def projectInfo=selectedProjectNames[i]
                //当前的项目名称
                def currentProjectName="${projectInfo}".split("@")[0]
                //当前的项目端口
                def currentProjectPort="${projectInfo}".split("@")[1]
                sh  "mvn -f ${currentProjectName} clean package dockerfile:build"
                //定义镜像名称
                          def imageName="${currentProjectName}:${tag}"
                //对镜像打标签
                sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}"
                //镜像推送到harbor
                withCredentials([usernamePassword(credentialsId: "${harbor_auth }", passwordVariable: 'password', usernameVariable: 'username')]) {
                // 登录harbor
                sh "docker login -u ${username} -p ${password} ${harbor_url}"
                //镜像上传
                sh "docker push ${harbor_url}/${harbor_name}/${imageName}"
                sh "echo 镜像上传成功"
        }
     
            //遍历所有服务器,分别部署
            for (int j=0;j<selectedServers.length;j++){
                //获取当前服务器名称
                def currentServerName=selectedServers[j]
                //调用不同服务器模块内容--spring.profiles.active=eureka-server1/eureka-server2
                def activeProfile="--spring.profiles.active="
                //根据不同的服务器名称调用不同的服务器配置信息
                if (currentServerName=="master_server"){
                    activeProfile=activeProfile+"eureka-server1"
                }else if (currentServerName=="slave_server"){
                    activeProfile=activeProfile+"eureka-server2"
                }
      //部署应用
      sshPublisher(publishers: [sshPublisherDesc(configName: "${currentServerName}" , transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deployCluster.sh ${harbor_url} ${harbor_name} ${currentProjectName} ${tag} ${currentProjectPort} ${activeProfile}", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])       
      }
   }
  }
}


2387773-20220303202433538-1356542639.png2387773-20220303202441432-386466965.png2387773-20220303202446659-2017322767.png

2387773-20220304152749326-1015103665.png2387773-20220304152755099-1420711922.png


然后继续提交push到gitlab中!!!


设计Jenkins集群项目的构建参数

安装Extended Choice Parameter插件


2387773-20220303202614634-968237730 (1).png

创建流水线项目:


2387773-20220303202650914-1050451990.png

添加参数:字符串参数:分支名称:


2387773-20220303202843208-912755787.png


然后插件下好了就会有多选框:项目名称:


2387773-20220303202930032-64841690.png


然后继续修改配置另一台生成服务器的:


2387773-20220304152907626-1204576991.png


新增多选框:


2387773-20220304152935067-1210208554.png2387773-20220304152939339-1195606146.png2387773-20220304152943548-1976522062.png


保存后

 

然后把gitlab的后端项目ssh复制一下url  下面会用到!


2387773-20220304152939339-1195606146.png2387773-20220304152943548-1976522062.png


然后就可以开始构建看效果图:


2387773-20220304153100963-631037570.png


然后就开始构建:


2387773-20220304152939339-1195606146.png2387773-20220304152943548-1976522062.png2387773-20220304153100963-631037570.png2387773-20220304153119450-1875960943.png


最后结果图!!!


2387773-20220304153303254-1042488935.png


访问两台生产服务器地址:20.0.0.60:10086    、  20.0.0.40:10086


2387773-20220304164602069-735075656.png2387773-20220304164606847-856653793 (1).png2387773-20220304164606847-856653793.png


另一台的生成服务器:看容器:

2387773-20220304164626218-828952400.png


Nginx+Zuul集群实现高可用网关


docker2服务器上安装nginx


#下载依赖源下载nginx
yum install epel-release -y
yum -y install nginx


修改配置:


vim /etc/nginx/nginx.confn 

内容如下:


upstream zuulServer{
        server 20.0.0.60:10020 weight=1;
        server 20.0.0.40:10020 weight=1;
}
location / {
            proxy_pass http://zuulServer/;
}


2387773-20220304165947779-1779230926.png


保存后重启nginx:

systemctl restart nginx


然后去修改nginx前端的访问地址:


2387773-20220304170306158-2095754726.png


然后提交推送:


2387773-20220304171258063-702750905.png2387773-20220304171303291-291045818.png


再次构建前端项目:


2387773-20220304171320239-268278350.png

访问集群网站:


2387773-20220304171335993-1321347252.png





目录
打赏
0
0
1
0
8
分享
相关文章
用 Docker 轻松部署 ERPNext 15:多场景实战指南
ERPNext 15 是一款功能全面的开源企业资源规划系统,结合 Docker 容器化部署,具备高效、灵活、低成本等优势。适用于小微企业数字化起步、多分支机构协同办公、开发者测试环境搭建、短期项目管理及企业内部培训等多种场景。模块化设计支持按需扩展,满足不同规模企业需求,是实现高效企业管理的理想选择。
用 Docker 轻松部署 ERPNext 15:多场景实战指南
静态资源管理:Nginx在Docker中的部署
部署Nginx到Docker中作为静态资源服务器是一种既简单又高效的方法,可以节省时间和资源,并能确保一致性和可扩展性。我们通过编写Dockerfile指定了基础镜像和所需指令,编写Nginx配置管理请求处理,构建自定义Docker镜像,并运行容器以启动服务。这一过程即符合开发规范,也保证了资源的高效管理和访问速度。
70 13
快速部署自己私有MQTT-Broker-下载安装到运行不到一分钟,快速简单且易于集成到自己项目中
本文给物联网开发的朋友推荐的是GMQT,让物联网开发者快速拥有合适自己的MQTT-Broker,本文从下载程序到安装部署手把手教大家安装用上私有化MQTT服务器。
140 5
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务实现步骤
阿里云云效产品使用合集之前端打包时npm安装卡住一般是什么导致的
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
阿里云云效产品使用合集之同一个主机部署是否支持下载多个制品
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
阿里云云效产品使用合集之Codeup WebIDE环境下,如何使用通义灵码
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
阿里云云效产品使用合集之如何进行大文件的迁移
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问