ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

微服务多服务器远程发布、反向代理优化

2022-03-07 06:00:17  阅读:166  来源: 互联网

标签:name harbor 192.168 url 反向 服务器 docker 远程


一、微服务多服务器远程发布

1、配置远程部署服务器

(1)从 Jenkins (192.168.10.20)服务器拷贝公钥到 docker2 (192.168.10.80)远程服务器

#Jenkins服务器上操作
ssh-copy-id 192.168.10.80 

#web2-server生产服务器上查看是否有.ssh
ls -a

 

(2)Manage Jenkins --> Configure System --> Publish over SSH --> 添加远程服务器(最底部)

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

(安装docker时已经配置过),配置完成后重启 Docker

3、添加参数

多选框:部署服务器

tensquare_back_cluster --> 配置 -->添加参数

最终效果

4、修改 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(",")
    //定义选择服务器
    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 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 镜像上传成功"
            }
        //遍历所有服务器,分别部署
        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)])
       }
      }
    }
}

代码上传、推送上传gitlab

5、编写 deployCluster.sh 部署脚本,放到2台生产服务器中

路径:/opt/jenkins_shell/deployCluster.sh

(1)新生产服务器 web2-server(192.168.10.80)上操作:

mkdir /opt/jenkins_shell

chmod +x *

web-server(192.168.10.70)上操作:

脚本内容如下:

#! /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 tom -p Abcd1234 $harbor_url

# 下载镜像
docker pull $imageName

# 启动容器
docker run -di -p $port:$port $imageName $profile

echo "容器启动成功"

6、构建 tensquare_back_cluster

构建成功

生产服务器 web2-server 上查看

7、Eureka网页上查看

分别登录到 http://192.168.10.70:10086/ 和 http://192.168.10.80:10086/

两台生产服务器集群都启动成功!!!

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

1、生产服务器web2-server上安装 Nginx

#安装 Nginx

yum install epel-release -y
yum install nginx -y

修改配置文件 vim /etc/nginx/nginx.conf

upstream zuulServer{
    server 192.168.10.70:10020 weight=1;
    server 192.168.10.80:10020 weight=1;
}

 listen       85;
 listen       [::]:85;


location / {
  proxy_pass http://zuulServer/;
}       

3、重启 Nginx

nginx -t     #检查语法
systemctl restart nginx

4、修改前端 Nginx 的访问地址

5、提交、推送

6、构建前端项目 tensquare_front

7、浏览器访问 192.168.10.70:9090

 

标签:name,harbor,192.168,url,反向,服务器,docker,远程
来源: https://www.cnblogs.com/darryallen/p/15974364.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有