【Dubbo3终极特性】「流量治理体系」一文教你如何通过Dubbo-Admin实现动态进行流量隔离机制
背景信息
如果一个应用有多个版本在线上同时运行,部署在不同环境中,如日常环境和特殊环境,则
可以使用标签路由对不同环境中的不同版本进行流量隔离,将秒杀订单流量或不同渠道订单流量路由到特殊环境,将正常的流量路由到日常环境。即使特殊环境异常,本应进入特殊环境的流量也不会进入日常环境,不影响日常环境的使用。
启动运行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服务的日志
小伙伴们,你们学会了嘛?
【Dubbo3终极特性】「流量治理体系」一文教你如何通过Dubbo-Admin实现动态进行流量隔离机制的更多相关文章
- Istio流量治理原理之负载均衡
流量治理是一个非常宽泛的话题,例如: ● 动态修改服务间访问的负载均衡策略,比如根据某个请求特征做会话保持: ● 同一个服务有两个版本在线,将一部分流量切到某个版本上: ● 对服务进行保护,例如限制并 ...
- 流量染色与gRPC服务托管 微服务协作开发、灰度发布之流量染色 灰度发布与流量染色
大规模微服务场景下灰度发布与流量染色实践 https://mp.weixin.qq.com/s/UBoRKt3l91ffPagtjExmYw [go-micro]微服务协作开发.灰度发布之流量染色 - ...
- 面试都在问的「微服务」「RPC」「服务治理」「下一代微服务」一文带你彻底搞懂!
❝ 文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) ❞ 单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程 ...
- 「查缺补漏」巩固你的Redis知识体系
Windows Redis 安装 链接: https://pan.baidu.com/s/1MJnzX_qRuNXJI09euzkPGA 提取码: 2c6w 复制这段内容后打开百度网盘手机App,操作 ...
- 「每日一题」面试官问你对Promise的理解?可能是需要你能手动实现各个特性
关注「松宝写代码」,精选好文,每日一题 加入我们一起学习,day day up 作者:saucxs | songEagle 来源:原创 一.前言 2020.12.23日刚立的flag,每日一题,题目类 ...
- 「查缺补漏」巩固你的RocketMQ知识体系
Windows安装部署 下载 地址:[https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.5.2/rocketmq-all-4.5.2-bin- ...
- 「查缺补漏」巩固你的Nginx知识体系
Nginx篇 基本介绍 Nginx是一款轻量级的 Web服务器 / 反向代理服务器 / 电子邮件(IMAP/POP3)代理服务器,主要的优点是: 支持高并发连接,尤其是静态界面,官方测试Nginx能够 ...
- [转帖]「知乎知识库」— 5G
「知乎知识库」— 5G 甜草莓 https://zhuanlan.zhihu.com/p/55998832 通信 话题的优秀回答者 已关注 881 人赞同了该文章 谢 知识库 邀请~本文章是几个答 ...
- 「每日一题」有人上次在dy面试,面试官问我:vue数据绑定的实现原理。你说我该如何回答?
关注「松宝写代码」,精选好文,每日一题 时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 来源:原创 一.前言 文章首发在「松宝写代码」 2020. ...
- B 站崩了,总结下「高可用」和「异地多活」
你好,我是悟空. 一.背景 不用想象一种异常场景了,这就真实发生了:B 站晚上 11 点突然挂了,网站主页直接报 404. 手机 APP 端数据加载不出来. 23:30 分,B 站做了降级页面,将 4 ...
随机推荐
- .NET中的拦截器filter的使用
拦截器的使用 使用场景分析 我们先想像一个场景,就是程序员开发软件,他是怎么工作的呢?我们都知道,普通的程序员只需要根据需求文档开发相应的功能即可,他不用和客户谈论软件需求,不用理会软件卖多少钱,他要 ...
- 1.WEB应用模式
1. Web应用模式 在开发Web应用中,有两种应用模式: 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的.] 前后端分离[把前端的界面效果(html,css,js分离到另一个服务 ...
- 基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的处理
在做一些常规应用的时候,我们往往需要确定条件的内容,以便在后台进行区分的进行精确查询,在移动端,由于受限于屏幕界面的情况,一般会对多个指定的条件进行模糊的搜索,而这个搜索的处理,也是和前者强类型的条件 ...
- 禁止eslint对指定代码检测
有时候我们引入外部文件的API时,eslint无法识别,编译的时候就会出现warn eslint是可以禁用对指定代码的检测: 单行注释 let map = new BMap.Map('map') // ...
- 记一次线上频繁fullGc的排查解决过程
发生背景 最近上线的一个项目几乎全是查询业务,并且都是大表的慢查询,sql优化是做了一轮又一轮,前几天用户反馈页面加载过慢还时不时的会timeout,但是我们把对应的sql都优化一遍过后,前台响应还是 ...
- MAUI新生-XAML语法基础:语法入门Element&Property&Event&Command
一.XAML(MAUI的XAML)和HTML 两者相似,都是标签语言(也叫标记)组成的树形文档.每个标签元素,可视为一个对象,通过"键=值"形式的标签属性(Attribute),为 ...
- 2022春每日一题:Day 15
题目:Balanced lineup 题目说的很清楚了,没有修改,直接RMQ,模板题. 代码: #include <cstdio> #include <cstdlib> #in ...
- 少走点弯路:Wiki.js 通过 Generic OAuth2 进行身份验证
Wiki.js介绍 Wiki.js 是一个开源的百科全书系统,可以用来搭建自己的知识库.文档库等. 官网 | GitHub 后续内容中的Wiki.js会用Wiki代替. 本文环境:Wiki 2.5.2 ...
- Go语言核心36讲47
你好,我是郝林,今天我们继续分享使用os包中的API. 我们在上一篇文章中.从"os.File类型都实现了哪些io包中的接口"这一问题出发,介绍了一系列的相关内容.今天我们继续围绕 ...
- __init__、__all__
在python中 引用模块包的时候,要先进入此模块的__init__.py中畅游一遍,因此,我们多次需要一个语句的时候,就可以将这些语句写入到__init__.py中: 在使用*号的时候我们可以用__ ...