dubbo-go 中如何实现路由策略功能

可在控制面对服务的路由进行精细控制,是一个成熟 RPC 系统必备的能力之一。作为一个逐步走向成熟的 RPC 系统,Apache/dubbo-go(以下简称 dubbo-go )的最新版本 v1.4 中已经实现了 Condition Router 和 Health Instance First Router 等路由。

实现一个功能,首先要清楚其本质。那到底什么是路由规则,我们为什么需要路由规则?设想这么一个场景:现在要对某服务的新版本进行一次灰度发布,需要将一些对实验流量进行引流到灰度机器,其余流量依旧使用正常服务。此时就可以考虑使用路由策略达到目的。

路由规则( routing rule )是为了改变网络流量所经过的途径而修改路由信息的技术,通过改变路由属性(包括可达性)达到引流的目的。在发起一次 RPC 调用前,它会过滤目标服务器地址,将消费端最终发起 RPC 调用的目标范围限定在过滤后的地址列表。

目标

路由策略的关键点在于:

  1. 设定规则:用户可通过什么方式把路由规则传递给使用方;
  2. 解析规则:涉及到的路由规则的语法,以及对语法的解析。比如,要考虑规则是否支持逻辑运算;
  3. 规则匹配:如何判断一个服务实例是否匹配某条路由规则。

综上,可以总结出 dubbo-go 路由规则的目标有:

  • 支持从多个地方,如本地文件、远程配置中心,读取路由规则信息;
  • 设计一套定义路由规则的简单语法;
  • 保持与 Dubbo 的兼容,降低学习成本;

总体设计

首先要考虑的是:路由规则应该放在整个服务治理周期的哪个阶段呢?dubbo-go 的架构图如下:

dubbo-go-arch.png

可以看到图中的 Router 介于 Cluster 和 LB(load balance) 之间,这就意味着一个请求被发送到哪个服务器,是经过了 Cluster - Router - LB 三层处理的。可以将 Router 看做是一种较小范围的逻辑分组。

而在 Router 内部,将经历三个步骤:读取路由规则,解析路由规则,执行匹配。为了提高程序效率,路由规则的读取和解析都是可以提前完成的,比如在应用启动的时候。

image.png

根据上面图中流程,可清楚地明晰 Router 的路由流程。

接口设计

根据前面的目标和总体设计,我们很容易地设计出 Router 的接口。

路由规则接口

Router 是 dubbo-go 路由最核心的接口。它可以理解为,当一个请求(或者说一次调用)过来的时候,判断哪些实例是满足该规则的抽象。其实际代码定义如下:

router.png

其核心在于 Route 方法,执行匹配逻辑。目前该接口的实现有:

  • ListenableRouter
  • AppRouter
  • ConditionRouter
  • HealthCheckRouter
  • FileConditionRouter

在现实实现中,不同的不同的路由规则是有优先级的,即 Router 的另一个重要特性:Priority 。它决定了的是路由规则的组织方式。

路由规则链式接口

除了优先级,多个路由规则的执行是有顺序的。有路由规则的 Chain 接口如下:

router-chain.png

Chain 实现了对不同路由规则的组织。从命名也可以看出,它是责任链模式的一种应用,通过该接口可将路由规则组成一条链,链中每条规则的输出都是下一条规则的输入。至于整个链路中不同规则的顺序,取决于每个规则的 Priority ,它决定了每条路由规则的排序。

读取路由规则接口

读取路由规则对应 FileRouterFactory 和 RouterFactory 两个接口。一般地,只需要一个 RouterFactory 接口就可以,但考虑到路由规则的不同来源,比如规则可能是从配置文件里面读取过来,也可能是直接在服务的 URL 解析而来,所以我们抽象出来了两个接口:

FileRouterFactory

file-router-factory.png

RouterFactory

router-factory.png

我们一般将这两个接口对应本地和远程两种情况:

  • 本地路由规则配置:在原配置加载阶段,新增读取路由配置文件步骤。使用 FileRouterFactory 解析后,生成对应路由规则,然后加载到缓存中。
  • 远程路由规则配置:读取远程配置并且监听其变化,筛选符合路由规则配置信息,通过 RouterFactory 生成对应路由规则,同样加载到缓存中备用。

实现

router-design.png

从图里面可以看出,实现路由规则以兼容 dubbo 为首要目标,降低使用者的学习成本为辅助目标。与配置中心模块相结合,实现路由规则远程统一管理与下发。

规则类型

下面介绍一下 dubbo-go 现有的路由规则实现。

条件路由

Condition Router 作为 dubbo-go 中第一个支持的路由规则实现,允许用户通过配置文件及配置中心管理路由规则。与之相似的一个概念是 dubbo-go 的 group,但是条件路由提供了更加细粒度的控制手段和更加丰富的表达语义。比较典型的使用场景是黑白名单设置,灰度以及测试等。

健康检查路由

在 RPC 调用中,如果希望尽可能地将请求命中到那些处理能力快、处于健康状态的实例,即可以考虑该路由。该路由判定断定某个服务提供者的不健康度,优先调用那些健康的服务实例。对 "健康" 度的判定,dubbo-go 默认的实现策略是:某服务的错误比例到达某一个阈值或者请求活跃数大于上限,则认为其不健康,颇类似于服务熔断。dubbo-go 当然亦允许用户扩展其健康检测策略。

标签路由

以 Provider 为维度,将某一个或多个服务的提供者划分到同一个分组,约束流量只在指定分组中流转,从而实现流量隔离的目的,即为标签路由。它可以作为蓝绿发布、灰度发布等场景的能力基础。

  • 静态打标:根据配置文件所配置的标签,固定给 Provider 设置标签。
  • 动态打标:基于健康检查路由,根据服务不同时刻,不同状态,动态在 Provider 设置适合的标签。

示例

下面以条件路由在 zookeeper 实现为例,对服务提供者与服务消费者进行整体流程分析。

如何配置条件路由规则

可以直接通过 dubbo-admin进行配置:

dubbo-admin-1.png

这些配置可以分成全局配置和服务配置两类。

全局配置

对应应用级全局路由规则配置。例如:

/dubbo/config/dubbo/user-info-server(应用名).condition-router

上面 schema 配置中,应用名配置为为 user-info-server,即该条规则只对该应用生效。后缀 ".condition-router" 表明该条规则为条件路由。除此之外,还可用 ".tag-router" 表示标签路由。

服务配置

对应服务级所有路由规则配置。例如有如下规则 schema:

/dubbo/ com.ikurento.user.UserProvider(服务名) /routers

该规则中服务名为 com.ikurento.user.UserProvider。

除了在控制面板 Dubbo Admin 中下发路由规则外,还可以在本地文件中配置相应的规则。比如说在文件 router_config.yml 中配置:

# dubbo router yaml configure file
priority: 1
force: true
conditions : ["host = 1.1.1.1 => host = 192.168.199.214"]

更多配置方式请参考 条件路由配置。使用 dubbo-go 的路由功能时,注意以以下方式 引入对应的包

router-import.png

总结

dubbo-go 整体路由规则功能实现,已基本对齐 dubbo 2.7.x 版本,目前上文中描述过的条件路由、标签路由与健康检测路由,且支持本地及远端配置路由规则,能满足基本使用场景,但距离完善还有还长远的路。dubbo-go 未来路由功能计划如下:

  1. 更多的配置中心【如 etcd/consul 等】支持,理论上已经支持,但还没测试;
  2. service-router(未支持);
  3. 标签路由-配置中心(未支持);
  4. 目前路由与配置中心结合的代码,对新增路由规则并不友好,有一定接入成本。

本文对 dubbo-go 已有的路由功能进行了总结,至于源码级的分析,本文不作展开。欢迎大家持续关注 dubbo-go 项目【https://github.com/apache/dubbo-go】。

本文作者:
邹毅贤,Github ID @zouyx,开源爱好者,就职于 SheIn 供应链部门,负责供应链开放平台。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

独家对话谢宝友:做一款类似于 Linux 的国产操作系统 | 人物志

作者 | 郑丽媛来源 | CSDN(ID:CSDNnews)从国外操作系统的长期垄断到中国自主研发操作系统数十年的起落浮沉,技术自主创新独立已成为国产基础软件的主要突破口。近几年间,随着物联网时代的到来,以 Linux 为主…

RebatesMe:返利网站DDOS防护

公司介绍 上海途美网络科技有限公司旗下的RebatesMe海淘返利网是一家新兴的专注海淘和海淘返利信息的服务性网站。RebatesMe海淘返利网合作的美国商家接近1000家,包括eBay、亚马逊、沃尔玛、健安喜等等美国线上销售综合商品的商家,为全球用户提供高比例…

言图科技:GPU服务器选型

公司简介 言图科技总部位于武汉光谷,致力于人工智能领域的自然语言处理、图像处理基础算法、软件、平台与设备研发。目前,公司拥有成熟的自然语言处理基础软件集、语义理解工具集、知识图谱工具集、智能陪练机器人、聊天机器人、情感与专注度分析工具、…

H5 微信公众号 授权登录 前后端分离篇(前后端联调_03)

文章目录1. 获取code2. 返回报文解析3. 源码1. 获取code 前端请求微信获取code 回调信息 https://open.weixin.qq.com/connect/oauth2/authorize?appidwxd1f5b7f23b72428a&redirect_urihttp%3A%2F%2F192.168.43.122%3A80&response_typecode&scopesnsapi_userin…

集群e家:O2O电商服务平台上云

公司简介 陕西集群物联网服务管理股份有限公司旗下的“集群e家”是专注于社区商圈O2O服务的平台,为社区(乡村)家庭提供创新的家庭消费服务及消费体验。集群e家智慧生活是以社区(乡村)为中心,以“互联网”的…

大数据给教育带来怎样的可能?

来源 | 人民数字 Fintech责编 | 晋兆雨头图 | CSDN下载自视觉中国当下,数据成为教学改进最为显著的指标。学生的成绩不好是由于周围环境而分心了吗?期末考试不及格是学生请了太多病假的缘故吗?这些以往不太好回答的问题,如今通过大…

才博教育:AI口语学习平台上云

公司简介 北京才博教育科技有限公司自主开发了一套基于AI技术的口语学习工具,服务与英语教育机构。这套口语学习工具旨在于解决英语培训机构在传统英语教学中存在的会看、会写、不会说的问题,基于自主研发的AI人工智能技术,清晰的分辨学习者…

H5 微信公众号 授权登录 前后端分离篇(资料准备+前端01)

实现微信公众号授权登录,很简单,但是注意的地方要细心,小伙伴们跟着我的思路一起实现吧! 文章目录一、帐号申请1. 正式账号2. 测试帐号二、微信文档2.1. 文档主页2.2. 授权流程2.3. 授权回调三、前端部分3.1. 登录校验3.2. code获…

SQL分页查询方案的性能对比

作者 | 中国农业银行 吴海存责编 | 晋兆雨头图 | CSDN下载自视觉中国导读本文主要介绍了基于ROWNUM、主键列/非空唯一性列、分析函数、OFFSET-FETCH NEXT机制的几种SQL分页查询方案的性能对比。分页查询可分为逻辑分页和物理分页两种。逻辑分页是应用代码级别实现的分页&#x…

阿里云HBase增强版全文索引功能技术解析

新用户9.9元即可使用6个月云数据库HBase,更有低至1元包年的入门规格供广大HBase爱好者学习研究,更多内容请参考链接 阿里云HBase增强版(Lindorm)简介 阿里云数据库HBase增强版,是基于阿里集团内部使用的Lindorm产品研发的、完全兼容HBase的云…

ECMAScript 2015~2020 语法全解析

ECMAScript 2015~2020 语法全解析 ( ES6 ~ ES11 ).快速上手 > es.xiecheng.live

架构师技术文档:Redis+Nginx+Dubbo+Spring+架构师精选视频

最近花了很长的时间去搜罗整理Java核心技术好文,我把每个Java核心技术的优选文章都整理成了一个又一个的文档。今天就把这些东西分享给老铁们,也能为老铁们省去不少麻烦,想学什么技能了,遇到哪方面的问题了 直接打开文档学一学就好…

大分区表高并发性能提升100倍?阿里云 RDS PostgreSQL 12 解读

1. 问题 阿里云某客户发现自己使用读写分离实例,master的cpu特别高,而读写分离中承担读流量的slave节点却相对空闲。用户CPU打满后,访问到主节点的的线上服务受到了较大影响。 1.1 读写分离原理 Redis读写分离实例的原理是:key…

vue vant Area组件使用详解

文章目录1. 下载areaList.js2. 组件注册3. 封装组件4. 使用组件5. 效果图6. 项目源码1. 下载areaList.js 见文章末尾 2. 组件注册 main.js引入并注册(一般与Popup一起使用) 全局注册 //全局导入所有组件 import Vant from vant; import vant/lib/index.css;Vue.use(Vant)局…

微软KV Store Faster如何巧妙实现1.6亿ops

作者:叶提 Faster实现主要分为三部分: Epoch Protection框架,实现并发系统下全局修改,延迟同步到所有线程,简化并发设计。faster线程在大多时候不需要同步,完全独立执行。 支持高并发的无锁hash 索引&…

当飞猪遇上 Serverless | 云原生 Talk

来源 | 阿里巴巴中间件责编 | 晋兆雨头图 | CSDN付费下载于视觉中国前言2019 年 3 月,我们跟随着集团的步伐,将 Serverless FaaS 引入到飞猪,并取得了一定的阶段性成果:这一年,我们参与共建了 Node FaaS 研发平台和稳定…

vue ui 面板创建项目安装 axios 时,浏览器卡死的解决办法

目录 踩坑记1. 问题场景2. 解决办法踩坑记 Vue UI 可视化面板创建新项目,当安装完插件,再安装 axios 依赖时,点击 “ 安装 axios ” 按钮居然毫无响应,此时浏览器卡死、cmd 终端无法关闭,更杯具的是,CPU 占用率 100%,也无法关机或重启电脑 😂 。 1. 问题场景 2. 解决…

EdgeRoutine技术专家教你把JS代码跑到CDN边缘

4月27日CDN云课堂中,阿里云智能技术专家洪晓龙在线分享《阿里云CDN轻量编程环境》,对EdgeRoutine的背景、功能、案例实践介绍并在线进行上手操作演示,希望更多用户能够使用CDN轻量编程环境服务自主编程、快速落地实际线上业务。本文为直播分享…

使用手机企业微信创建自己的企业(公司)

文章目录1. 登录企业微信2. 管理企业3. 全新创建企业4. 补充信息5. 效果图1. 登录企业微信 登录手机企业微信,选择设置 2. 管理企业 3. 全新创建企业 4. 补充信息 补充信息全新创建 所在企业:自己给公司起一个名称 行业类型:随机一个或者…

淘宝万亿级海量交易订单存储在哪?

01淘宝交易订单系统介绍 天猫和淘宝每天发生的实物和虚拟商品的交易达到亿级别。考虑到一次成功交易的整个链路,会涉及到会员信息验证,商品库信息查询,订单创建,库存扣减,优惠扣减,订单支付,物…