用SSH隧道,解决SpringBoot开发-生产配置文件的切换问题
公司部署在云上的一个项目,先看看系统的逻辑架构图
1、突发事件
其中一台云服务器192.168.1.13要撤掉,上边跑的服务要切到192.168.1.12(懂的同学看破不说破)。这一下把运维小姑娘惹毛了。系统里面微服务太多了,他们之间还互相feign,程序这一块她不用操心,可是配置文件整天改来改去,烦不烦啊。
程序员Tommy这边也凑热闹,我们这也乱啊,微服务12345678,八个微服务所有的jar包都得重新打包上传,晚上我还约了女朋友去现场看电子竞技比赛呢,都是架构大哥搞得,当初咋定的啊,烦死了。
架构师老李:我特么。。。。。。
运维大妹子来一句:这么简单的业务,图搞得还挺复杂,架构师大哥思想真有问题。
老李:。。。。。。
唯一的好消息是,jar包构建时,把配置信息都移到jar包外边的config目录下了(参见另一篇文章),这样向云端上传jar包就省了,只在新服务器上部署nacos、Redis和TabbitMQ,然后把nginx、SpringCloud、8个微服务的配置文件改一遍,重启服务基本就OK了。Tommy一听,下班打车跑了,运维小姑娘直接在机房摔了键盘。
2、繁忙的第二天
Tommy昨天直播看得不错,乐呵呵的上班了。 运维大妹子那边放话出来今天上午在家补觉,谁叫都不上班,誓死不进机房。
开发组后台有4个兄弟,原来大家是这么分的活:
- 小孙 192.168.1.21 负责开发微服务网关和微服务1、2
- Tommy 192.168.1.22 负责微服务3、4
- 大壮 192.168.1.23 负责微服务5、6、7
- 小美 192.168.1.24 负责微服务8,还有公共机器192.168.1.29安装的mysql、nacos、redis、RabbitMQ等一大堆服务。
可是今天情况有点特殊,就Tommy一个人在公司,其他几位都在甲方测试,需要中午才能回来。四台开发机器都归Tommy一个人用,各个服务位于不同IP和端口,看个服务调试信息还得换工位,一会累半死。
3、架构大哥帮忙
架构老李路过,来一句,要不你这样吧,把代码配置文件里bootstrap.properties所有的服务的IP都设成localhost,这样你回家也能干,没网照样调。嗯......
项目配置文件改IP工作量也挺大,好在有文件搜索,把项目svn下的所有bootstrap-dev.properties找出来就行。半小时改完。tommy来一句:坏了,把mysql和redis的地址也改了,还得一个一个重新改回192.168.1.29,否则程序起不来!
李大哥:索性做个SSH隧道吧,这样你回家也能干,没网照样调。
Tommy: 还有别的话不!啥是隧道?
李大哥:隧道长这样
用命令来实现的话,这样:
ssh -CNgv -L 3306:192.168.0.218:3306 root@119.3.138.180 -o ServerAliveInterval=30
Tommy:180这个IP看着眼熟, 貌似这是连到咱们云端的吧?
老李:没错,隧道连好后,咱们localhost:3306就等于云端局域网的192.168.0.218:3306,前提是咱们得有root@119.3.138.180的SSH账号和密码
Tommy: 119.3.138.180是咱们云端的服务器公网地址,这个我知道。它的内网IP不是192.168.0.63吗?咱们机器<==>119.3.138.180==192.168.0.63<==>192.168.0.218,是这个意思吧?
老李:对,这样它才能做通。
Tommy:有点像VPN啊,对了,公司让用VPN不?让我们在云端放个VPN服务多好?
老李:据说公司不让开VPN,怕你们瞎搞,不小心把云端环境给踹了。
Tommy:我们哥几个水平不至于吧? 那么,隧道能把loclahost的端口连到咱们局域网的这几台开发机的端口不?不然调试怎么搞啊?
老李:
ssh -CNgv –L 3306:192.168.1.29:3306 root@localhost -o ServerAliveInterval=30
Tommy:这也行?
老李: 这样192.168.1.19:3306上的mysql服务,你就可以用localhost:3306来访问了。
Tommy:Redis呢?
老李:ssh -CNgv –L 6379:192.168.1.29:6379 root@localhost -o ServerAliveInterval=30
Tommy:Nacos呢?
老李:ssh -CNgv –L 8848:192.168.1.29:8848 root@localhost -o ServerAliveInterval=30
Tommy:RabbitMQ一定是: ssh -CNgv –L 5672:192.168.1.29:5672 root@localhost -o ServerAliveInterval=30
老李:对
Tommy:咱们SpringCloudGate呢
老李:隧道这玩意,只认IP:PORT,并不在乎目标怎么实现的
Tommy:ssh -CNgv –L 801:192.168.1.21:801 root@localhost -o ServerAliveInterval=30
老李:没错。
Tommy一顿操作,全成功了。开了一堆窗口?
老李:其实可以这样:
ssh -CNgv -L 3306:192.168.1.29:3306 -L 5672:192.168.1.29:5672 -L 6379:192.168.1.29:6379 -L 801:192.168.1.21:801 root@localhost -o ServerAliveInterval=30
Tommy:这个好。这下所有的IP都是localhost,倒省心了。
老李:你可以把这个命令行做成sh,分享给同组小伙伴,最好放到svn里的某个固定位置,这样他们在调试自己程序时,不用操心调用的服务在哪个服务器上。
Tommy:唯一不好的是,不同机器上的服务,要是端口重叠了,就不好同时在localhost做映射了。
老李:的确是这样。隧道还有一个好处,你随时把mysq、nacos等服务的端口l映射目标改到云端,在本地调试程序时采用云端的真实业务数据,不过要谨慎。
Tommy:嗯。在家也能调试程序,也能调用所有云端服务。
老李:你懂了。有一点,nacos这个玩意比较特殊,因为有自动服务注册,所以在调试程序时,最好不要对着云端的nacos做隧道,否则云端Nacos莫名其妙多出来的服务实例,会分流一部分客户请求,影响线上服务的质量。
Tommy:好。对了,这隧道当网关貌似也行啊?
老李:最好别这么搞,吞吐效率差一点。开发时还能忍,生产环境就不行了。
Tommy:收到。