zoukankan      html  css  js  c++  java
  • Jenkins部署微服务集群

     

    修改所有微服务配置
    注册中心配置(*)

    server:
      port: 10086
    spring:
      application:
        name: eureka
      # 指定profile=eureka-server1
      #  profiles: eureka-server1
    eureka:
      instance:
        # 指定当profile=eureka-server1时,主机名是eureka-server1
        hostname: 192.168.66.103
      client:
        service-url:
         # 将自己注册到eureka-server1、eureka-server2这个Eureka上面去
          defaultZone: http://192.168.66.103:10086/eureka/   #,http://192.168.66.104:10086/eureka/
        register-with-eureka: false
        fetch-registry: false
    
    #---
    #server:
    #  port: 10086
    #spring:
    #  profiles: eureka-server2
    #eureka:
    #  instance:
    #    hostname: 192.168.66.104
    #  client:
    #    service-url:
    #      defaultZone: http://192.168.66.103:10086/eureka/,http://192.168.66.104:10086/eureka/

    在启动微服务的时候,加入参数 : spring.profiles.active 来读取对应的配置
    其他微服务配置
    除了Eureka注册中心以外,其他微服务配置都需要加入所有Eureka服务

    # Eureka配置
    eureka:
    client:
     service-url: 
      defaultZone:
    http://192.168.66.103:10086/eureka,http://192.168.66.104:10086/eureka # Eureka访
    问地址
    instance:
     prefer-ip-address: true
    

    把代码提交到Gitlab中
    设计Jenkins集群项目的构建参数
    1)安装Extended Choice Parameter插件
    支持多选框

     2)创建流水线项目

    3 )添加参数
    字符串参数:分支名称

     多选框:项目名称

     

     最后效果:

     完成微服务构建镜像,上传私服

    //git凭证ID
    def git_auth = "f14f1eec-8ba5-44af-a5e1-9714364b256e"
    //git的url地址
    def git_url = "http://192.168.1.120:88/dalianpai_group/tensquare_back_ha.git"
    //镜像的版本号
    def tag = "latest"
    //Harbor的url地址
    def harbor_url = "192.168.1.120:8001"
    //镜像库项目名称
    def harbor_project = "tensquare"
    //Harbor的登录凭证ID
    def harbor_auth = "a45cb8c3-49f5-4394-976b-1d5d9825ca5f"
    
    node {
       //获取当前选择的项目名称
       def selectedProjectNames = "${project_name}".split(",")
       //获取当前选择的服务器名称
       def selectedServers = "${publish_server}".split(",")
    
       stage('拉取代码') {
          checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
       }
       stage('代码审查') {
            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]
    
                //定义当前Jenkins的SonarQubeScanner工具
                def scannerHome = tool 'sonarQube-scanner'
                //引用当前JenkinsSonarQube环境
                withSonarQubeEnv('sonarQube6.7.4') {
                       sh """
                               cd ${currentProjectName}
                               ${scannerHome}/bin/sonar-scanner
                       """
                }
            }
    
    
       }
       stage('编译,安装公共子工程') {
          sh "mvn -f tensquare_common clean install"
       }
       stage('编译,打包微服务工程,上传镜像') {
           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_project}/${imageName}"
    
                     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_project}/${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="
    
                           //根据不同的服务名称来读取不同的Eureka配置信息
                           if(currentServerName=="121"){
                              activeProfile = activeProfile+"eureka-server1"
                           }else if(currentServerName=="118"){
                              activeProfile = activeProfile+"eureka-server2"
                           }
    
                           //部署应用
                           sshPublisher(publishers: [sshPublisherDesc(configName: "${currentServerName}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deployCluster.sh $harbor_url $harbor_project $currentProjectName $tag $currentProjectPort $activeProfile", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                    }
    
            }
       }
    }
    

    完成微服务多服务器远程发布
    1)配置远程部署服务器
    拷贝公钥到远程服务器
    ssh-copy-id 192.168.1.121
    系统配置 ->添加远程服务器

     

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

    [root@k8s-master ~]# cat /etc/docker/daemon.json
    {
    "registry-mirrors": ["https://lara9y80.mirror.aliyuncs.com"],
    "insecure-registries":[
        "192.168.1.120:8001"
      ]
    }
    [root@k8s-master ~]#
    

    3)编写deployCluster.sh部署脚本 

    [root@servcie01 jenkins_shell]# cat 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 eric -p Eric123456 $harbor_url
    
    # 下载镜像
    docker pull $imageName
    
    # 启动容器
    docker run -di -p $port:$port $imageName $profile
    
    echo "容器启动成功"
    [root@servcie01 jenkins_shell]#
    

    集群效果
    Nginx+Zuul集群实现高可用网关

     

    3 )重启Nginx: systemctl restart nginx
    4)修改前端Nginx的访问地址

    流水线

    node {
        stage('拉取代码'){
            checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '979cf306-0c46-4ccd-ab6b-8f4f0c7e03da', url: 'git@192.168.1.120:dalianpai_group/tensquare_font.git']]])
        }
        stage('打包,部署网站'){
            nodejs('121NodeJs') {
               sh '''
                   npm i
                   npm run build 
                  '''
           }
           
           sshPublisher(publishers: [sshPublisherDesc(configName: '121', 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)])
        }
        
    }

     所有服务结果

     

  • 相关阅读:
    8皇后问题
    求1到n,n个整数的全排列
    求最小周期串
    如何用java完成一个中文词频统计程序
    蛇形矩阵
    第一个算法程序
    java 继承练习题8
    java 继承练习题7
    java 继承练习题6
    java 继承练习题5
  • 原文地址:https://www.cnblogs.com/dalianpai/p/13040753.html
Copyright © 2011-2022 走看看