当前位置:   article > 正文

Jenkins+Docker+SpringCloud微服务持续集成之集群部署_jenkins 部署微服务

jenkins 部署微服务

一、集群部署流程说明

 

环境配置

  1. #环境配置
  2. hostnamectl set-hostname web2-server && su
  3. systemctl stop firewalld
  4. systemctl disable firewalld
  5. vim /etc/selinux/config
  6. SELINUX=disabled
  7. vim /etc/resolv.conf
  8. nameserver 114.114.114.114
  9. #安装依赖包
  10. yum install -y yum-utils device-mapper-persistent-data lvm2
  11. #设置阿里云镜像源
  12. cd /etc/yum.repos.d/
  13. yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  14. #安装 docker-ce 社区版
  15. yum install -y docker-ce
  16. systemctl start docker
  17. systemctl enable docker
  18. #配置镜像加速,官方网址可参考:https://help.aliyun.com/document_detail/60750.html
  19. mkdir -p /etc/docker
  20. #直接命令行输入以下内容:
  21. tee /etc/docker/daemon.json <<-'EOF'
  22. {
  23. "registry-mirrors": ["https://t466r8qg.mirror.aliyuncs.com"]
  24. }
  25. EOF
  26. #把Harbor地址加入到Docker信任列表(harbor仓库的docker中不需要配)
  27. vim /etc/docker/daemon.json
  28. {
  29. "registry-mirrors": ["https://t466r8qg.mirror.aliyuncs.com"],
  30. "insecure-registries": ["192.168.8.20:85"]
  31. }
  32. systemctl daemon-reload
  33. systemctl restart docker
  34. #网络优化
  35. vim /etc/sysctl.conf
  36. net.ipv4.ip_forward=1
  37. sysctl -p
  38. systemctl restart network
  39. systemctl restart docker
  40. docker version

二、修改idea中微服务配置

2.1 注册中心配置

idea中修改注册中心eureka的配置,单节点换成集群

 

  1. # 集群版
  2. spring:
  3. application:
  4. name: EUREKA-HA
  5. ---
  6. server:
  7. port: 10086
  8. spring:
  9. # 指定profile=eureka-server1
  10. profiles: eureka-server1
  11. eureka:
  12. instance:
  13. # 指定当profile=eureka-server1时,主机名是eureka-server1
  14. hostname: 192.168.8.17
  15. client:
  16. service-url:
  17. # 将自己注册到eureka-server1、eureka-server2这个Eureka上面去
  18. defaultZone: http://192.168.8.17:10086/eureka/,http://192.168.8.16:10086/eureka/
  19. ---
  20. server:
  21. port: 10086
  22. spring:
  23. profiles: eureka-server2
  24. eureka:
  25. instance:
  26. hostname: 192.168.8.16
  27. client:
  28. service-url:
  29. defaultZone: http://192.168.8.17:10086/eureka/,http://192.168.8.16:10086/eureka/

在启动微服务的时候,加入参数: spring.profiles.active 来读取对应的配置

2.2 其他微服务配置

  • 网关服务配置
      defaultZone: http://192.168.8.17:10086/eureka/,http://192.168.8.16:10086/eureka/ # Eureka访问地址

 

  • 权限管理配置
      defaultZone: http://192.168.8.17:10086/eureka,http://192.168.8.16:10086/eureka

 

  • 业务模块配置
      defaultZone: http://192.168.8.17:10086/eureka,http://192.168.8.16:10086/eureka

 

2.3 提交已修改的配置

 

 

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

3.1 安装Extended Choice Parameter插件

该插件可以支持多选框

 

3.2 创建流水线项目

 

 

3.3 配置项目参数

 

逗号必须得是英文,否则出错

tensquare_eureka_server@10086,tensquare_zuul@10020,tensquare_admin_service@9001,tensquare_gathering@9002

 

 

 

3.4 测试代码循环构建

  • 循环测试代码检查

 

 

 

 

 

  • 循环打包编译

  1. //添加公共子工程
  2. stage('make install public sub project') {
  3. sh "mvn -f tensquare_common clean install"
  4. }
  5. //编译打包微服务,制作镜像
  6. stage('make package') {
  7. for (int i=0;i<selectedProjectNames.length;i++){
  8. //项目名称tensquare_eureka_server@10086
  9. def projectInfo=selectedProjectNames[i]
  10. //当前项目名称
  11. def currentProjectName=projectInfo.split("@")[0]
  12. //当前端口
  13. def currentProjectPort=projectInfo.split("@")[1]
  14. sh "mvn -f ${currentProjectName} clean package dockerfile:build"
  15. //定义镜像名称
  16. def imageName="${currentProjectName}:${tag}"
  17. //对镜像打标签
  18. sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}"
  19. //镜像推送到harbor
  20. withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
  21. //登录harbor
  22. sh "docker login -u ${username} -p ${password} ${harbor_url}"
  23. //镜像上传
  24. sh "docker push ${harbor_url}/${harbor_name}/${imageName}"
  25. sh "echo 镜像上传成功"
  26. }
  27. }
  28. //部署应用
  29. sshPublisher(publishers: [sshPublisherDesc(configName: "master_server", transfers: [sshTransfer(cleanRemote: false, excludes: "", execCommand: "/opt/jenkins_shell/deploy.sh ${harbor_url} ${harbor_name} ${project_name} ${tag} ${port}", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: "[, ]+", remoteDirectory: "", remoteDirectorySDF: false, removePrefix: "", sourceFiles: "")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
  30. }
  31. }

 

 

 

  

 

四、完成微服务多服务器远程发布

4.1 配置远程部署服务器

从Jenkins服务器拷贝公钥到docker2远程服务器

ssh-copy-id 192.168.8.16

 

4.2 Jenkins中添加远程服务器

系统配置中添加远程服务器

4.3 修改Docker配置信任Harbor私服地址

  1. vim /etc/docker/daemon.json
  2. {
  3. "registry-mirrors": ["https://t466r8qg.mirror.aliyuncs.com"],
  4. "insecure-registries": ["192.168.8.20:85"]
  5. }
  6. systemctl restart docker

4.4 项目配置参数

添加构建参数——》多选框:部署服务器

 

 

 

4.5 修改Jenkinsfile构建脚本

  1. //定义gitlab的凭证
  2. def git_auth="03757112-b3bd-4955-93ef-ad84869f39a9"
  3. //定义gitlab的URL路径
  4. def git_url="git@192.168.8.18:gl/tensquare_back.git"
  5. //镜像标签
  6. def tag="latest"
  7. //harbor的url地址
  8. def harbor_url="192.168.8.20:85"
  9. //镜像仓库名
  10. def harbor_name="tensquare"
  11. //harbor凭证
  12. def harbor_auth="778a9460-c68d-4ab6-ab7f-f5113ec3a900"
  13. node {
  14. //选择的微服务项目名称
  15. def selectedProjectNames="${project_name}".split(",")
  16. //获取当前选择服务器
  17. def selectedServers="${publish_server}".split(",")
  18. stage('pull code') {
  19. checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
  20. }
  21. stage('check code') {
  22. //循环检查
  23. for (int i=0;i<selectedProjectNames.length;i++){
  24. //项目名称tensquare_eureka_server@10086
  25. def projectInfo=selectedProjectNames[i]
  26. //当前项目名称
  27. def currentProjectName=projectInfo.split("@")[0]
  28. //当前端口
  29. def currentProjectPort=projectInfo.split("@")[1]
  30. //定义SonarQubeScanner工具
  31. def scannerHome = tool 'sonar-scanner'
  32. //引用SonarQube系统环境
  33. withSonarQubeEnv('sonarqube') {
  34. sh """
  35. cd ${currentProjectName}
  36. ${scannerHome}/bin/sonar-scanner
  37. """
  38. }
  39. }
  40. }
  41. //添加公共子工程
  42. stage('make install public sub project') {
  43. sh "mvn -f tensquare_common clean install"
  44. }
  45. //编译打包微服务,制作镜像
  46. stage('make package') {
  47. for (int i=0;i<selectedProjectNames.length;i++){
  48. //项目名称tensquare_eureka_server@10086
  49. def projectInfo=selectedProjectNames[i]
  50. //当前项目名称
  51. def currentProjectName=projectInfo.split("@")[0]
  52. //当前端口
  53. def currentProjectPort=projectInfo.split("@")[1]
  54. sh "mvn -f ${currentProjectName} clean package dockerfile:build"
  55. //定义镜像名称
  56. def imageName="${currentProjectName}:${tag}"
  57. //对镜像打标签
  58. sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}"
  59. //镜像推送到harbor
  60. withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
  61. //登录harbor
  62. sh "docker login -u ${username} -p ${password} ${harbor_url}"
  63. //镜像上传
  64. sh "docker push ${harbor_url}/${harbor_name}/${imageName}"
  65. sh "echo 镜像上传成功"
  66. }
  67. //遍历所有服务器,分别部署
  68. for (int j=0;j<selectedServers.length;j++){
  69. //获取当前服务器名称
  70. def currentServerName=selectedServers[j]
  71. //调用不同服务器模块内容--spring.profiles.active=eureka-server1/eureka-server2
  72. def activeProfile="--spring.profiles.active="
  73. //根据不同的服务器名称调用不同的服务器配置信息
  74. if (currentServerName=="master_server"){
  75. activeProfile=activeProfile+"eureka-server1"
  76. }else if (currentServerName=="slave_server"){
  77. activeProfile=activeProfile+"eureka-server2"
  78. }
  79. //部署应用
  80. 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)])
  81. }
  82. }
  83. }
  84. }

推送上传gitlab

 

 

4.6 编写部署脚本

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

4.7 进行构建测试

可以看到构建成功

 

 

查看容器发布结果

 

查看eureka注册结果

4.8 构建剩下的集群微服务

 

 

 

 

 

 

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

 

5.1 web2-server服务器上安装nginx

  1. yum install epel-release.noarch -y
  2. yum install -y nginx

5.2 修改nginx配置文件

  1. vim /etc/nginx/nginx.conf
  2. #37行出添加反向代理服务器池,42行出修改端口号
  3. 36 include /etc/nginx/conf.d/*.conf;
  4. 37 upstream zuulServer{
  5. 38 server 192.168.8.16:10020 weight=1;
  6. 39 server 192.168.8.17:10020 weight=1;
  7. 40 }
  8. 41 server {
  9. 42 listen 85;
  10. 43 listen [::]:85;
  11. 44 server_name _;
  12. 45 root /usr/share/nginx/html;
  13. #49行出添加反向代理指向服务器池
  14. 48 include /etc/nginx/default.d/*.conf;
  15. 49 location / {
  16. 50 proxy_pass http://zuulServer/;
  17. 51 }

  1. nginx -t
  2. systemctl start nginx.service

 

 

5.3 修改前端Nginx的访问地址

 

 

 

 

 

 

5.4 Jenkins中进行前端项目构建

 

 

成功访问前端数据库中的数据

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/438720
推荐阅读
相关标签
  

闽ICP备14008679号