《Apache Dubbo微服务开发从入门到精通》——迁移到 Dubbo3——二、 迁移到应用级服务发现(5) https://developer.aliyun.com/article/1223585
3. 升级中用到的规则详解
1) 状态模型
在Dubbo 3之前地址注册模型是以接口级粒度注册到注册中心的,而Dubbo 3全新的应用级注册模型注册到注册中心的粒度是应用级的。从注册中心的实现上来说是几乎不一样的,这导致了对于从接口级注册模型获取到的invokers是无法与从应用级注册模型获取到的invokers进行合并的。为了帮助用户从接口级往应用级迁移,Dubbo 3设计了Migration机制,基于三个状态的切换实现实际调用中地址模型的切换。
当前共存在三种状态,FORCE_INTERFACE(强制接口级),APPLICATION_FIRST(应用级优先)、FORCE_APPLICATION(强制应用级)。
FORCE_INTERFACE:只启用兼容模式下接口级服务发现的注册中心逻辑,调用流量100%走原有流程。
APPLICATION_FIRST:开启接口级、应用级双订阅,运行时根据阈值和灰度流量比例动态决定调用流量走向。
FORCE_APPLICATION:只启用新模式下应用级服务发现的注册中心逻辑,调用流量 100% 走应用级订阅的地址。
2) 规则体说明
规则采用yaml格式配置,具体配置下参考如下:
• Key:消费者应用名
• Step:状态名(FORCE_INTERFACE、APPLICATION_FIRST、FORCE_APPLICATION)
• Threshold:决策阈值(浮点数,具体含义参考后文)
• Proportion:灰度比例(0~100,决定调用次数比例)
• Delay:延迟决策时间(延迟决策的时间,实际等待时间为1~2倍delay时间,取决于注册中心第一次通知的时间,对于目前Dubbo的注册中心实现次配置项保留0即可)
• Force:强制切换(对于FORCE_INTERFACE、FORCE_APPLICATION是否不考虑决策直接切换,可能导致无地址调用失败问题)
• Interfaces:接口粒度配置
参考配置示例如下:
3) 配置方式说明
a) 配置中心配置文件下发(推荐)
• Key:消费者应用名+“.migration”
• Group:DUBBO_SERVICEDISCOVERY_MIGRATION
配置项内容参考上一节。
程序启动时会拉取此配置作为最高优先级启动项,当配置项为启动项时不执行检查操作,直接按状态信息达到终态。
程序运行过程中收到新配置项将执行迁移操作,过程中根据配置信息进行检查,如果检查失败将回滚为迁移前状态。迁移是按接口粒度执行的,也即是如果一个应用有10个接口,其中8个迁移成功,2个失败,那终态8个迁移成功的接口将执行新的行为,2个失败的仍为旧状态。如果需要重新触发迁移可以通过重新下发规则达到。
注:
如果程序在迁移时由于检查失败回滚了,由于程序无回写配置项行为,所以如果此时程序重启了,那么程序会直接按照新的行为不检查直接初始化。
b) 启动参数配置
• 配置项名:dubbo.application.service-discovery.migration
• 允许值范围:FORCE_INTERFACE、APPLICATION_FIRST、FORCE_APPLICATION
此配置项可以通过环境变量或者配置中心传入,启动时优先级比配置文件低,也即是当配置中心的配置文件不存在时读取此配置项作为启动状态。
c) 本地文件配置
配置文件中格式与前文提到的规则一致。
本地文件配置方式本质上是一个延时配置通知的方式,本地文件不会影响默认启动方式,当达到延时时间后触发推送一条内容和本地文件一致的通知。这里的延时时间与规则体中的delay字段无关联。
本地文件配置方式可以保证启动以默认行为初始化,当达到延时时触发迁移操作,执行对应的检查,避免启动时就以终态方式启动。
《Apache Dubbo微服务开发从入门到精通》——迁移到 Dubbo3——二、 迁移到应用级服务发现(7) https://developer.aliyun.com/article/1223581