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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 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月前
|
jenkins Devops Java
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第27天】在快速发展的软件开发领域,DevOps实践日益重要。Jenkins作为一款流行的开源自动化服务器,在持续集成(CI)和持续部署(CD)中扮演关键角色。本文通过案例分析,探讨Jenkins在Java项目中的应用,展示其自动化构建、测试和部署的能力,提高开发效率和软件质量。
59 2
|
4月前
|
jenkins 持续交付 开发者
自动化部署:使用Jenkins和Docker实现持续集成与交付
【8月更文挑战第31天】本文旨在为读者揭示如何通过Jenkins和Docker实现自动化部署,从而加速软件开发流程。我们将从基础概念讲起,逐步深入到实际操作,确保即使是初学者也能跟上步伐。文章将提供详细的步骤说明和代码示例,帮助读者理解并应用这些工具来优化他们的工作流程。
|
4月前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
21天前
|
存储 测试技术 持续交付
Docker与CI/CD的集成策略及其对软件开发效率和质量的提升作用
本文探讨了Docker与CI/CD的集成策略及其对软件开发效率和质量的提升作用。首先介绍了CI/CD的基本概念,接着阐述了Docker在环境一致性、快速部署、资源隔离和轻量化方面的优势。文章还详细讨论了构建、测试和部署阶段的具体集成方法,以及集成后带来的效率提升、可靠性增强、加速交付和易于管理等好处。最后,通过案例分析展示了集成的实际效果,强调了Docker与CI/CD结合的重要性和未来前景。
33 2
|
1月前
|
jenkins Devops 测试技术
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第26天】随着DevOps理念的普及,Jenkins作为一款开源自动化服务器,在持续集成(CI)与持续部署(CD)中发挥重要作用。本文通过某中型互联网企业的实际案例,展示了Jenkins如何通过自动化构建、持续集成和持续部署,显著提升开发效率、代码质量和软件交付速度,帮助企业解决传统手工操作带来的低效和错误问题。
73 4
|
2月前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。
|
4月前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
99 1
|
4月前
|
持续交付 jenkins C#
“WPF与DevOps深度融合:从Jenkins配置到自动化部署全流程解析,助你实现持续集成与持续交付的无缝衔接”
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)项目中应用DevOps实践,实现自动化部署与持续集成。通过具体代码示例和步骤指导,介绍选择Jenkins作为CI/CD工具,结合Git进行源码管理,配置构建任务、触发器、环境、构建步骤、测试及部署等环节,显著提升开发效率和代码质量。
90 0
|
4月前
|
JavaScript jenkins 持续交付
自动化部署与持续集成:使用Jenkins和Docker优化开发流程
【8月更文挑战第31天】在软件开发的世界里,时间就是一切。本文将引导你通过Jenkins和Docker的强大组合,实现自动化部署和持续集成,让你的开发流程如丝般顺滑。我们将从基础设置开始,逐步深入到构建管道,最终实现一键部署的梦想。准备好让你的开发效率飞跃,一起探索这个令人兴奋的旅程吧!
|
4月前
|
jenkins Shell 持续交付
自动化部署:使用Jenkins和Docker实现CI/CD
【8月更文挑战第31天】 本文旨在引导读者了解如何通过Jenkins和Docker来实现持续集成和持续部署(CI/CD),从而优化开发流程,提升工作效率。文章将详细介绍配置Jenkins服务器、创建Docker镜像以及设置自动化构建和部署的步骤。通过实际操作案例,我们将展示如何将代码变更快速部署到测试或生产环境,确保软件质量与发布速度的双重保障。
下一篇
DataWorks