说一说用Jenkins部署微服务踩过的坑

  • 前言
  • 实践
  • 总结


前言

先说背景。原本项目的UAT环境和PRD环境分别部署在4台机器上,还未做集群。现在莫名其妙的需求来了,要在UAT的4台服务器上,再部署一套SIT环境。抱怨一句,这个需求一看就是不懂技术的人提的,在稳定UAT的环境上,在新增一套环境,先不考虑复杂的配置以及内存是否足够,先说风险,万一部署出问题了,破坏了原本稳定的UAT的环境那真是得不偿失。在提出新增服务器被拒绝后,我只能开始想办法在不影响UAT环境的情况下,部署一套新的SIT环境。然而,我只是一个开发,不是运维也不是资产管理,那咋办呢?一个字,学!现成的UAT环境就是我的学习资料。

实践

我先研究的是项目的结构与配置。项目的大体结构如下

微服务故障分析图 微服务遇到的坑_端口号


请求由nginx代理,统一转发到网关,再由网关进行分配。这里我学到了一种新的nginx配置方法,可以在http定义一个全局变量

微服务故障分析图 微服务遇到的坑_端口号_02


然后在进行转发的时候,统一使用。需要修改的时候,只需要修改全局变量即可。

微服务故障分析图 微服务遇到的坑_微服务_03


我的想法是,在网关的服务器上,nginx新增一个监听端口,然后转发到网关,再由网关进行分配。不考虑映射的情况下,入口由原来的4个服务器的IP端口号加一个域名变成了网关服务器的IP端口号。这样的话,对nginx配置的修改,只需要修改网关这个服务器的配置即可,变动是最小的。在这里踩到了一个坑。

微服务故障分析图 微服务遇到的坑_服务器_04


由于一开始没有充分了解nginx的参数含义,导致监听的新端口,请求转发到的还是UAT的网关,在项目跑起来后才发现了这个问题。于是定义了新的全局变量,并做了相对应的修改。

微服务故障分析图 微服务遇到的坑_服务器_05


微服务故障分析图 微服务遇到的坑_微服务故障分析图_06


这样才算是把请求都转发到了新的网关上。接下来要考虑的是新环境的配置,由于项目用的是springCloud config,读取的是数据库指定表的配置,但是由于项目中提供的导入配置文件转化成SQL自动插入的数据库的功能用不了,我只能先从数据库的数据入手。第一步,复制出一份UAT的配置,第二步,把环境变量UAT改成SIT,第三步,导入之前复制的UAT配置,这里要注意取消表的主键限制,不然会导致ID相同,数据无法导入。然后就是修改对应的端口号和eureka注册地址,以及redis的地址和密码等等。关于配置,有一点要强调下,算是一个神坑。微服务里有一项关于eureka的设置,把IP注册到eureka上,之前在本地跑的时候,不加也行,我就没明白,这个配置到底有什么意义。

eureka.instance.prefer-ip-address=true 在新环境中,访问非网关这台机器上的微服务时,会出现"远程服务调用异常"的提示,于是我去看了对应微服务的日志,发现没有日志输出,说明请求还没到对应的微服务就挂了,那问题就出在了网关上,来看下网关的日志输出。

微服务故障分析图 微服务遇到的坑_微服务故障分析图_07


Name or serive not know

于是去看下eureka的注册列表,对应的微服务确实有注册上去啊,为啥网关在eureka上找不到这个微服务呢?当我把鼠标移到eureka列表上,左下角出现的不是ip端口号,我就大概知道问题出现在哪了,然后我把这个配置加上,网关就能在eureka上成功拿到对应的微服务了。

一开始我本来想在相同的服务器上部署两套相同的微服务,但是我看了一下启动的脚本,发现有杀死微服务名对应线程的命令

微服务故障分析图 微服务遇到的坑_微服务_08


所以哪怕是UAT和SIT的JAR放在不同的目录,也会导致新起的微服务杀死另外一套环境对应的微服务线程,所以当A服务器上有UAT的B微服务时,就不能把SIT的B微服务也部署在A服务器上,因此这里我用的是交叉部署。当然脚本不是我写的,我只是拿了UAT的脚本来改,不会写,但是稍微理解一下,改一改还是很容易。首先要改的是取jar包的目录,其次是启动参数里面的内存分配和环境变量。这里又踩了一个坑。设置了启动的环境变量,还会去读bootstrap吗?实践出真知。会读,毕竟还需要读取URL去访问配置中心,但是生效的环境变量,也就是spring.profiles.active,是以启动参数为准,而不是bootstrap文件里面的配置。接下来看下jenkins的配置。

微服务故障分析图 微服务遇到的坑_服务器_09


在系统配置里,远程目录的路径是写好了,新的环境JAR包要放在新的目录下,所以这里需要自己新增一下配置,修改下对应的远程目录路径,尽量使用root权限,否则在jenkins将JAR包传送到服务器对应目录的时候可能会出现权限问题。

微服务故障分析图 微服务遇到的坑_微服务_10

然后就是新建job,复制原来的任务进行修改。提取代码的位置需要改

微服务故障分析图 微服务遇到的坑_端口号_11


通过SSH协议传输JAR包的服务器要改,构建后执行的脚本以及日志的输出要改。

微服务故障分析图 微服务遇到的坑_服务器_12

总结

拿到需求,先动脑再动手。遇到问题不要慌,越难解决的问题越是小问题。能解决的问题都不是问题。最后分享一下如何实现读取配置文件转换成SQL进行转存