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

简介: 之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个实例,容错率低如何去解决?

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


如何去解决?


  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





相关文章
|
运维 监控 Kubernetes
“你那边修好了吗?”——DevOps时代,运维团队到底该怎么配合?
“你那边修好了吗?”——DevOps时代,运维团队到底该怎么配合?
336 2
|
存储 文字识别 自然语言处理
通义大模型在文档自动化处理中的高效部署指南(OCR集成与批量处理优化)
本文深入探讨了通义大模型在文档自动化处理中的应用,重点解决传统OCR识别精度低、效率瓶颈等问题。通过多模态编码与跨模态融合技术,通义大模型实现了高精度的文本检测与版面分析。文章详细介绍了OCR集成流程、批量处理优化策略及实战案例,展示了动态批处理和分布式架构带来的性能提升。实验结果表明,优化后系统处理速度可达210页/分钟,准确率达96.8%,单文档延迟降至0.3秒,为文档处理领域提供了高效解决方案。
1258 1
|
jenkins Java 持续交付
使用 Jenkins 和 Spring Cloud 自动化微服务部署
随着单体应用逐渐被微服务架构取代,企业对快速发布、可扩展性和高可用性的需求日益增长。Jenkins 作为领先的持续集成与部署工具,结合 Spring Cloud 提供的云原生解决方案,能够有效简化微服务的开发、测试与部署流程。本文介绍了如何通过 Jenkins 实现微服务的自动化构建与部署,并结合 Spring Cloud 的配置管理、服务发现等功能,打造高效、稳定的微服务交付流程。
1228 0
使用 Jenkins 和 Spring Cloud 自动化微服务部署
|
人工智能 安全 Shell
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
Jupyter MCP服务器基于模型上下文协议(MCP),实现大型语言模型与Jupyter环境的无缝集成。它通过标准化接口,让AI模型安全访问和操作Jupyter核心组件,如内核、文件系统和终端。本文深入解析其技术架构、功能特性及部署方法。MCP服务器解决了传统AI模型缺乏实时上下文感知的问题,支持代码执行、变量状态获取、文件管理等功能,提升编程效率。同时,严格的权限控制确保了安全性。作为智能化交互工具,Jupyter MCP为动态计算环境与AI模型之间搭建了高效桥梁。
958 2
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
|
物联网 Linux 开发者
快速部署自己私有MQTT-Broker-下载安装到运行不到一分钟,快速简单且易于集成到自己项目中
本文给物联网开发的朋友推荐的是GMQT,让物联网开发者快速拥有合适自己的MQTT-Broker,本文从下载程序到安装部署手把手教大家安装用上私有化MQTT服务器。
2582 5
|
敏捷开发 运维 数据可视化
DevOps看板工具中的协作功能:如何打破开发、测试与运维之间的沟通壁垒
在DevOps实践中,看板工具通过可视化任务管理和自动化流程,提升开发与运维团队的协作效率。它支持敏捷开发、持续交付,助力团队高效应对需求变化,实现跨职能协作与流程优化。
|
机器学习/深度学习 人工智能 运维
DevOps 不香了?可能是你还没用上“智能运维”!
DevOps 不香了?可能是你还没用上“智能运维”!
413 0
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
3550 13
Spring Cloud Alibaba:一站式微服务解决方案
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?