微服务12:流量策略 - Hello-Brand
source link: https://www.cnblogs.com/wzh2010/p/16124933.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
★微服务系列
微服务1:微服务及其演进史
微服务2:微服务全景架构
微服务3:微服务拆分策略
微服务4:服务注册与发现
微服务5:服务注册与发现(实践篇)
微服务6:通信之网关
微服务7:通信之RPC
微服务8:通信之RPC实践篇(附源码)
微服务9:服务治理来保证高可用
微服务10:系统服务熔断、限流
微服务11:熔断、降级的Hystrix实现(附源码)
1 微服务的基本流量策略
微服务提供了一些技术来实现对微服务的流量的管理,其中最典型的就是对流量进行拆分和转发。
具体体现在金丝雀发布(灰度发布)、ABTesting 以及流量染色 等策略方案上,下面会进行详细的介绍。
2 价值和必要性
★ 价值驱动:
- 支持蓝绿发布、金丝雀发布,无需停服也能保证发布的无缝衔接,提高了服务整体的SLA。
- 全链路的ABTesting,保证不同特征类型的用户可以在独立的链路通道上测试、使用、实验、生产。
- 大幅降低早期为实现灰度而做多服务的资源(时间、服务器资源)损耗。
★ 业务视角:
- 实现所有业务 分级发布、扩散发布的能力,保证发布的渐序性。比如上线一个新功能,首先在小范围发布,观察一段时间之后在全量发布。
- 染色实验的各种场景,让不同类型的用户体验不同类型的功能。
- 实现多环境场景的降本增效:无需再对不同环境的服务独立部署,从维护和资源上来说,大大降低了成本。
3 流量调控
3.1 金丝雀发布、ABTesting
这是流量调度中典型的金丝雀场景,可以先放行一部分流量转发到一个新的服务实例中,这个新的服务实例只有你的研发和测试团队可以接入。可以在上面尝试使用或者测试,直到你确认你的服务是健康的,功能完整的,没有bug的,再把流量逐渐的引流过去。
这个的好处是减少发布新功能存在的风险,而且全程是无停服发布,对用户是透明无感知的,大大提高了可用性,提升服务SLA。
3.2 流量染色
流量染色也是一种典型的场景。如果你想让不同的用户群体(比如这边的Group A、Group B、Group C)使用的功能也是不同的,那流量染色是一个不可缺少的功能。
它可以把符合某些特征的用户流量调控到对应的服务版本中。比如GroupA是学生群体,对应到V1版本,GroupB是政企员工群体,对应到V2版本。需要注意的是,如果是一条完整的链路,那链路上的各个服务包括数据存储层都应该有不同的版本,这样才能一一对应。
3.3 染色实现方案(以ServiceMesh为例子)
Mesh如果想要实现流量染色,需要具备以下几个条件:
- 请求的流量中,需要附带某些特征,如流量的请求的Header、Cookies、queryParams等 中带有某些信息。
Request Header:
UserId: 135648468
Dep: T204351
X-Request-Id: ee6637e816d7470bb2e90e13e1130733
- 部署在kubernetes上的服务(svc)的实例(pod)需要接入Mesh(如Istio),并在pod上打上版本标签。
labels:
app: traffic-test
appName: traffic-test
appType: java
istio.io/rev: default
pod-template-hash: 78ab8776a9
security.istio.io/tlsMode: istio
service.istio.io/canonical-revision: v1
version: v1 # 在具体的 pod 中 label 上 v1 的 version 标签
- 下发Istio的策略到kubernetes对应服务服务上:当请求的流量带有某些特征(如header中带有Dep=SO)时,流量路由到对应标签(如 version = v1 )的服务实例上。
spec:
exportTo:
- '*'
host: xxx.com
subsets:
- labels: # 这是v1 版本
version: v1
name: v1
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- labels: # 这是default
version: default
name: default
- header中符合带Dep=T204351的走v1版本,不符合条件的路由则默认走到默认版本中(如 version = default)。
所以,Mesh的染色本质上是通过在流量中携带一些特征(如流量的请求的Header、Cookies、queryParams等),而Mesh会根据这些请求的特征进行路由匹配,转发到对应的带有某些特征的服务实例上。
未匹配成功的流量则走到默认版本中,从而实现多个版本和跟默认版本的业务隔离的目标。
上面的图,当部门编号为 T204351的时候,流量会转发到服务的v1版本中;当部门编号为 T204352的时候,流量会转发到服务的v2版本中;剩余的流量,默认转发到服务的default版本中。
丰富的流量管理策略为我们系统的稳定性,以及流量的多样化(金丝雀发布、ABTesting、分级扩散流量、流量染色)使用提供了保证。
Recommend
-
5
在高并发、高消息吞吐的互联网场景中,我们经常会使用消息队列(Message Queue)作为基础设施,在服务端架构中担当消息中转、消息削峰、事务异步处理 等职能。 对于那些不需要实时响应的的业务,我们都可以放在消息队列中进行传输。下面是用户在进行系统注册...
-
6
1 什么是高性能Web架构 在互联网业务中,我们经常会面临流量巨大的复杂的分布式场景。这就要求我们在设计系统的时候保证系统具有承载高并发(High Concurrency)的能力,同时能够保证系统的高可用性(High Availability)。...
-
6
MQ系列1:消息中间件执行原理
-
10
MQ系列1:消息中间件执行原理
-
3
MQ系列1:消息中间件执行原理
-
4
微服务1:微服务及其演进史
-
10
Redis系列11:内存淘汰策略
-
2
MQ系列9:高可用架构分析
-
4
Redis系列1:深刻理解高性能Redis的本质
-
5
★微服务系列 微服务1:微服务及其演进史
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK