流量治理基础

简介: 如果要了解微服务流量是如何治理的,那么我们需要先了解微服务的流量是如何调用的,在这之前我们必须先熟悉一些基础的知识。本文将借助于我们常见的微服务开发框架Spring Cloud与Apache Dubbo来介绍微服务的服务注册与发现模型、服务路由模型以及负载均衡。当我们了解并熟悉了这些能力之后,我们可...

如果要了解微服务流量是如何治理的,那么我们需要先了解微服务的流量是如何调用的,在这之前我们必须先熟悉一些基础的知识。本文将借助于我们常见的微服务开发框架Spring Cloud与Apache Dubbo来介绍微服务的服务注册与发现模型、服务路由模型以及负载均衡。当我们了解并熟悉了这些能力之后,我们可以尝试着从流量治理的场景出发基于以上这些微服务框架的模型与组件,来实现我们想要达到的流量治理能力。

服务注册与发现

通过第一章的介绍,我们了解到,在微服务架构下,将原先复杂的业务系统拆分成一系列简单的服务,且每个服务都是由一个个独立的应用且运行在各自的进程内,单个服务可以由多个节点构成,各个服务之间通过远程通信的方式交互。当微服务架构面对变化的业务流量时,每个服务都可以做到快速地弹性扩容与缩容。那么迎来了微服务架构下的第一个问题,如图 2-1-1 所示,对于其他需要调用 OrderService 的服务来说,OrderService 服务的节点状态如何感知?其他服务(UserService)必须感知到 OrderService 服务的节点信息,才可以通过远程通信的方式与之进行交互,如果节点的信息或者状态感知有误,如果感知到部分地址那么UserService 就会访问不到 OrderService 服务的全部节点,如果感知到的地址中有错误地址,那么UserService 访问 OrderService 服务时,就有概率出现服务调用错误的问题。

可以看出来,准确且及时地让其他需要的服务感知到当前服务的节点信息是非常重要的一件事情,为了更好地解决这个服务节点信息以及状态感知的问题,微服务架构引入了注册中心这个角色。OrderService服务通过向注册中心注册自己的服务并将自己的节点信息与状态维护在注册中心中。UserService 服务如果需要访问 OrderService 服务,那么 UserService 会从注册中心中订阅 OrderService 服务,并拉取注册中心中维护的 OrderService 节点列表。这样 UserService 就可以从 OrderService 节点列表中任意选择一个节点进行调用,实现服务的调用。这个过程也就是服务注册与服务订阅,Spring Cloud 和 Apache Dubbo 都是通过服务注册/服务发现机制实现服务节点信息的维护与感知。

image

2-1-2

Spring Cloud/Apache Dubbo的服务调用过程如图 2-1-2 所示,Provider 应用(服务提供者)一个或多个节点在启动之后,会在注册中心中注册当前服务的节点信息,Consumer 应用(服务消费者)会向注册中心发现/订阅所需调用的 Provider 的节点信息,得到对应Provider服务的节点列表,之后选择其中的一个节点进行服务调用。

服务路由与负载均衡

站在服务消费者的角度思考,当我们得到了我们所需调用的服务提供者的节点列表之后,会选择其中一个节点进行服务调用,那么我们该如何选择呢?如果我们一直只选择其中第一个节点进行调用,会造成服务提供者的第一个节点压力巨大,但其他节点却闲得发慌,这肯定是不合理的。因此如何选择更合适的节点进行调用,这就是服务路由与负载均衡需要考虑的事情。

1、服务路由

服务路由的指责就是根据一定的路由策略从所有的地址表中筛选出最终目的地址集合。值得一提的是我们可以为目标服务配置多种路由策略,多个路由如同流水线一样,形成一条路由链:target = rn(…r3(r2(r1(src))))。可以用这样的公式来体现服务路由的过程,其中 r1 的输出作为 r2 的输入。

image

服务消费者会向注册中心获取到目标服务提供者的地址列表之后,会根据路由策略选出需要调用的服务提供者地址列表。

2、负载均衡

经过服务路由的服务提供者地址列表如果还是存在多个地址,就需要经过客户端负载均衡算法最终选择一个访问的目标节点地址。我们希望服务消费者的请求调用合理地分配至服务提供者的各个节点上,避免服务提供者负载不均。如果出现服务提供者负载过大,轻则导致部分请求超时,重则导致服务提供者崩溃。

微服务中常见客户端负载均衡算法如下:

  • 随机(Random)算法:在节点列表中随机选择一个目标节点。

  • 轮训(RoundRobin)算法:在节点列表中轮流选择一个目标节点。假设有 3 个节点,第一次选择第 1 个节点,第二次选择第 2 个节点。以此类推,第三次选择第 3 个节点,第四次则选择第 1 个节点。

  • 基于权重的随机(Weightd Random)算法:举一个简单的例子说明,假设有 3 个节点,第一个节点的权重是 10,第二个节点的权重是 20,第三个节点的权重是 70 。每次选择一个1到100之间的数字,如果是 1 到 10 之间,就选择第一个节点,如果是10到30之间就选择第二个节点,如果是30到100之间,就选择第三个节点。

  • 基于最少连接数(Least Connections)算法:选择当前具有最小连接数的节点。

  • 基于 hash 一致性(Consistent Hashing)算法:根据一致性 hash 的算法,尽可能将相同参数的请求选择到同一个节点上。

相对于服务路由来说,一个服务的负载均衡算法只能选择一个。负载均衡是一个比较通用的能力,基本上所有 RPC 框架都会有对应的实现。对于Apache Dubbo来说,通过内部 LoadBalance 组件实现了负载均衡能力;对于Spring Cloud 来说,官方提供了Netflix Ribbon跟Spring Cloud LoadBalancer两种实现。

有了服务路由与负载均衡后,开发者无需关心目标服务的节点列表获取与选择的逻辑,只需调用目标服务即可。流量治理能力的建设,离不开对服务路由与负载均衡的实现。我们可以通过实现一个路由策略,做到将特定的流量比如 Header 中带有 X-user-id 为 12345 的流量,路由至服务提供者中带有新版本代码的节点上;我们需要在线上服务提供者的 10.0.0.79 节点上进行内存 Dump ,为了不影响线上的业务流量,还可以通过修改负载均衡策略,让 IP 为 10.0.0.79 的服务提供者节点不接受任何来自消费者的流量,等到我们可以收集完内存 Dump 文件之后,再恢复负载均衡的策略。我们可以通过实现不同的路由与负载均衡策略可以完成对微服务流量调用的控制。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
存储 设计模式 负载均衡
一文读懂Spring动态配置多数据源---源码详细分析(下)
一文读懂Spring动态配置多数据源---源码详细分析
2975 0
一文读懂Spring动态配置多数据源---源码详细分析(下)
|
存储 关系型数据库 MySQL
Mysql - 如何决定用 datetime、timestamp、int 哪种类型存储时间戳?
Mysql - 如何决定用 datetime、timestamp、int 哪种类型存储时间戳?
3731 0
|
4月前
|
JavaScript Linux iOS开发
零代码零基础!小红书MCP全自动化运营【保姆级安装教程】
小红书MCP是一款开箱即用的自动化运营工具,支持登录、发图文/视频、评论互动等。无需源码编译或Docker,下载预编译安装包即可快速部署,兼容Windows/macOS/Linux。配合Cursor编辑器,通过自然语言指令即可完成全部操作,新手10分钟上手。
5759 0
|
7月前
|
人工智能 前端开发 UED
PPT大纲生成的AI魔法:3小时工作3分钟搞定,但重点不是效率
本文从反常识角度切入,通过三个场景案例,阐述AI大纲生成工具的真正价值不在于效率提升,而在于帮助使用者建立结构化思维模式。文章提供完整的AI指令和系统的使用进阶指南。
1159 9
PPT大纲生成的AI魔法:3小时工作3分钟搞定,但重点不是效率
|
前端开发 JavaScript Java
使用Springboot 2.7+Websocket+js实现服务端消息实时推送
使用Springboot 2.7+Websocket+js实现服务端消息实时推送
使用Springboot 2.7+Websocket+js实现服务端消息实时推送
|
存储 安全 前端开发
OAuth 2.0资源授权机制与安全风险分析
OAuth 2.0资源授权机制与安全风险分析
932 1
|
API 黑灰产治理
API 场景最佳实践:UGC内容检测
近年来随着UGC的兴起,内容审查变得越来越重要,而纯人工的审核方式已经很难跟上业务的发展需要,因此机器辅助审核应运而生。 本文主要以iOS Demo的形式,介绍如何使用阿里云内容审核API进行图片、视频等内容的涉黄、涉政等检测。
3116 0
|
小程序 程序员 开发者
微信小程序开发:使用字体图标的方法
在微信小程序开发过程中,图标的使用是很常见很普遍的。一般情况下,在微信小程序项目的文件目录里面images里面,可以直接引用本地的图标文件,但是通过使用字体图标或者background设置背景图的时候,就不用引用本地图标文件,只能使用根据URL链接地址的字体或者图片,再或者使用base64把普通图标编码之后的格式。
1290 0
微信小程序开发:使用字体图标的方法
|
缓存 Java 编译器
避免重排序之使用 Volatile 关键字
volatile 关键字本身就包含了禁止指令重排序的语义,仅保证赋值过程的原子性,保障变量的可见性,但不具备排它性
628 0
|
存储 消息中间件 缓存
ActiveMQ系列:ActiveMQ的持久化机制
为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制。ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式,消息的存储逻辑都是一致的 就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等再试图将消息发送给接收者,成功则将消息从存储中删除,失败则继续尝试发送。
662 0
ActiveMQ系列:ActiveMQ的持久化机制