部署其他微服务,部署前端静态 web 网站,,Jenkins+Docker+SpringCloud 部署方案优化

一、部署其他微服务

1、地址修改

(1)注册中心eureka服务配置指定生产服务器地址

(2)服务网关配置指定生产服务器地址

(3)认证中心配置,数据库使用Jenkins中的数据库

(4)活动微服务配置

2、修改完成后把整个项目进行提交

2、数据库脚本导入Jenkins服务器中的MySQL

mysql> create database tensquare_user;
mysql> use tensquare_user;
mysql> source /opt/tensquare_user.sql;

mysql> create database tensquare_gathering;
mysql> use tensquare_gathering;
mysql> source /opt/tensquare_gathering.sql;

------------------------授权远程登录-------------------------------------
grant all privileges on *.* to 'root'@'%' identified by 'abc123' with grant option;
mysql> flush privileges;
quit

3、准备完毕,直接部署所有微服务

4、生产服务器中容器列表

4、使用 postman 测试后台数据连接

(1)post方式

(2)get 方式

到此,后端连接数据库没问题了

二、微服务持续集成——部署前端静态 web 网站

1、生产服务器 web-server(192.168.10.70)安装 Nginx

//安装Nginx
yum install epel-release 
yum -y install nginx 

//修改nginx的端口,默认80,改为9090:
vim /etc/nginx/nginx.conf

 38     server {
 39         listen       9090;
 40         listen       [::]:9090;
 41         server_name  _;
 42         root         /usr/share/nginx/html;

//还需要关闭selinux,将SELINUX=disabled 
setenforce 0 先临时关闭
vim /etc/selinux/config 编辑文件,永久关闭 SELINUX=disabled


//启动Nginx
systemctl enable nginx 设置开机启动
systemctl start nginx 启动
systemctl stop nginx 停止
systemctl restart nginx 重启

访问:http://192.168.10.70:9090/

2、安装NodeJS插件

3、Jenkins配置Nginx服务器

Manage Jenkins-->Global Tool Configuration--> 新增NodeJS

4、创建前端流水线项目

新建 item

脚本先粘贴到流水线脚本里

红色部分需要做修改(2处)

//harbor的凭证
def  git_auth="015f1ee4-73cf-4d51-95b0-2954fc32aadb"

node {
    stage('pull code') {
        //切换成变量,字符串符号使用双引号
        checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: 'git@192.168.10.10:xxx_group/tensquare_front.git']]])
    }

    stage('make package,deploy') {
            //使用nodejs的npm打包
            nodejs('nodejs12'){
                sh '''
                    npm install
                    npm run build
                '''
            }
            //远程部署
            sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/usr/share/nginx/html', remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    }
}

5、修改网关地址,提交并推送

6、构建前端项目

安装nodejs等待时间较长

构建成功

7、生产服务器验证查看/usr/share/nginx/html根目录

网站成功部署!!

三、Jenkins+Docker+SpringCloud 部署方案优化

上面部署方案存在的问题:

  1. 一次只能选择一个微服务部署
  2. 只有一台生产者部署服务器
  3. 每个微服务只有一个实例,容错率低

优化方案:

  1. 在一个Jenkins工程中可以选择多个微服务同时发布
  2. 在一个Jenkins工程中可以选择多台生产服务器同时部署
  3. 每个微服务都是以集群高可用形式部署

Jenkins+Docker+SpringCloud 集群部署流程说明

服务列表(红色的软件为需要安装的软件,黑色代表已经安装)

服务器名称 IP地址 安装的软件
代码托管服务器 192.168.10.10 Gitlab
持续集成服务器 192.168.10.20 Jenkins,Maven,Docker18.06.1-ce
Docker仓库服务器 192.168.10.60 Docker18.06.1-ce,docker-compose,Harbor1.9.2
生产部署服务器1 192.168.10.70 Docker18.06.1-ce
生产部署服务器2 192.168.10.80 Docker18.06.1-ce

重新启动一台生产部署服务器2(安装部署docker环境)

//安装必要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2

//设置下载的镜像仓库
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce

systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0

systemctl start docker
docker -v
sudo systemctl enable docker

//添加阿里云镜像下载地址
镜像加速器:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://31ycpc34.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

vim /etc/sysctl.conf
net.ipv4.ip_forward=1  #添加进去

sysctl -p                    #立即生效

service network restart  
systemctl restart docker



vim /etc/docker/daemon.json   #指向harbor仓库地址

{
  "registry-mirrors": ["https://31ycpc34.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.10.60:85"]    
}

systemctl restart docker

1、修改所有服务配置

(1)注册中心Eureka 配置

单机版删除,集群版粘贴进去

注意红色字体部分(修改成两台生产服务的地址)

# 集群版
spring:
  application:
    name: EUREKA-HA


---
server:
  port: 10086
spring:
  # 指定profile=eureka-server1
  profiles: eureka-server1
eureka:
  instance:
    # 指定当profile=eureka-server1时,主机名是eureka-server1
    hostname: 192.168.10.70
  client:
    service-url:
      # 将自己注册到eureka-server1、eureka-server2这个Eureka上面去
      defaultZone: http://192.168.10.70:10086/eureka/,http://192.168.10.80:10086/eureka/

---
server:
  port: 10086
spring:
  profiles: eureka-server2
eureka:
  instance:
    hostname: 192.168.10.80
  client:
    service-url:
      defaultZone: http://192.168.10.70:10086/eureka/,http://192.168.10.80:10086/eureka/

(2)服务网关 zuul 配置

修改红色字体部分

server:
  port: 10020 # 端口
  
# 基本服务信息
spring:
  application:
    name: tensquare-zuul # 服务ID
    
# Eureka配置
eureka:
  client:
    service-url:  
      defaultZone: http://192.168.10.70:10086/eureka/,http://192.168.10.80:10086/eureka/ # Eureka访问地址
  instance:
    prefer-ip-address: true
  
# 修改ribbon的超时时间
ribbon:
  ConnectTimeout: 1500 # 连接超时时间,默认500ms
  ReadTimeout: 3000  # 请求超时时间,默认1000ms
  
  
# 修改hystrix的熔断超时时间
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMillisecond: 2000 # 熔断超时时长,默认1000ms
            

# 网关路由配置
zuul:
  routes:
    admin:
      path: /admin/**
      serviceId: tensquare-admin-service
    gathering:
          path: /gathering/**
          serviceId: tensquare-gathering

 # jwt参数
jwt:
  config:
    key: itcast
    ttl: 1800000

(3)认证中心 admin_service 配置

server:
  port: 9000
spring:
  application:
    name: tensquare-admin-service #指定服务名
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.10.20:3306/tensquare_user?characterEncoding=UTF8
    username: root
    password: abc123
  jpa:
    database: mysql
    show-sql: true

#Eureka配置
eureka:
  client:
    service-url:
      defaultZone: http://192.168.10.70:10086/eureka/,http://192.168.10.80:10086/eureka/
  instance:
    lease-renewal-interval-in-seconds: 5 # 每隔5秒发送一次心跳
    lease-expiration-duration-in-seconds: 10 # 10秒不发送就过期
    prefer-ip-address: true


  # jwt参数
jwt:
  config:
    key: itcast
    ttl: 1800000

(4)活动微服务 gathering

server: 
  port: 9002
spring: 
  application:  
    name: tensquare-gathering #指定服务名
  datasource:  
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.10.20:3306/tensquare_gathering?characterEncoding=UTF8
    username: root
    password: abc123
  jpa: 
    database: mysql
    show-sql: true
#Eureka客户端配置
eureka:
  client:
    service-url:
      defaultZone: http://192.168.10.70:10086/eureka/,http://192.168.10.80:10086/eureka/
  instance:
    lease-renewal-interval-in-seconds: 5 # 每隔5秒发送一次心跳
    lease-expiration-duration-in-seconds: 10 # 10秒不发送就过期
    prefer-ip-address: true

(5)提交到 gitlab

提交整个项目

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

(1)安装 Extended Choice Parameter 插件支持多选框

(2)创建流水线项目

新建 item --> tensquare_back_cluster --> Pipeline

把后端 tensquare_back 的 URL(SSH)复制粘贴到下面

(3)添加参数

字符串参数:分支名称

多选框:项目名称

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

注册中心,服务网关,权限认证中心,活动微服务

3、Jenkinsfile——检查代码循环构建、循环打包编译制作镜像

//git的凭证
def git_auth="015f1ee4-73cf-4d51-95b0-2954fc32aadb"
//git的URL
def git_url="git@192.168.10.10:xxx_group/tensquare_back.git"
//定义镜像标签
def tag="latest"
//定义harbor的url地址
def harbor_url="192.168.10.60:85"
//定义镜像仓库名
def harbor_name="tensquare"
//定义harbor的凭证
def harbor_auth="8f55a28e-3be2-463d-b988-34f93063fdf2"

node {
    //选择当前微服务项目名称
    def selectedProjectNames="${project_name}".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 package images') {
            sh  "mvn -f tensquare_common clean install"
    }
    //打包微服务项目,制作镜像,上传镜像
    stage('make server') {
        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 镜像上传成功"
            }
        }
     //业务部署
     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)])

    }
}

4、上传到 gitlab

5、构建 tensquare_back_cluster

最后构建肯定失败的,因为还没有做集群发布。主要是测试能否实现循环代码检查、  循环打包编译制作镜像。

代码检查

 

循环打包编译制作镜像

 

posted @ 2022-03-07 02:49  DoYouWantMore  阅读(221)  评论(0编辑  收藏  举报