乐趣区

关于后端:OpenSergo-流量路由从场景到标准化的探索

简介:本文咱们将从流量路由这个场景动手,从常见的微服务治理场景登程。先是依据流量路由的实际设计流量路由的 Spec,同时在 Spring Cloud Alibaba 中实际遵循 OpenSergo 规范的流量路由能力。作者:十眠 流量路由,顾名思义就是将具备某些属性特色的流量,路由到指定的指标。流量路由是流量治理中重要的一环,多个路由如同流水线一样,造成一条路由链,从所有的地址表中筛选出最终目标地址汇合,再通过负载平衡策略抉择拜访的地址。开发者能够基于流量路由规范来实现各种场景,如灰度公布、金丝雀公布、容灾路由、标签路由等。直播课程观看:https://yqh.aliyun.com/live/d… 微服务治理与 OpenSergo 随着微服务(MicroServices) 理念的衰亡,让大规模、高并发、低提早的分布式应用成为可能。然而微服务架构是一把双刃剑,随着微服务架构复杂化,在大规模之下,再小的问题都会牵一发而动全身,因而随着微服务架构增长,如果不对微服务进行失当的治理,微服务架构带来的效率、稳定性问题很可能会远大于微服务自身带来的架构红利。能够说,古代微服务架构的四大件:服务提供者、服务消费者、注册配置核心,当然还有容易被大家漠视但又非常重要的一点,那就是微服务治理。微服务治理的使命就是对微服务体系中的各个组件与环节进行治理,能够说做好微服务治理那就是把微服务做稳做好的必不可少的一环。在企业外部,往往存在着不同语言、不同通信协议的微服务,这种异构化的架构会导致治理微服务的过程中,业务开发者、架构师无奈用对立的形式来对所有服务进行治理管控,并且这类异构会衍生出更多的痛点:业内对服务治理的能力和边界没有明确的意识,每个企业所定义的服务治理概念不统一,造成很高的了解和沟通老本。开源微服务框架泛滥,对于服务治理不足一些标准化的约定。例如,Spring Cloud 中定义的微服务接口和 Dubbo 中定义的接口就没有方法互通,通过 Dubbo 和 Istio 治理的微服务也没有方法进行对立治理。开发者无奈通过对立的配置形式来对不同框架、不同语言的服务进行对立治理管控。短少真正面向业务、可能加重认知累赘的形象和规范。开发者真正想要的可能是简略的、指定服务间的调用关系和配置规定。但当初对于业务开发者来说,不仅须要理解不同微服务框架的部署架构,也要理解不同服务治理形式的概念和能力区别,认知老本很大。基于下面这些痛点,阿里巴巴在 2022 年 1 月开始和 bilibili、CloudWego 等厂商、社区探讨服务治理如何规范化和更加遍及,从而独特发动了 OpenSergo 我的项目。OpenSergo 是凋谢通用的,笼罩微服务及上下游关联组件的微服务治理我的项目,从微服务的角度登程,涵盖流量治理、服务容错、服务元信息治理、平安治理等要害治理畛域,提供一系列的治理能力与规范、生态适配与最佳实际,反对 Java, Go, Rust 等多语言生态。OpenSergo 的最大特点就是以对立的一套配置 /DSL/ 协定定义服务治理规定,面向多语言异构化架构,做到全链路生态笼罩。对于开发者来说能够通过同一套 OpenSergo CRD 标准配置针对微服务架构波及到的每一个组件进行对立的治理管控,而无需关注各框架、语言的差别点,升高异构化、全链路服务治理管控的复杂度。上面咱们将从流量路由这个场景动手,从常见的微服务治理场景登程。先是依据流量路由的实际设计流量路由的 Spec,同时在 Spring Cloud Alibaba 中实际遵循 OpenSergo 规范的流量路由能力。流量路由 流量路由,顾名思义就是将具备某些属性特色的流量,路由到指定的指标。流量路由是流量治理中重要的一环,咱们能够基于流量路由规范来实现各种场景,如全链路灰度、标签路由、金丝雀公布等。标签路由 标签路由是依照标签为维度对指标负载进行划分,符合条件的流量匹配至对应的指标,从而实现标签路由的能力。当然基于标签路由的能力,赋予标签各种含意咱们就能够实现各种流量路由的场景化能力。

 金丝雀公布 金丝雀公布是一种升高在生产中引入新软件版本的危险的技术,办法是在将更改推广到整个基础架构并使其可供所有人应用之前,迟缓地将更改推广到一小部分用户。金丝雀公布是一种在黑与白之间,可能平滑过渡的一种公布形式。让一部分用户持续用旧版本,一部分用户开始用新版本,如果用户对新版本没有什么拥护意见,那么逐渐扩大范围,把所有用户都迁徙到新版本下面来。始终都有据说,平安生产三板斧的概念:可灰度、可观测、可回滚。那么灰度公布能力就是帮忙企业软件做到疾速迭代验证的必备能力。在 K8s 中金丝雀公布的最佳实际如下:第一步:新建灰度 Deployment,部署新版本的镜像,打上新版本的标签。第二步:配置针对新版本的标签路由规定。第三步:验证胜利,扩充灰度比例。第四步:若验证胜利,将稳固版本的利用更新成最新镜像;若验证失败,把灰度的 Deployment 正本数调整到 0 或删除该 Deployment。全链路灰度 全链路灰度公布就是通过线上多个利用部署灰度版本,灰度流量全副进入灰度版本,失常流量进入生产版本。灰度版本只针对灰度流量验证,无效缩小危险。咱们能够通过流量路由联合流量染色能够实现全链路的流量灰度能力。

 流量路由标准化 业界微服务治理存在概念不对立、配置模式不对立、能力不对立、多框架对立管控较为简单等问题。比方咱们心愿实现流量路由的能力,在 Spring Cloud 中可能须要通过 Spring Cloud 动静规定的形式进行配置,在 istio 中可能又是另一套配置形式,在其它组件上可能又是不同的配置。不同框架治理配置形式的不统一使得微服务对立治理管控的复杂度相当高。为此咱们须要通过 OpenSergo 实现一套标准化的流量路由能力与实际,这样在任 OpenSergo 生态中的组件上需通过配置 OpenSergo TrafficRouter 规定,即可实现统一的流量路由能力。

 咱们在实际了许多流量路由的场景后,将流量路由规定进行了如下的设计与形象。OpenSergo 的流量路由规定 (v1alpha1) 次要分为如下:Workload 汇合的形象 (VirtualWorkloads):将某一组 VirtualWorkload(如 Kubernetes Deployment, Statefulset 或者一组 pod,或某个 JVM 过程,甚至是一组 DB 实例)依照肯定的特色进行分类。流量标签规定 (RouterRule):将特定特色的流量映射至特定特色所对应的 VirtualWorkloads 上。路由链规定 (RouterChain) 将特定的 RouterRule 跟 VirtualWorkloads 依照肯定逻辑排列组合成 pipeline。Workload 汇合的形象 (VirtualWorkloads) VirtualWorkloads 虚构工作负载汇合的形象即 VirtualWorkload 汇合,其中会将 VirtualWorkload 依照肯定的特色进行分类。VirtualWorkload 虚构工作负载即 workload 汇合的形象,将肯定属性特色的 workload 汇合划分成一个 VirtualWorkload,其中 VirtualWorkload 能够是指标 service 汇合也能够是 deployment,甚至能够是 database 的实例、库、表汇合。对于通用的 workload 场景,咱们能够利用 VirtualWorkloads CRD 进行形容。特地地,对于 Kubernetes workload,咱们能够通过间接在 workload 上打 label 的形式进行特色标记,如在 Deployment 上打上 traffic.opensergo.io/label: gray 标签代表以后 Deployment 的标签特色为 gray。一个规范的 workloads 形容应该相似于:apiVersion: traffic.opensergo.io/v1alpha1
kind: VirtualWorkloads
metadata:
name: tag-rule
spec:
selector:

app: my-app

virtualWorkload:

- name: my-app-gray
  target: my-app-gray-deployment    
  type: deployment
  selector:
    tag: gray 流量路由规定 (RouterRule) 流量路由规定 (RouterRule) 将特定特色的流量映射至特定特色所对应的 VirtualWorkloads 上。假如当初须要将内部测试用户灰度到新版主页,测试用户 uid=12345,UID 位于 X-User-Id header 中,不符合条件的内部用户流量拜访原版主页。那么只须要配置如下 CRD 即可:apiVersion: traffic.opensergo.io/v1alpha1

kind: RouterRule
metadata:
name: tag-traffic-router-rule
spec:
selector:

app: my-app

http:

- name: my-traffic-router-http-rule
  rule:  
    match:
      header: 
        X-User-Id:   # 参数名
          exact: 12345       # 参数值
      uri:
        exact: "/index"
    targets:
      - workloads: my-app-worksloads
        name: gray
  target:
    workloads: my-app-worksloads
    name: base 通过上述配置,咱们能够将 path 为 /index,且 uid header 为 12345 的 HTTP 流量为灰度流量,拜访灰度版本的新版主页。标签路由场景的流量路由配置 假如咱们心愿 Header x-user-id 为 123 的流量拜访 spring-cloud-a 的具备 gray 标签的实例。其中 spring-cloud-a 的标签状况如下:

 那么咱们须要配置对应的 TrafficRouterRule 配置如下:apiVersion: traffic.opensergo.io/v1alpha1
kind: TrafficRouterRule
metadata:
name: tag-traffic-router-rule
spec:
selector:

app: spring-cloud-a

http:

- name: my-traffic-router-http-rule
  rule:  
    match:
      headers: 
        X-User-Id:   # 参数名
          regex: "^(?!(?:\d{1,2}|100)$)[0-9]\d+$"       # 参数值
      queryParams:
        name:
          exact: xiaoming
      uri:
        prefix: "/"
    targets:
      - workloads: spring-cloud-a-worksloads
        name: gray
  target:
    - workloads: spring-cloud-a-worksloads
      name: base 对应的 VirtualWorkloads 配置如下:apiVersion: traffic.opensergo.io/v1alpha1

kind: VirtualWorkloads
metadata:
name: spring-cloud-a-worksloads
spec:
selector:

app: spring-cloud-a

virtualWorkload:

- name: gray
  target: spring-cloud-a
  type: deployment
  selector:
    tag: gray
  loadbalance: random
- name: base
  target: spring-cloud-a
  type: deployment
  selector:
    tag: _base
  loadbalance: random 金丝雀公布场景的流量路由配置 咱们配置了如下的金丝雀规定,心愿 10% 的流量拜访 spring-cloud-a 中具备 gray 标签的实例:

 对应的 TrafficRouterRule 配置如下:apiVersion: traffic.opensergo.io/v1alpha1
kind: TrafficRouterRule
metadata:
name: tag-traffic-router-rule
spec:
selector:

app: spring-cloud-a

http:

- name: my-traffic-router-http-rule
  rule:
    targets:
      - workloads: spring-cloud-a-worksloads
        name: gray
        weight: 10
      - workloads: spring-cloud-a-worksloads
        name: base
        weight: 90
  target:
    - workloads: spring-cloud-a-worksloads
      name: base 流量路由 Demo 演示 

 Spring Cloud Alibaba Consumer 利用中减少 OpenSergo 的依赖,并启动 Spring Cloud Alibaba 流量路由的 Demo <dependency>

<groupId>com.alibaba.cloud</groupId>
<artifactId>opensergo-resource-transform</artifactId>
<version>2.2.9-SNAPSHOT</version>

</dependency> 配置 OpenSergo 流量路由 启动 OpenSergo 管制面下发 TrafficRouterRule CRD 规定 假如当初须要将灰度流量路由到 v2 版本,灰度申请合乎如下条件 header:name=xiaoming,Params:location=shenzhen 的申请流量去往灰度 v2 版本,不符合条件的流量拜访 v1 版本。那么只须要配置如下 CRD 即可:apiVersion: fault-tolerance.opensergo.io/v1alpha1
kind: TrafficRouterRule
metadata:
name: http-foo-rule
labels:

app: foo-app

spec:
http:

match:
  headers:
    name: 'xiaoming'
  queryParams:
    location: 'shenzhen'
targets:
  - name: "v2"
    selectors:
      version: "v2"

target:

name: "v1"
selectors:
  version: "v1" 后果验证 当咱们执行 curl http://127.0.0.1:18083/router-test NacosRegistration{nacosDiscoveryProperties=NacosDiscoveryProperties{serverAddr='127.0.0.1:8848', endpoint='', namespace='', watchDelay=30000, logName='', service='service-provider', weight=1.0, clusterName='DEFAULT', group='DEFAULT_GROUP', namingLoadCacheAtStart='false', metadata={preserved.register.source=SPRING_CLOUD, version=v1}, registerEnabled=true, ip='192.168.1.4', networkInterface='', port=18082, secure=false, accessKey='', secretKey='', heartBeatInterval=null, heartBeatTimeout=null, ipDeleteTimeout=null, failFast=true}} 其中返回默认 v1 版本的实例当咱们执行 curl -H 'name:xiaoming' http://127.0.0.1:18083/router-test\?location\=shenzhen NacosRegistration{nacosDiscoveryProperties=NacosDiscoveryProperties{serverAddr='127.0.0.1:8848', endpoint='', namespace='', watchDelay=30000, logName='', service='service-provider', weight=1.0, clusterName='DEFAULT', group='DEFAULT_GROUP', namingLoadCacheAtStart='false', metadata={preserved.register.source=SPRING_CLOUD, version=v2}, registerEnabled=true, ip='192.168.1.4', networkInterface='', port=18081, secure=false, accessKey='', secretKey='', heartBeatInterval=null, heartBeatTimeout=null, ipDeleteTimeout=null, failFast=true}} 其中合乎流量匹配的条件,返回默认 v2 版本的实例。总结与瞻望 流量路由是微服务流量治理中的重要的一环,当然 MSE 还提供更广范畴、更多场景的微服务治理能力,包含全链路灰度、无损高低线、微服务数据库治理、日志治理等一系列的微服务治理能力。服务治理是微服务革新深刻到肯定阶段之后的必经之路,是将微服务做稳做好的要害。同时咱们也在与 CloudWeGo、Kratos、Spring Cloud Alibaba、Dubbo、ShardingSphere 等社区独特建设 OpenSergo 微服务治理规范,将企业与社区中微服务治理的场景与最佳实际独特提取成标准规范,也欢送更多社区与企业一起参加 OpenSergo 微服务治理规范的共建。欢送大家退出 OpenSergo 社区交换群(钉钉群)进行探讨:34826335 MSE 云原生网关、注册配置专业版预付费首购享 8 折,首购 1 年及以上享 7 折。点击此处,即享优惠!原文链接:https://click.aliyun.com/m/1000364862/ 本文为阿里云原创内容,未经容许不得转载。
退出移动版