说明
在生产环境中,一般都会每个服务部署多个实例。只要多于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:应用强迫路由旁边件
用中间件支撑强迫将请求转发到指定的实例。
不停服更新的流程
- 将user2设置为强迫路由
- 更新user1
- user1启动结束后,撤消user2的强迫路由,将user1设置为强迫路由
- 更新user2
- 撤消user1的强迫路由