首页 > 其他分享 >微服务13:云基础场景下流量策略实现原理

微服务13:云基础场景下流量策略实现原理

时间:2023-07-26 15:25:17浏览次数:48  
标签:13 场景 服务 default testsvc 流量 admin 版本

★微服务系列

微服务1:微服务及其演进史
微服务2:微服务全景架构
微服务3:微服务拆分策略
微服务4:服务注册与发现
微服务5:服务注册与发现(实践篇)
微服务6:通信之网关
微服务7:通信之RPC
微服务8:通信之RPC实践篇(附源码)
微服务9:服务治理来保证高可用
微服务10:系统服务熔断、限流
微服务11:熔断、降级的Hystrix实现(附源码)
微服务12:流量策略

1 微服务的基本流量策略

微服务提供了一些技术来实现对微服务的流量的管理,其中最典型的就是对流量进行拆分和转发。
具体体现在金丝雀发布(灰度发布)、ABTesting 以及流量染色 等策略方案上。

2 流量策略实现流控的本质

云原生基础场景下,如果想要实现流控和调度,需要具备以下几个条件:

  • 请求的流量中,需要附带某些特征,如流量的请求的Header、Cookies、queryParams等 中带有某些信息。
  • 部署在kubernetes上的服务(svc)的实例(pod),打上版本标签,如 label: default、label: version1、label:version2 等。
  • 在云原生基础组件(如 Service-Mesh平台)上对相关的服务配上策略:当请求的流量带有某些特征(如header中带有Dep=SO)时,流量路由到对应标签(如 version = version1 )的服务实例Pod上。
  • 不符合条件的路由则默认走到默认版本中(如 version = default)。

所以,流控调度的本质上是通过在流量中携带一些特征(如流量的请求的Header、Cookies、queryParams等),而Mesh会根据这些请求的特征进行路由匹配,转发到对应的带有某些特征的服务实例上。
未匹配成功的流量则走到默认版本或者给定的具体版本中,从而实现多个版本和跟默认版本的业务隔离的目标。这种模式下,实现 灰度发布、ABTesting 以及流量染色 都是很方便的。
image

3 流量染色流转的原理

这边以Istio 实现的 Service-Mesh为案例

3.1 Istio支持的策略模型

image

基于上述的策略模型,如果你想配置如下:请求的header 带有 username = brand 或者 departname = hr 的时候,将流量转发到服务的v1版本,否着转发到default版本。
则策略代码如下:

# 说明:VirtualService 流量染色,根据不同的条件将流量发往不同特征的版本中,假设这边有default、v1、v2 版本
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: test-service1-vs
spec:
  hosts:
  - test-service1  # 治理发往test-service1服务的流量
  exportTo:
  - "."
  http:  # 加各种路由条件,比如匹配人员、部门进行路由
  - match  # 用户匹配 brand,部门匹配 hr 部门时
    - headers:
        username:
          exact: brand
    - headers:
        departname:
          exact: hr
    route: 
      destination:
      # todo 匹配条件的流量路由到对应的服务上......
  - route: 
    - destination:
    # todo 不匹配条件的流量路由到对应的服务上......

3.2 Kubernetes中服务的部署模式

云原生基础平台上的服务遵循如下层级结构,namespace对标应用,svc对标服务。
image

假设你给你的服务配置了多个版本,比如你发布了default(默认版本)、v1版本。
检查kubernetes的信息会发现,service保持不变,这个命名为testsvc-admin-default的服务下,对应两个deployment,两个pod。

root@xxxxxxxxxxxxxx:~# kubectl -n testsvc-debug get deployments
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
testsvc-admin-429mvh    1/1     1            1           18m
testsvc-admin-default   1/1     1            1           142m
root@xxxxxxxxxxxxxx:~# kubectl -n testsvc-debug get services
NAME               TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)   AGE
testsvc-admin-default   ClusterIP   172.100.110.220   <none>        80/TCP    142m
root@xxxxxxxxxxxxxx:~# kubectl -n testsvc-debug get pods
NAME                                READY   STATUS    RESTARTS   AGE
testsvc-admin-429mvh-5b567969b4-nq4zp    2/2     Running   0          17m
testsvc-admin-default-85467f8f79-xzfgz   2/2     Running   0          23m

看看两个deployment的信息对比,labels中的app属性一致,version属性不一致。所以,服务按照同一个app寻址,不同的version进行流量shift的方式进行。

root@xxxxxxxxxxxxxx:~# kubectl -n testsvc-debug get deployment testsvc-admin-default  -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "2"
  creationTimestamp: "2022-01-14T06:40:22Z"
  generation: 2
  labels:
    app: testsvc-admin-default
    appName: testsvc-admin
    appType: java
    projectName: testsvc-debug
    version: default
    workspaceName: SPACE_BASIC_SERVE  
  name: testsvc-admin-default
  namespace: testsvc-debug
  resourceVersion: "335716111"
  uid: 7531a9b3-53eb-475d-ae0b-75df957badb9

root@xxxxxxxxxxxxxx:~# kubectl -n testsvc-debug get deployment testsvc-admin-429mvh  -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2022-01-14T08:45:03Z"
  generation: 1
  labels:
    app: testsvc-admin-default
    appName: testsvc-admin
    appType: java
    projectName: testsvc-debug
    version: 429mvh
    workspaceName: SPACE_BASIC_SERVE
  name: testsvc-admin-429mvh
  namespace: testsvc-debug
  resourceVersion: "335719639"
  uid: 85c0e1f2-b56d-4afc-8c51-ccb887e420b6

现在,envoy的流转规则有了,服务的特征也有了,完整策略匹配代码如下:

# 说明:VirtualService 流量染色,根据不同的条件将流量发往不同特征的版本中,假设这边有default、v1、v2 版本
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: test-svc-vs
spec:
  hosts:
  - test-svc  # 治理发往test-svc服务的流量
  exportTo:
  - "."
  http:  # 加各种路由条件,比如匹配人员、部门进行路由
  - match  # 用户匹配 brand,部门匹配 hr 人事部时
    - headers:
        username:
          exact: brand
    - headers:
        departname:
          exact: hr
    route: 
      destination:
        host: test-svc
        subset: v1  # 匹配条件的流量路由到对应的服务的v1版本上
  - route: 
    - destination:
        host: test-svc  # 剩余的流量走到default版本上
        subset: default

3.3 流量的解析和流转

规则下发之后,envoy存储在本地,当流量出去的时候,outbound 那边会做一个判断。
如果是header中带上 username = brand 或者 departname = hr ,流量转发到带有v1 标签的pod中,
否则流量转发到带有default标签的pod中。

image

4 总结

丰富的流量管理策略为我们系统的稳定性,以及流量的多样化(金丝雀发布、ABTesting、分级扩散流量、流量染色)使用提供了保证。

标签:13,场景,服务,default,testsvc,流量,admin,版本
From: https://www.cnblogs.com/wzh2010/p/16124940.html

相关文章

  • Oracle日常性能问题查看 转载 https://www.cnblogs.com/yhq1314/p/10601630.html
    1判断回滚段竞争的sql--当Ratio大于2时存在回滚段竞争,需要增加更多的回滚段)selectrn.name,rs.GETS,rs.WAITS,(rs.WAITS/rs.GETS)*100ratiofromv$rollstatrs,v$rollnamernwherers.USN=rn.usn;2判断恢复日志竞争的sql,这句有问题不能使用--immediate_con......
  • 使用3ds Max粒子系统创建飞天箭雨特效场景
    推荐:NSDT场景编辑器助你快速搭建可二次开发的3D应用场景1.设置箭头步骤1打开 3dsMax。打开3dsMax步骤2我使用多边形建模技术制作了一个简单的箭头,我将在教程中使用。.max您可以从下载部分。箭头.max步骤3将此箭头重命名为静态箭头。静态箭头步骤4复制静态......
  • MySql —— 死锁场景
    参考:小林coding: https://xiaolincoding.com/mysql/lock/deadlock.html出世&入世:https://blog.csdn.net/weixin_54828627/article/details/129379140 死锁的四个必要条件:互斥占有且等待不可强占用循环等待一、批量更新/删除数据-同时加锁记录多InnoDB是边扫描边加锁......
  • 013 学习笔记--锁
    锁:全局锁:锁定数据库中的所有表表级锁:每次操作锁住整张表行级锁:每次操作锁住对应的行数据1.概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CUP、RAM、IO)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性......
  • C#委托的20种表达方式,每一种优缺点和应用场景
    C#委托有多种表达方式,每一种都有各自的优缺点和适用场景。以下为常见的20种表达方式:1.声明委托类型,并使用委托关键字进行定义:```c#delegatevoidMyDelegate(intvalue);```优点:简单明了,易于理解和使用。缺点:需要额外的代码定义委托。2.使用匿名方法:```c#MyDelegatemyDelegat......
  • 13个offer,8家SSP,谈谈我的秋招经验
    公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作-----》我是传送门关注后,回复以下口令:回复【789】:领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读)回复【入群】:加入卖萌屋深度学习/NLP/CV/搜广推等方向的技术交流与内推社群(大V、顶会审稿人云集)回复【0511】:领取算法......
  • day13
    一、[第五空间2021]alpha101.foremost分离,得到png和jpg,两张图片一样,猜测是盲水印隐写,得到一张类似于flag的图片pythonbwmforpy3.pydecode1.jpg2.pngresult.png2.颜色异或转换一下,得到flag二、messy_traffic1.打开流量过滤HTTP流,发现了文件上传,直接导出HTTP对象文......
  • 使用gcc-13.1.0编译安装thrift-0.18.1
    执行configure生成Makefile,排除掉不需要的语言支持和测试等:./configure--prefix=/usr/local/thrift-0.18.1--with-boost=/usr/local/boost--with-libevent=/usr/local/libevent--with-openssl=/usr/local/openssl--with-cpp=yes--with-go=no--with-java=no--with-pyth......
  • 赛维1325雕刻机系统安装和相关支持软件
    “赛维”牌雕刻机是行业内较为知名的cnc数控品牌。因工作原因,我公司也购买了一台sw1325雕刻机,其实是买错了,根据台面大小来看,1318.1312都可以买。买这个雕刻机主要用于切割本公司亚克力面板的切割使用。但官方原本留的售后联系方式服务并不理想。后又联系该公司张工,获得了一个比较......
  • MIT 6.S081 Lec13: File system
    Overview文件系统的设计目标就是组织和存储数据,文件系统一个比较重要功能是持久化,即重启之后,数据不会丢失。xv6通过把数据存储在virtiodisk上来实现持久化。文件系统设计的几大挑战:Thefilesystemneedson-diskdatastructurestorepresentthetreeofnameddirecto......