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

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

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


如何去解决?


  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





相关文章
|
1月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1420 9
|
2月前
|
传感器 边缘计算 运维
AR 虚实叠加技术在工业设备运维中的实现流程方案
AR技术通过虚实信息融合,实现工业设备参数可视化、故障立体化、操作直观化,提升运维效率与精度。结合物联网与数字孪生,打造智能运维新范式。
|
3月前
|
运维 监控 Kubernetes
“你那边修好了吗?”——DevOps时代,运维团队到底该怎么配合?
“你那边修好了吗?”——DevOps时代,运维团队到底该怎么配合?
90 2
|
3月前
|
运维 前端开发 JavaScript
半夜服务器告警不再错过!运维人员必备的语音通知方案
为解决深夜服务器宕机错过告警的问题,本文介绍一款专为个人开发者与运维人员设计的语音通知方案。通过电话直接推送重要告警,确保第一时间响应,避免故障扩大。支持多种编程语言调用,配置简单,3步即可完成,实时性强,适合各类关键业务场景。
303 5
|
2月前
|
传感器 运维 监控
AR眼镜在工业运维的场景应用和方案说明
AR眼镜通过虚实融合技术,革新工业运维模式。从设备巡检、故障维修到员工培训,AR实现远程协作、实时数据叠加与沉浸式教学,大幅提升效率与准确性,推动智能工厂发展。
|
2月前
|
运维 数据可视化 vr&ar
AR远程协作在发电领域的运维应用方案
发电厂面临设备故障频发、运维人员经验不足、远程支持困难及维护成本高昂等挑战。为提升运维效率与设备可靠性,越来越多电厂开始采用增强现实(AR)远程协作技术。通过AR设备,现场人员可与远程专家实时协作,实现快速故障诊断与修复、可视化操作指导和精准培训支持。AR技术不仅缩短停机时间,降低运维成本,还提升了应急响应能力与决策效率,助力发电行业向智能化、高效化方向发展。
|
2月前
|
传感器 人工智能 运维
如何在AR运维巡检中导入AI识别方案,达到智慧巡检目的
在工业运维巡检中,传统依赖人工的方式易出错且效率低。通过融合AR与AI技术,构建智慧巡检闭环,实现设备状态自动识别、预测性维护与高效协同。本文从场景锚定、知识沉淀、交互优化、反馈闭环、模型选型五大维度,解析AI识别方案的落地路径,助力工业智能化转型。
|
3月前
|
敏捷开发 运维 数据可视化
DevOps看板工具中的协作功能:如何打破开发、测试与运维之间的沟通壁垒
在DevOps实践中,看板工具通过可视化任务管理和自动化流程,提升开发与运维团队的协作效率。它支持敏捷开发、持续交付,助力团队高效应对需求变化,实现跨职能协作与流程优化。
|
2月前
|
机器学习/深度学习 人工智能 运维
DevOps 不香了?可能是你还没用上“智能运维”!
DevOps 不香了?可能是你还没用上“智能运维”!
107 0
|
6月前
|
人工智能 运维 监控
阿里云携手神州灵云打造云内网络性能监测标杆 斩获中国信通院高质量数字化转型十大案例——金保信“云内网络可观测”方案树立云原生运维新范式
2025年,金保信社保卡有限公司联合阿里云与神州灵云申报的《云内网络性能可观测解决方案》入选高质量数字化转型典型案例。该方案基于阿里云飞天企业版,融合云原生引流技术和流量“染色”专利,解决云内运维难题,实现主动预警和精准观测,将故障排查时间从数小时缩短至15分钟,助力企业降本增效,形成可跨行业复制的数字化转型方法论。
305 6

热门文章

最新文章