被骂了
废话不多,不提面试那一套,我们今天简单说说。
众所周知,Java
应用不像PHP
/ASP
/JavaScript
等解释性语言一样,不会直接改动代码后代码文件即可自动更新。
然而,当我兴高采烈修完一个我凭本事写的BUG
准备神不知鬼不觉
的发布到开发服务器
让前端的好兄弟发现不了我刚才那有BUG的接口
前端的好兄弟脸一沉。。。
”这已经是今天上班到现在第38
次 502
了!“
啊这。。。草率了,后端服务还没起来。
Nginx会因为连不上后端负载而炸掉
场面逐渐失控
算了笔帐,每次重启服务粗略花掉2分钟,
38次,也就是38*2=72分钟。。。
难怪前端的哥们又出去抽烟了,
好家伙,我直接好家伙。
想到老夫改Nginx,百度复制粘贴一把梭。
那就改造下Nginx负载吧
我们来实现Java服务重启过程中
让前端好兄弟们无感知
说简单点,叫开发阶段的API接口服务高可用
本质上还是下面的
负载均衡与灾备策略
伟大且牛逼的伊戈尔·塞索耶夫
在修BUG的时候手一抖
写出了Nginx
(谁在叫我?)
作为反向代理圈子里的小老弟
实现负载均衡可谓是不在话下
于是尝试在开发服务器上主服务的基础下
再起一个除了端口不同
其他一毛一样的服务
我且称之为”备胎服务“
那么 两个服务这会同时在跑了
http://127.0.0.1:8080 主服务
http://127.0.0.1:9090 备胎服务
接下来,我们改动下之前的Nginx服务配置:
改造前
server{
listen 80;
#***其他配置***
location /api {
proxy_pass http://127.0.0.1:8080;#主服务
#***其他配置***
}
}
改造后
upstream api_service{
server 127.0.0.1:8080; #主服务
server 127.0.0.1:9090 backup; #备胎服务 backup 指定只作为其他服务炸掉后的备胎
}
server{
listen 80;
#***其他配置***
location /api {
proxy_pass http://api_service; #指定上面定义的上游负载名称
#***其他配置***
}
}
好家伙,直接重载nginx服务
接下来 kill掉主服务并重启
再次访问api
好家伙,我直接好家伙,
前端的好兄弟应该不知道我重启了吧?
丝滑,Nice!
接下来,我就可以在修复BUG之后
在前端好兄弟神不知鬼不觉之中重启服务
当然,交替重启主服务和备胎服务,保证两个环境代码差异到最低也是很重要的。
第二天
前端好兄弟端来了一杯卡布奇诺。
本文首次发布于
2022-01-18 00:34:00
在自己的公众号上,公众号已经没动态了,目前已基于k8s
实现了DevOps
,本文仅在这里做个分享。