前言
优雅停机和优雅上线两者都是微服务生命周期中,开发者必须关心的环节。
优雅上线还有很多称呼:「无损上线」,「延迟发布」,「延迟暴露」。它们的对立面自然是:「有损上线」,「直接发布」。
我最近写的「一文聊透 Dubbo xx」系列文章,都有一个特点,即当你不注重文章中实践,你的 Dubbo 应用依旧可以正常运行,但总归在某些场景 case 下,你的系统会出现问题。做不到优雅上线,你的系统将会出现:在应用刚启动时,就有流量进入,而此时应用尚未初始化完毕,导致调用失败,在集群规模较大时,影响会变得很明显。
方案一:延迟发布
以 SpingBoot 下使用 Dubbo 为例,被 Dubbo 的 @Service 注解修饰的服务,会按照 Spring 中初始化 Bean 的顺序,串行执行发布逻辑。Dubbo 框架会完成一系列的操作:
- 创建远程调用的 Proxy
- 把代理对象注册到 ProviderConsumerRegTable,方便远程调用到来时寻找到对应的服务
- 向注册中心注册
一旦服务信息注册到注册中心,在消费者看来该服务就是可以被调用的。然而,此时可能出现一些数据库、缓存资源尚未加载完毕的场景,这取决于你的系统有没有对应的组件,它们何时加载完毕,也完全取决于你的业务。如果你担心你的系统存在这种隐患,可以尝试多次重启集群中的任意一台机器,查看调用方是否存在报错,如果有报错,一种可能性是没有实现优雅停机,一种可能性是没有实现优雅上线。
Dubbo