前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大厂是如何做微服务架构的服务路由的?

大厂是如何做微服务架构的服务路由的?

作者头像
JavaEdge
发布于 2021-03-23 04:12:20
发布于 2021-03-23 04:12:20
1.3K00
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:0
代码可运行

负载均衡算法是为了解决服务消费者如何从众多可用服务节点中选取一个最合适的节点发起调用。

但在业务中经常还会遇到这样的场景,比如服务A部署在北京、上海、广州三个数据中心,所有的服务节点按照所在的数据中心被分成了三组,那么服务A的消费者在发起调用时,该如何选择呢?

这就是服务路由

什么是服务路由

服务消费者在发起服务调用时,必须根据特定规则选择服务节点,从而满足某些特定需求。

应用场景

分组调用

为了保证服务高可用,实现异地多活,一个服务往往不止部署在一个数据中心,而且出于节省成本等考虑,有些业务可能不仅在私有机房部署,还会采用公有云部署,甚至采用多家公有云部署。服务节点也会按照不同的数据中心分成不同的分组,这时对于服务消费者来说,选择哪一个分组调用,就必须有相应的路由规则。

灰度发布

在服务上线发布的过程中,一般需要先在一小部分规模的服务节点上先发布服务,然后验证功能是否正常。如果正常的话就继续扩大发布范围;如果不正常的话,就需要排查问题,解决问题后继续发布。

流量切换

在业务线上运行过程中,经常会遇到一些不可抗因素导致业务故障,比如

  • 某机房光缆被挖断
  • 着火等事故

导致整个机房的服务都不可用。这时就需要按照某个指令,能够把原来调用这个机房服务的流量切换到其他正常的机房。

读写分离

大多业务来说都是读多写少,服务部署时,可以把读写分开部署,所有写接口可以部署在一起,而读接口部署在另外节点。

服务路由规则

条件路由

基于条件表达式的路由规则,以下面的条件路由为例,我来给你详细讲解下它的用法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
condition://0.0.0.0/dubbo.test.interfaces.TestService?
	category=routers&dynamic=true&priority=2&enabled=true&rule=
	" + URL.encode(" host = 10.20.153.10=> host = 10.20.153.11")

condition:// 代表这是一段用条件表达式编写的路由规则,具体的规则是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
host = 10.20.153.10 => host = 10.20.153.11

=>前是服务消费者的匹配条件,后面是服务提供者的过滤条件: 当服务消费者节点满足匹配条件,就对该服务消费者执行后面的过滤规则。 这段表达式表达的意义就是IP为“10.20.153.10”的服务消费者都调用IP为“10.20.153.11”的服务提供者节点。

若服务消费者的匹配条件为空,就表示对所有的服务消费者应用,就像下面的表达式一样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
=> host != 10.20.153.11

若服务提供者的过滤条件为空,就表示禁止服务消费者访问:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
host = 10.20.153.10=>
具体应用场景
排除某服务节点
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
=> host != 172.22.3.91

一旦这条路由规则被应用到线上,所有的服务消费者都不会访问IP为172.22.3.91的服务节点,这种路由规则一般应用在线上流量排除预发布机以及摘除某个故障节点。

白名单
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
host != 10.20.153.10,10.20.153.11 =>

除了IP为10.20.153.10和10.20.153.11的服务消费者可以发起服务调用以外,其他服务消费者都不可以。 比如某个后台服务只允许特定的几台机器才可以访问,这样的话可以机器控制访问权限。

黑名单
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
host = 10.20.153.10,10.20.153.11 =>

除了IP为10.20.153.1010.20.153.11的服务消费者不能发起服务调用以外,其他服务消费者都可以。 比如线上经常会遇到某些调用方不管是出于有意还是无意的不合理调用,影响了服务的稳定性,这时候可以通过黑名单功能暂时予以封杀。

机房隔离
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
host = 172.22.3.* => host = 172.22.3.*

IP网段为172.22.3.*的服务消费者,才可以访问同网段的服务节点。 一般应用于服务部署在多个IDC,理论上同一个IDC内的调用性能要比跨IDC调用性能要好,应用这个规则是为了实现同IDC就近访问。

读写分离
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
method = find*,list*,get*,is* => host =172.22.3.94,172.22.3.95
method != find*,list*,get*,is* => host = 172.22.3.97,172.22.3.98

find*、get*、is*等读方法调用IP为172.22.3.94和172.22.3.95的节点,除此以外的写方法调用IP为172.22.3.97和172.22.3.98的节点。 大部分业务读请求远大于写请求,而写请求的重要性往往要远远高于读请求,所以需要把读写请求进行分离,以避免读请求异常影响到写请求。

脚本路由

基于脚本语言的路由规则,常用的脚本语言比如JavaScript、Groovy、JRuby等。 比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"script://0.0.0.0/com.foo.BarService?
	category=routers&dynamic=false&rule=" + 
	URL.encode("(function route(invokers) { ... } (invokers))")

script:// 代表了这是一段脚本语言编写的路由规则,具体规则定义在脚本语言的route方法实现。 比如下面这段用JavaScript编写的route()方法: 只有IP为10.20.153.10的服务消费者可以发起服务调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function route(invokers){
  var result = new java.util.ArrayList(invokers.size());
  for(i =0; i < invokers.size(); i ++){
    if("10.20.153.10".equals(invokers.get(i).getUrl().getHost())){ 
       result.add(invokers.get(i));
    } 
  }
  return result; 
 } (invokers);

服务消费者该如何获取路由规则呢?

获取服务路由

本地配置

路由规则存储在服务消费者本地上。服务消费者发起调用时,从本地固定位置读取路由规则,然后按照路由规则选取一个服务节点发起调用。

不排除某些服务消费者有特定的需求,需要定制自己的路由规则,这个时候就适合通过本地配置来定制。

配置中心管理

所有的服务消费者都从配置中心获取路由规则,由配置中心来统一管理。

服务路由最好是存储在配置中心中,由配置中心来统一管理。这样所有服务消费者就不需要在本地管理服务路由,因为大部分的服务消费者并不关心服务路由的问题,或者说也不需要去了解其中的细节。通过配置中心,统一给各个服务消费者下发统一的服务路由,节省了沟通和管理成本。

动态下发

一般是运维人员或者开发人员,通过服务治理平台修改路由规则,服务治理平台调用配置中心接口,把修改后的路由规则持久化到配置中心。因为服务消费者订阅了路由规则的变更,于是就会从配置中心获取最新的路由规则,按照最新的路由规则来执行。

动态下发可以理解为一种高级功能,它能够动态地修改路由规则,在某些业务场景下十分有用。比如某个数据中心存在问题,需要把调用这个数据中心的服务消费者都切换到其他数据中心,这时就可以通过动态下发的方式,向配置中心下发一条路由规则,将所有调用这个数据中心的请求都迁移到别的地方。

当然,这三种方式也可以一起使用,这个时候服务消费者的判断优先级是本地配置>动态下发>配置中心管理。

总结

服务路由简单说就是为了实现某些调用的特殊需求,比如分组调用、灰度发布、流量切换、读写分离等。在业务规模比较小的时候,可能所有的服务节点都部署在一起,也就不需要服务路由。但随着业务规模的扩大、服务节点增多,尤其是涉及多数据中心部署的情况,把服务节点按照数据中心进行分组,或者按照业务的核心程度进行分组,对提高服务的可用性是十分有用的。以微博业务为例,有的服务不仅进行了核心服务和非核心服务分组,还针对私有云和公有云所处的不同数据中心也进行了分组,这样的话就可以将服务之间的调用尽量都限定在同一个数据中心内部,最大限度避免跨数据中心的网络延迟、抖动等影响。

而服务路由具体是在本地配置,还是在配置中心统一管理,也是视具体业务需求而定的。如果没有定制化的需求,建议把路由规则都放到配置中心中统一存储管理。而动态下发路由规则对于服务治理十分有帮助,当数据中心出现故障的时候,可以实现动态切换流量,还可以摘除一些有故障的服务节点。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Dubbo服务治理之灰度发布方案(版本发布控制影响范围)
背景:基于Dubbo服务的治理,是否可以支持业务级别的灰度发布、是否基于业务参数的路由转发。例如以GIS为例,当发布一个新版本时,是否可以以按照解析地址或合作伙伴来区分,版本发布之初,只希望地址为:广东省的解析请求发送到新版本,而其他的地址请求还是使用旧版;或者根据合作伙伴例如UCP(优享寄)的请求转发到新版本服务器,其他合作伙伴还是转发到旧版,实现业务级别的灰度发布,控制新版本的影响范围。例如OMS系统,可以根据合作伙伴,将重量级客户的请求转发到单独的服务器集群,确保其高可用。 本文将对上述议题结合Dubbo提供的功能,提出设计方案。
丁威
2019/06/10
6K0
Dubbo服务治理之灰度发布方案(版本发布控制影响范围)
电商互联网如何做微服务治理(SOA governance)?
按Anne Thomas Manes的定义是:企业为了确保事情顺利完成而实施的过程,包括最佳实践、架构原则、治理规程、规律以及其他决定性的因素。服务治理指的是用来管理SOA的采用和实现的过程。
JavaEdge
2021/02/23
5030
虎牙直播在微服务改造方面的实践和总结
相比文字和图片,直播提供了人与人之间更丰富的沟通形式,其对平台稳定性的考验很大,那么倡导“以技术驱动娱乐”的虎牙直播(以下简称“虎牙”)是如何在技术上赋能娱乐,本文将为您介绍虎牙在DNS、服务注册、CMDB和服务配置中心等方面的实践。
程序猿DD
2019/03/08
1.3K0
虎牙直播在微服务改造方面的实践和总结
妹妹问我:Dubbo集群容错负载均衡
相信经过前面几篇之后,大家已经对 Dubbo 整体流程已经清晰了,包括服务是如何暴露的,服务是什么时候注册到注册中心的,以及服务是怎么引入的,服务整体的调用过程等等。
敖丙
2020/09/25
4480
妹妹问我:Dubbo集群容错负载均衡
从“挖光缆”到“剪网线”|蚂蚁金服异地多活的微服务体系
本文介绍了蚂蚁金服异地多活单元化架构的原理,以及微服务体系在此架构下的关键技术实现。
数据和云
2018/12/19
1.3K0
从“挖光缆”到“剪网线”|蚂蚁金服异地多活的微服务体系
初探微服务架构
之前介绍了什么时候进行服务化,以及服务化拆分的两种方式即横向拆分和纵向拆分,还提到了引入微服务架构需要解决的问题。
武培轩
2019/10/12
6180
初探微服务架构
Dubbo架构学习整理
随着互联网的发展和网站规模的扩大,系统架构也从单点的垂直结构往分布式服务架构演进,如下图所示:
butterfly100
2019/02/13
1.1K0
Dubbo架构学习整理
dubbo路由机制分析2(路由设置存储)
接上次 https://cloud.tencent.com/developer/article/1109552 目前dubbo支持的路由类型分三种conditon,script,file 这次说conditon路由规则的设置方法和存储方式 向注册中心写路由规则,dubbo目前提供两种方式, 1,通过api代码写路由规则 如下:以zookeeper为注册中心为例 RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(
技术蓝海
2018/04/26
1.6K0
dubbo路由机制分析2(路由设置存储)
Dubbo 源码分析 - 集群容错之 Router
上一篇文章分析了集群容错的第一部分 -- 服务目录 Directory。服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由。上一篇文章关于服务路由相关逻辑没有细致分析,一笔带过了,本篇文章将对此进行详细的分析。首先,先来介绍一下服务目录是什么。服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者。Dubbo 目前提供了三种服务路由实现,分别为条件路由 ConditionRouter、脚本路由 ScriptRouter 和标签路由 TagRouter。其中条件路由是我们最常使用的,标签路由暂未在我所分析的 2.6.4 版本中提供,该实现会在 2.7.0 版本中提供。本篇文章将分析条件路由相关源码,脚本路由和标签路由这里就不分析了。下面进入正题。
田小波
2018/11/21
4430
微服务架构下服务故障处理解决方案
微服务优势之一是可缩小故障影响范围,局限在某个服务中。那一个服务出现故障该如何处理?
JavaEdge
2021/02/23
6550
微服务架构组件分析
服务描述:服务调用首先解决的问题就是服务如何对外描述。 常用的服务描述方式包括 RESTful API、XML 配置以及 IDL 文件三种。
Java天坑
2018/10/21
8680
线上SpringCloud网关调用微服务跨机房了,咋整?
公司内考虑到服务器资源成本的问题,目前业务上还在进行服务的容器化改造和迁移,计划将容器化后的服务,以及一些中间件(MQ、DB、ES、Redis等)尽量都迁移到其他机房。
猿天地
2020/03/11
1.5K0
Dubbo:服务路由的实现
上一篇中,我们介绍了dubbo的负载均衡实现,见识了几种常用的负载均衡算法。就单个功能而言,似乎dubbo并没有太多的突出之处。事实上,一个成功的产品不必每个地方都要打破常规。更重要的是其全局优化的架构设计,以及如何使用现有的优秀解决方案为己服务。
烂猪皮
2022/12/16
9350
TSF微服务治理实战系列(二)——服务路由
导语 在服务实例数量和规模较大的业务场景下,服务路由是系统比较常见的诉求,比如针对业务属性的全链路灰度、测试环境多分支路由、多Region多AZ时的就近路由等。TSF基于标签化能力完成流量染色和标签自动传递,仅通过控制台配置即可实现服务路由、全链路灰度及就近路由功能,快速满足客户的业务分流诉求。服务路由从行为上讲,是将流量进行染色区分,并通过路由规则将流量进行分流,本节将对TSF整体服务路由相关能力进行详细介绍。 作者简介 崔凯                                       
腾讯云中间件团队
2022/08/26
1.4K0
TSF微服务治理实战系列(二)——服务路由
Dubbo中的常用组件
微服务的架构主要包括服务描述、服务发现、服务调用、服务监控、服务追踪以及服务治理这几个基本组件。
架构狂人
2023/08/16
2780
Dubbo中的常用组件
闲聊微服务之服务注册中心
服务,提供什么服务,有的叫服务中心,有的叫注册中心,有的叫服务注册中心,表达的都是同一个意思。
SRE运维实践
2019/07/08
2.1K0
闲聊微服务之服务注册中心
RPC框架的路由策略
真实环境的服务提供方以集群提供服务,对服务调用方,就是一个接口会有多个服务提供方同时提供服务,所以RPC每次发起请求时,要从多个服务提供方节点里选择一个用于发请求的节点。这次请求无论发送到集合中的哪个节点上,返回结果都一样。
JavaEdge
2023/02/26
1.2K0
RPC框架的路由策略
华为技术专家谈微服务分布式架构的服务配置管理
单体应用只需管理一套配置,而微服务架构后,每个系统都有自己的配置,并且各不相同,有些配置还需要能够动态改变,以动态降级、切流量、扩缩容,那微服务架构下,到底服务配置该如何管理。
JavaEdge
2021/10/18
7060
微服务架构下路由、多活、灰度、限流的探索与挑战
导语 2022腾讯全球数字生态大会已圆满落幕,大会以“数实创新、产业共进”为主题,聚焦数实融合,探索以全真互联的数字技术助力实体经济高质量发展。大会设有29个产品技术主题专场、18个行业主题专场和6个生态主题专场,各业务负责人与客户、合作伙伴共同总结经验、凝结共识,推动数实融合新发展。 今年6月,腾讯宣布内部海量自研业务实现全面上云,成为国内最大规模的云原生实践,累计节省IT成本超过30亿元,充分显示腾讯云的产品、技术和综合服务能力。 云原生技术在云计算 PaaS 的应用已经迈入深水区,腾讯云微服务和中间件
腾讯云中间件团队
2022/12/14
1.4K0
微服务架构下路由、多活、灰度、限流的探索与挑战
聊一聊微服务架构中的服务发现系统
导语:本文围绕服服务调用模式、一致性取舍、服务提供者的健康检查模式等方面,讨论了服务发现的技术选型和设计的各种优缺点,希望能够帮助大家在选择或者使用服务发现系统的时候更加顺畅。
腾讯云中间件团队
2021/03/24
8170
聊一聊微服务架构中的服务发现系统
推荐阅读
相关推荐
Dubbo服务治理之灰度发布方案(版本发布控制影响范围)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验