使用jenkins一次性全模块更新重部署有先后依赖关系的微服务


今天主要来说下又依赖关系的微服务通过jenkins全模块发布的问题,因为其他模块都依赖配置中心。
一、modules情况

<modules>
    <!-- 公共dto、vo、常量 -->
    <module>fsihouse-data</module>
    <!-- eureka注册中心 -->
    <module>fsihouse-cloud-eureka</module>
    <!-- 配置中心 -->
    <module>fsihouse-cloud-config</module>
    <!-- gateway网关 -->
    <module>fsihouse-cloud-gateway</module>
    <!-- 通用服务 -->
    <module>fsihouse-common-service</module>
    <!-- 通用web -->
    <module>fsihouse-common-web</module>
    <!-- 用户服务 -->
    <module>fsihouse-user-service</module>
    <!-- 基础web -->
    <module>fsihouse-cust-web</module>
    <!-- 第三方服务接口 -->
    <module>fsihouse-third-web</module>
    <!-- 第三方服务 -->
    <module>fsihouse-third-service</module>
    <!-- 设备服务 -->
    <module>fsihouse-device-service</module>
    <!-- 设备web -->
    <module>fsihouse-device-web</module>
    <!-- openApi -->
    <module>fsihouse-cloud-openapi</module>
    <!-- 自动任务接口 -->
    <module>fsihouse-schedule-web</module>
    <!-- 自动任务服务 -->
    <module>fsihouse-schedule-service</module>
    <!--&lt;!&ndash; 缓存注解服务 &ndash;&gt;
    <module>fsihouse-cache-annotation</module>
    &lt;!&ndash; zipkin链路服务 &ndash;&gt;
    <module>fsihouse-sleuth-zipkin</module>-->

</modules>

说明:data是一个公用模块,里面放的实体类、vo、dto、工具类常量类等公用资源
这里是springCloud原生生态的微服务,注册中心用的eureka,配置中心用的是本地文件配置(非git版),其他模块均依赖配置中心的配置。所以这里的编译顺序就是:data–>eureka–>config,其他模块就随意了,但是启动顺序必须是eureka注册中心先启动,然后启动config配置中心并成功注册,其他模块才能通过注册中心里的配置中心服务启动。
二、jenkins配置
1、这个不用多说,跟正常的maven项目一样,编译顺序都不用管,由项目的module顺序保证。
2、关键设置:编译后步骤,因为我们的测试服务器是windows,所以使用的编译后步骤是windows batch command,有2个:
a、复制jenkins工作空间编译好的jar到指定位置、同时备份:
配置如下:
在这里插入图片描述
operate.bat详细内容:

if exist C:\Project\MP\PC\fsihouse-cloud-config\fsihouse-cloud-config-1.0-SNAPSHOT.jar
del /s /Q C:\Project\MP\PCbeifen\fsihouse-cust-web
xcopy C:\Project\MP\PC\fsihouse-cust-web\fsihouse-cust-web-1.0-SNAPSHOT.jar C:\Project\MP\PCbeifen\fsihouse-cust-web
del C:\Project\MP\PC\fsihouse-cust-web\fsihouse-cust-web-1.0-SNAPSHOT.jar
xcopy C:\Users\fillersmart\.jenkins\workspace\fsihouse-v1\fsihouse-cloud-config\target\fsihouse-cloud-config-1.0-SNAPSHOT.jar C:\Project\MP\PC\fsihouse-cloud-config /d /e /y

这里只写一个模块的命令,多个模块,重复这个结构。
解释:
1、先判断部署目录的当前运行jar是否存在,存在就删除备份目录,
2、复制当前运行jar到备份目录,
3、再删除当前运行jar
5、复制jenkins工作空间对应的jar到部署目录
b、停止与启动命令

详细密令脚本

set BUILD_ID=dontKillMe

@echo off
echo 结束所有java进程 
start taskkill /f /im start javaw.exe
echo 'close all start javaw project'
##为了保险起见等待进程3s关闭结束
ping 127.0.0.1 -n 10

echo 启动eureka
start javaw -jar C:\Project\MP\PC\fsihouse-cloud-eureka\fsihouse-cloud-eureka-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "8801"

echo 启动配置中心
start javaw -jar C:\Project\MP\PC\fsihouse-cloud-config\fsihouse-cloud-config-1.0-SNAPSHOT.jar
ping 127.0.0.1 -n 60
netstat -aon|findstr "8802"

echo 启动网关
start javaw -jar C:\Project\MP\PC\fsihouse-cloud-gateway\fsihouse-cloud-gateway-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "8800"

echo 启动openapi
start javaw -jar C:\Project\MP\PC\fsihouse-cloud-openapi\fsihouse-cloud-openapi-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "9005"

echo 启动通用服务
start javaw -jar C:\Project\MP\PC\fsihouse-common-service\fsihouse-common-service-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "8804"

echo 启动设备服务
start javaw -jar C:\Project\MP\PC\fsihouse-device-service\fsihouse-device-service-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "8806"

echo 启动任务调度服务
start javaw -jar C:\Project\MP\PC\fsihouse-schedule-service\fsihouse-schedule-service-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "8808"

echo 启动第三方服务
start javaw -jar C:\Project\MP\PC\fsihouse-third-service\fsihouse-third-service-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "8809"

echo 启动用户服务
start javaw -jar C:\Project\MP\PC\fsihouse-user-service\fsihouse-user-service-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "8805"

echo 启动通用接口
start javaw -jar C:\Project\MP\PC\fsihouse-common-web\fsihouse-common-web-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "9001"

echo 启动用户接口
start javaw -jar C:\Project\MP\PC\fsihouse-cust-web\fsihouse-cust-web-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "9002"

echo 启动设备接口
start javaw -jar C:\Project\MP\PC\fsihouse-device-web\fsihouse-device-web-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "9004"

echo 启动第三方接口
start javaw -jar C:\Project\MP\PC\fsihouse-third-web\fsihouse-third-web-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "8809"

echo 启动任务调度接口
start javaw -jar C:\Project\MP\PC\fsihouse-schedule-web\fsihouse-schedule-web-0.0.1-SNAPSHOT.jar
ping 127.0.0.1 -n 30
netstat -aon|findstr "9007"

exit

注意:
1、必须以set BUILD_ID=dontKillMe开头exit结尾,否则,jenkins执行完脚本后回杀掉进程,那么你的服务就是执行脚本过程中可用,jenkins的编译控制台最后出现Finished: SUCCESS,此时就是你的服务的死期。
2、前面说过有依赖关系,业务模块启动必须要在eureka注册中心、config配置中心启动成功,切注册到注册中心,后面的业务模块才可以启动。
所以,这里每个模块启动后追加一个指定次数ping用来延时,然后再追加一个netstat校验模块端口命令,通过这个命令的结果可以确定对应模块是否启动。

三、扩展处理jenkins编译控制台输出乱码
首先再环境变量增加JAVA_TOOL_OPTIONS,值为-Dfile.encoding=utf-8
然后jenkins的conf里的server.xml的设置端口的节点<Connector port="8080"里增加useBodyEncodingForURI=“true”,如下:

<Connector port="8080" protocol="HTTP/1.1" useBodyEncodingForURI="true"
               connectionTimeout="20000"
               redirectPort="8443" />

四、总结
到此,有依赖关系的微服务就能正常的一次性全模块更新重部署了,这里其实还有优化的空间,大家可以自行扩展。个人认为可优化的扩展点:
1、2个命令其实可以合起来,备份、删除、复制、启动一气呵成
2、使用ping延时+netstat命令验证模块是否启动的逻辑可以优化,不写死ping次数,比如判断netstat命令的返回结果,如果无返回就继续ping延时,有返回后执行下一个模块的判断延时启动…
希望能够帮助到大家。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页