背景信息
如果一个应用有多个版本在线上同时运行,部署在不同环境中,如日常环境和特殊环境,则
可以使用标签路由对不同环境中的不同版本进行流量隔离,将秒杀订单流量或不同渠道订单流量路由到特殊环境,将正常的流量路由到日常环境。即使特殊环境异常,本应进入特殊环境的流量也不会进入日常环境,不影响日常环境的使用。
启动运行Dubbo-Admin
在运行之前,我们需要保障进行运行对应的Dubbo-Admin服务,可以参考 【Dubbo3终极特性】「流量治理体系」一文教你如何搭建Dubbo3的控制台服务Dubbo-Admin,进行搭建和运行启动Dubbo-Admin服务。
因为dubbo-admin-server会将dubbo-admin-ui打包为资源文件,所以启动dubbo-admin-server就可直接访问页面了
我们在这里可以直接下载clone源码
git clone https://github.com/apache/dubbo-admin.git
直接可以下载到IDE中
- dubbo-admin-distribution:主要用于操作安装和打包使用的项目组件
- dubbo-admin-server:dubbo-admin服务的后台服务springboot类型的项目
- dubbo-admin-test:dubbo-admin服务的测试服务
- dubbo-admin-ui:dubbo-admin的ui服务,主要会显示前端的ui页面。
通过源码打包运行
- 在
dubbo-admin-server/src/main/resources/application.properties
中指定注册中心地址 - 构建
mvn clean package -Dmaven.test.skip=true
- 启动
mvn --projects dubbo-admin-server spring-boot:run
或者cd dubbo-admin-distribution/target; java -jar dubbo-admin-${project.version}.jar
- 访问
http://localhost:38080
可以直接再IDE的md文件中进行允许编译对应的dubbo-admin的代码以及运行服务。
Dubbo-Admin 动态进行流量隔离
Dubbo提供动态流量隔离的服务治理能力,可以在无需重启应用的情况下,动态进行流量隔离。Dubbo可以通过XML配置,注解配置,动态配置实现流量隔离,这里主要介绍动态配置的方式。
允许多个Provider端服务
你可以直接进行运行服务进行运行多个实例。如下所示。
当然也可以通过VM参数进行调整为不同的dubbo.protocol.port,方便我们进行路由转发机制。
标签路由规则
将服务提供者进行分组,约束流量只在指定分组中流转,从而实现流量隔离的目的,有两种方式可以完成实例分组,分别是动态规则打标和静态规则打标
2.1 动态规则相较于静态规则优先级更高
标签路由
登录Dubbo-Admin控制台
用户名为root,密码为root。
在左侧导航栏选择服务治理 > 标签路由。
点击创建按钮,在创建新标签规则面板中,填写规则内容,然后单击保存。
配置模板
---
force: false
runtime: true
enabled: true
key: application-provider
tags:
- name: tag1
addresses: ["127.0.0.1:20880"]
- name: tag2
addresses: ["127.0.0.1:20881"]
...
对于流量隔离场景,只需要理清楚以下问题基本就知道配置该怎么写了:
修改服务所属提供者应用的配置。
应用:scope: application, key: app-name(还可使用services指定某几个服务)。
当路由结果为空,是否强制返回。
- force=false: 当路由结果为空,降级请求tag为空的提供者。
- force=true: 当路由结果为空,直接返回异常。
路由规则的优先级
priority=1: 路由规则的优先级,用于排序,优先级越大越靠前执行,可不填,缺省为 0。
配置是否只对某几个特定实例生效。
所有实例:addresses: ["0.0.0.0"] 或addresses: ["0.0.0.0:*"] 具体由side值决定。
指定实例:addersses[实例地址列表]。
运行服务提供者
可以从dubbo-admin中看到对应的服务已经注册上来了
开发服务消费者
RpcContext.getContext().setAttachment("dubbo.tag",name);
切换不同的tag参数,即可完成流量转发:tag1 tag2
我们通过name参数进行切换标签
请求 GET http://127.0.0.1:8082/add?name=tag1&age=12
我们可以看到打印了对应provider1服务的日志
请求 GET http://127.0.0.1:8082/add?name=tag2&age=12
我们可以看到打印了对应provider2服务的日志