《Apache Dubbo微服务开发从入门到精通》——基于规则的流量治理—— 一、 Dubbo流量治理体系概览(1) https://developer.aliyun.com/article/1224385
2. 路由规则分类
1) 标签路由规则
标签路由通过将某一个服务的实例划分到不同的分组,约束具有特定标签的流量只能在指定分组中流转,不同分组为不同的流量场景服务,从而实现流量隔离的目的。标签路由可以作为蓝绿发布、灰度发布等场景能力的基础。
标签路由规则是一个非此即彼的流量隔离方案,也就是匹配标签的请求会100%转发到有相同标签的实例,没有匹配标签的请求会100%转发到其余未匹配的实例。如果您需要按比例的流量调度方案,请参考示例Dubbo官网示例任务中的【基于权重的按比例流量路由】。
标签主要是指对Provider端应用实例的分组,目前有两种方式可以完成实例分组,分别是动态规则打标和静态规则打标。动态规则打标可以在运行时动态的圈住一组机器实例,而静态规则打标则需要实例重启后才能生效,其中,动态规则相较于静态规则优先级更高,而当两种规则同时存在且出现冲突时,将以动态规则为准。
标签规则示例—静态打标
静态打标需要在服务提供者实例启动前确定,并且必须通过特定的参数tag指定。
• Provider
在Dubbo实例启动前,指定当前实例的标签,如部署在杭州区域的实例,指定tag=gray。
or
or
• Consumer
发起调用的一方,在每次请求前通过tag设置流量标签,确保流量被调度到带有同样标签的服务提供方。
标签规则示例—动态打标
相比于静态打标只能通过tag属性设置,且在启动阶段就已经固定下来,动态标签可以匹配任意多个属性,根据指定的匹配条件将Provider实例动态的划分到不同的流量分组中。
• Provider
以下规则对shop-detail应用进行了动态归组,匹配env:gray的实例被划分到gray分组,其余不匹配env:gray继续留在默认分组(无tag)。
注:这里牵涉到如何给您的实例打各种原始label的问题,即上面示例中的env,一种方式是直接写在配置文件中,如上面静态规则实例provider部分的配置所示,另一种方式是通过预设环境变量指定,关于这点请参考下文的如何给实例打标一节。
• Consumer
服务发起方的设置方式和之前静态打标规则保持一致,只需要在每次请求前通过tag设置流量标签,确保流量被调度到带有同样标签的服务提供方。
设置了以上标签的流量,将全部导流到hangzhou-region划分的实例上。
注:
请求标签的作用域仅为一次点对点的RPC请求。比如,在一个A->B->C调用链路上,如果A->B调用通过setAttachment设置了tag参数,则该参数不会在B->C的调用中生效,同样的,在完成了A->B->C的整个调用同时A收到调用结果后,如果想要相同的tag参数,则在发起其他调用前仍需要单独设置setAttachment。可以参考Dubbo官网中的【示例任务】-【环境隔离】了解更多tag全链路传递解决方案。