原文网址:SpringBoot项目--如何不停服更新应用?_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍Java后端项目如何不停机更新服务。
在生产环境中,一般都会每个服务部署多个实例。只要多于1个实例,就可以不停服更新应用。
不停服更新应用的作用
- 有需要紧急修复的bug时,不会影响用户使用。
- 可以做到随时上线,不需要等到晚上没有用户在用时才更新服务(可以减少无意义的加班😉)。
需求
本文假设解决此问题:微服务user有两个实例:user1和user2,需要在保证user服务不中断的情况下更新user服务。
方案1:使用Nacos的权重功能
说明
Nacos可以配置实例的权重,如果权重改为0,则不会调到这个实例。
不停服更新应用的流程
- 将user1的权重设置为0
- 更新user1
- user1启动完毕后,恢复user1的权重为1,将user2的权重设置为0
- 更新user2
- 恢复user2的权重为1
注意
修改完之后,所有网关的请求都会转发到权重不为0的实例上边,但feign请求还是会到达权重为0的实例上边。
解决方法:需要修改feign的负载均衡器(ribbon或者loadbalancer),将其改为从Nacos获得实例,根据权重选择实例。
方案2:使用强制路由中间件
说明
此中间件支持强制将请求转发到指定的实例。见:router4j · 语雀
不停服更新应用的流程
- 将user2设置为强制路由
- 更新user1
- user1启动完毕后,取消user2的强制路由,将user1设置为强制路由
- 更新user2
- 取消user1的强制路由