之前的文章讲了优雅下线公布稳定性-优雅下线,明天讲优雅上线
优雅上线也叫:「无损上线」,「提早公布」,「提早裸露」。与之对抗的天然是:「有损上线」,「间接公布」
什么是优雅上线
先说说什么状况不是优雅上线
- 利用启动时,Service还没加载完,零碎就开始对外提供服务,导致失败调用。
- 利用启动时,没有查看零碎衰弱状态,导致失败调用
这些状况都会影响到用户,即不优雅的上线。
对于任何一个线上利用来说,公布、扩容、缩容、重启等操作不可避免,这时候服务不可用,就必须把流量弄走,比方分批公布时,放到别的机器上。等到利用恢复正常后,再把流量弄回来,让利用持续提供服务,这就是优雅上线。
无论是HTTP利用还是RPC利用,在公布上线时,优雅上线逻辑都是一样的,如下图,服务公布过程中不可用,进行摘流。待到服务公布实现,重新分配流量
Dubbo的优雅上线
Dubbo的优雅上线有2种形式:提早公布 和 Qos命令
1.提早公布
即提早裸露Dubbo服务,比方你的服务须要一些初始化操作后能力对外提供服务,如初始化缓存,redis连接池等相干资源就位,能够应用 delay 进行提早裸露。 Dubbo 2.6.5 之后的版本中所有的Dubbo服务都会在Spring初始化实现后进行裸露,可自行配置提早裸露的工夫,配置如下:
Dubbo官网文档的提早裸露:提早裸露
# 提早裸露5sdubbo.provider.delay=5000
源码剖析
Dubbo实现了Spring的ApplicationListener
接口,监听ContextRefreshedEvent
事件,即在Spring容器启动结束后再开始裸露服务,源码剖析如下:
ServiceBean:
//监听ContextRefreshedEvent事件,再执行export裸露服务 @Override public void onApplicationEvent(ContextRefreshedEvent event) { if (!isExported() && !isUnexported()) { if (logger.isInfoEnabled()) { logger.info("The service ready on spring started. service: " + getInterface()); } export(); } }
ServiceConfig类:
//裸露Service public synchronized void export() { checkAndUpdateSubConfigs(); if (!shouldExport()) { return; } //判断是否配置了提早公布工夫,如有,则单起一个线程,期待相应工夫后再执行doExport办法 if (shouldDelay()) { DELAY_EXPORT_EXECUTOR.schedule(this::doExport, getDelay(), TimeUnit.MILLISECONDS); } else { doExport(); } } private boolean shouldExport() { Boolean export = getExport(); // default value is true return export == null ? true : export; } @Override public Boolean getExport() { return (export == null && provider != null) ? provider.getExport() : export; } //判断是否须要提早裸露 private boolean shouldDelay() { Integer delay = getDelay(); return delay != null && delay > 0; } //获取配置的提早裸露工夫 @Override public Integer getDelay() { return (delay == null && provider != null) ? provider.getDelay() : delay; }
2. QOS命令上线
Dubbo官网文档QOS命令操作手册:QOS操作手册
配置以下,启动时不向注册核心公布服务
# 提早裸露5sdubbo.provider.delay=5000# provider服务启动后不注册到注册核心#dubbo.registry.register=false#dubbo.registry.default=falsedubbo.provider.register=falsedubbo.application.qos-port=22223dubbo.application.qos-enable=truedubbo.application.qos-accept-foreign-ip-compatible=true
这里配置的时候遇到个问题:
按网上的办法配置dubbo.registry.register=false
就能让服务不公布到注册核心,然而Qos命令也用不了了。按我下面的配置,Qos还是可用的啊
因为此时服务未公布,就不会有申请过去。咱们能够在服务健康检查完之后在手动公布Service,可通过telnet命令或是http申请形式online
HTTP形式公布所有服务
curl localhost:22223/online
过程如下图
最佳实际
本文介绍了两种 Dubbo 优雅上线的办法:
- 提早公布(delay=5000)
- 不公布 + QOS 指令公布(register=false)
在理论的企业应用中,须要联合具体场景应用。大型利用Service较多时,通常可用QOS命令分层公布Service,即每次公布肯定数量的接口,而不是一次全发。
总结:服务公布的稳定性已讲了优雅高低线,然而理论工作中不是做好这两样就行了,具体情况须要具体分析,下篇文章持续讲稳定性的内容:流量预热。