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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 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





相关文章
|
19天前
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
124 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
2月前
|
jenkins Devops Java
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第27天】在快速发展的软件开发领域,DevOps实践日益重要。Jenkins作为一款流行的开源自动化服务器,在持续集成(CI)和持续部署(CD)中扮演关键角色。本文通过案例分析,探讨Jenkins在Java项目中的应用,展示其自动化构建、测试和部署的能力,提高开发效率和软件质量。
80 2
|
3月前
|
运维 Devops jenkins
DevOps实践:自动化部署与持续集成的实现之旅
本文旨在通过一个实际案例,向读者展示如何将DevOps理念融入日常工作中,实现自动化部署和持续集成。我们将从DevOps的基础概念出发,逐步深入到工具的选择、环境的搭建,以及流程的优化,最终实现一个简单而高效的自动化部署流程。文章不仅提供代码示例,更注重于实践中的思考和问题解决,帮助团队提高软件开发和运维的效率。
|
3月前
|
运维 监控 Devops
DevOps实践:自动化部署与持续集成的融合之旅
【10月更文挑战第7天】在软件开发领域,DevOps已成为一种文化和实践,它倡导开发(Dev)与运维(Ops)之间的协作与整合。本文将引导读者了解如何通过自动化部署和持续集成(CI)的实践来提升软件交付的速度和质量。我们将探讨一些实用的工具和技术,以及它们是如何帮助团队高效地管理代码变更、测试和部署的。文章将不包含代码示例,但会详细解释概念和流程,确保内容的通俗易懂和条理性。
156 62
|
2月前
|
弹性计算 运维 开发者
后端架构优化:微服务与容器化的协同进化
在现代软件开发中,后端架构的优化是提高系统性能和可维护性的关键。本文探讨了微服务架构与容器化技术如何相辅相成,共同推动后端系统的高效运行。通过分析两者的优势和挑战,我们提出了一系列最佳实践策略,旨在帮助开发者构建更加灵活、可扩展的后端服务。
|
2月前
|
消息中间件 运维 Cloud Native
云原生架构下的微服务优化策略####
本文深入探讨了云原生环境下微服务架构的优化路径,针对服务拆分、通信效率、资源管理及自动化运维等核心环节提出了具体的优化策略。通过案例分析与最佳实践分享,旨在为开发者提供一套系统性的解决方案,以应对日益复杂的业务需求和快速变化的技术挑战,助力企业在云端实现更高效、更稳定的服务部署与运营。 ####
|
2月前
|
运维 Devops jenkins
DevOps实践:持续集成与持续部署在现代软件开发中的作用
【10月更文挑战第42天】在快节奏的软件开发世界里,DevOps已经成为一种提升效率、确保质量和加速交付的重要方法。本文将深入探讨DevOps的核心组成部分—持续集成(CI)和持续部署(CD)—并展示它们如何通过自动化流程优化开发周期。我们将从基础概念讲起,逐步过渡到实际操作,最终通过一个简单代码示例来演示这一过程。文章旨在为读者提供清晰的指导,帮助他们理解和实现CI/CD流程,从而在软件开发领域取得竞争优势。
|
2月前
|
Devops jenkins 测试技术
DevOps实践:自动化部署与持续集成的融合之旅
【10月更文挑战第41天】在软件开发的世界中,快速迭代和高效交付是企业竞争力的关键。本文将带你走进DevOps的核心实践——自动化部署与持续集成,揭示如何通过它们提升开发流程的效率与质量。我们将从DevOps的基本理念出发,逐步深入到具体的技术实现,最终展示一个实际的代码示例,让理论与实践相结合,为你的开发旅程提供清晰的指引。
66 4
|
2月前
|
存储 NoSQL 分布式数据库
微服务架构下的数据库设计与优化策略####
本文深入探讨了在微服务架构下,如何进行高效的数据库设计与优化,以确保系统的可扩展性、低延迟与高并发处理能力。不同于传统单一数据库模式,微服务架构要求更细粒度的服务划分,这对数据库设计提出了新的挑战。本文将从数据库分片、复制、事务管理及性能调优等方面阐述最佳实践,旨在为开发者提供一套系统性的解决方案框架。 ####
|
2月前
|
Kubernetes API Docker
构建高效后端服务:微服务架构的深度实践与优化####
本文深入探讨了微服务架构在现代后端开发中的应用,通过剖析其核心概念、设计原则及实施策略,结合具体案例分析,展示了如何有效提升系统的可扩展性、可靠性和维护性。文章还详细阐述了微服务拆分的方法论、服务间通信的最佳实践、以及容器化与编排工具(如Docker和Kubernetes)的应用技巧,为读者提供了一份全面的微服务架构落地指南。 ####