日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

基于MSE云原生網(wǎng)關(guān)實(shí)現(xiàn)全鏈路灰度

更新時(shí)間:

在微服務(wù)場(chǎng)景中,應(yīng)用間的調(diào)用是隨機(jī)的。當(dāng)您部署的Spring Cloud應(yīng)用或Dubbo應(yīng)用存在升級(jí)版本時(shí),可能會(huì)導(dǎo)致無(wú)法將具有一定特征的流量路由到應(yīng)用的目標(biāo)版本。通過(guò)MSE提供的全鏈路灰度能力,您無(wú)需修改業(yè)務(wù)代碼,就可以實(shí)現(xiàn)端到端的全鏈路流量控制。泳道可以將應(yīng)用的相關(guān)版本隔離成一個(gè)獨(dú)立的運(yùn)行環(huán)境。通過(guò)設(shè)置泳道規(guī)則,可以將滿足規(guī)則的請(qǐng)求流量路由到目標(biāo)版本的應(yīng)用。本文介紹如何通過(guò)配置MSE云原生網(wǎng)關(guān)實(shí)現(xiàn)端到端的全鏈路灰度。

全鏈路灰度實(shí)現(xiàn)流程

image

使用限制

由于全鏈路灰度功能整合了標(biāo)簽路由功能(此處指的是MSE微服務(wù)治理的標(biāo)簽路由,與MSE云原生網(wǎng)關(guān)的標(biāo)簽路由無(wú)關(guān)),因此不推薦已經(jīng)加入全鏈路流量控制的應(yīng)用配置金絲雀發(fā)布和標(biāo)簽路由規(guī)則。

全鏈路灰度能力,對(duì)于Java應(yīng)用的限制詳見微服務(wù)治理支持的Java框架

場(chǎng)景示例

本文以電商架構(gòu)中的下單場(chǎng)景為例,介紹從MSE云原生網(wǎng)關(guān)到微服務(wù)的全鏈路流控功能。假設(shè)應(yīng)用的架構(gòu)由MSE云原生網(wǎng)關(guān)以及后端的微服務(wù)架構(gòu)(Spring Cloud)組成,后端調(diào)用鏈路有3個(gè):交易中心(A)、商品中心(B)、庫(kù)存中心(C),可以通過(guò)客戶端或者HTML來(lái)訪問(wèn)后端服務(wù),這些服務(wù)之間通過(guò)MSE Nacos注冊(cè)中心實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)。

客戶下單后流量從MSE云原生網(wǎng)關(guān)進(jìn)來(lái),調(diào)用交易中心(A),交易中心(A)再調(diào)用商品中心(B),商品中心(B)調(diào)用下游的庫(kù)存中心(C)。總之,調(diào)用鏈路為:客戶>MSE云原生網(wǎng)關(guān)>A>B>C。

隨著業(yè)務(wù)不斷迭代,新功能需要上線,涉及到應(yīng)用A和應(yīng)用C同時(shí)發(fā)布新版本。在新版本正式上線之前,需要同時(shí)對(duì)應(yīng)用A和應(yīng)用C進(jìn)行灰度驗(yàn)證,確認(rèn)無(wú)誤后方可正式上線。

通過(guò)MSE云原生網(wǎng)關(guān)和MSE微服務(wù)治理提供的全鏈路灰度能力,您可以端到端構(gòu)建從網(wǎng)關(guān)到多個(gè)后端服務(wù)的全鏈路灰度,控制具有一定特征的灰度流量始終路由到應(yīng)用對(duì)應(yīng)的灰度環(huán)境,滿足您同時(shí)灰度驗(yàn)證多個(gè)服務(wù)的訴求。此外,在應(yīng)用無(wú)目標(biāo)灰度版本時(shí),自動(dòng)容災(zāi)到正式環(huán)境中。

使用場(chǎng)景

名詞解釋

  • MSE云原生網(wǎng)關(guān):MSE云原生網(wǎng)關(guān)是兼容K8s Ingress標(biāo)準(zhǔn)的下一代網(wǎng)關(guān)產(chǎn)品,支持ACK容器和Nacos等多種服務(wù)發(fā)現(xiàn)方式,支持多種認(rèn)證登錄方式快速構(gòu)建安全防線。更多信息,請(qǐng)參見云原生網(wǎng)關(guān)概述

  • 泳道:為相同版本應(yīng)用定義的一套隔離環(huán)境。只有滿足了流控路由規(guī)則的請(qǐng)求流量才會(huì)路由到對(duì)應(yīng)泳道里的打標(biāo)應(yīng)用。一個(gè)應(yīng)用可以屬于多個(gè)泳道,一個(gè)泳道可以包含多個(gè)應(yīng)用,應(yīng)用和泳道是多對(duì)多的關(guān)系。

  • 泳道組:泳道的集合。泳道組的作用主要是為了區(qū)分不同團(tuán)隊(duì)或不同場(chǎng)景。

  • 基線環(huán)境:未打標(biāo)的應(yīng)用屬于基線環(huán)境,是其他環(huán)境的兜底環(huán)境。

準(zhǔn)備工作

創(chuàng)建Kubernetes集群

具體操作,請(qǐng)參見創(chuàng)建ACK專有集群創(chuàng)建ACK托管集群

開啟MSE微服務(wù)治理

重要

請(qǐng)確保MSE Java 探針的版本3.2.3及以上,否則會(huì)影響業(yè)務(wù)運(yùn)行。

  1. MSE微服務(wù)治理開通頁(yè)面,開通微服務(wù)治理專業(yè)版。

  2. 將ACK微服務(wù)應(yīng)用接入MSE治理中心,您可以選擇您需要的方式實(shí)現(xiàn)應(yīng)用接入。更多信息,請(qǐng)參見ACK微服務(wù)應(yīng)用接入MSE治理中心

    為ACK命名空間中的應(yīng)用開啟MSE微服務(wù)治理

    1. 登錄MSE治理中心控制臺(tái),并在頂部菜單欄選擇地域。

    2. 在左側(cè)導(dǎo)航欄,選擇治理中心 > 應(yīng)用治理

    3. 應(yīng)用列表頁(yè)面,單擊ACK應(yīng)用接入

    4. ACK應(yīng)用接入對(duì)話框中,進(jìn)行配置,配置完成后,單擊確定

      image

      配置項(xiàng)

      說(shuō)明

      集群類型

      選擇ACK集群或者ACK Serverless集群

      說(shuō)明

      如果您尚未授權(quán)容器服務(wù)調(diào)用微服務(wù)引擎,則需要單擊請(qǐng)授權(quán)進(jìn)行授權(quán)。

      集群名稱/ID

      選擇接入MSE微服務(wù)治理的集群名稱/ID,可通過(guò)關(guān)鍵詞搜索。

      ack-onepilot

      顯示ack-onepilot接入狀態(tài)。

      • 如果您未安裝ack-onepilot,單擊ack-onepilot右側(cè)的點(diǎn)擊安裝,安裝完成后狀態(tài)會(huì)顯示為已安裝

      • 如果您使用子賬號(hào)接入,提示沒有權(quán)限使用時(shí),您可以登錄容器服務(wù)管理控制臺(tái)進(jìn)入目標(biāo)集群,然后單擊運(yùn)維管理>組件管理,然后找到ack-onepilot,點(diǎn)擊安裝。

      說(shuō)明
      • 該步驟接入的組件為ack-onepilot,您可以登錄容器服務(wù)管理控制臺(tái)進(jìn)入目標(biāo)集群,然后單擊運(yùn)維管理>組件管理查看詳情。

      • ack-onepilot安裝后會(huì)自動(dòng)注入探針,可能會(huì)導(dǎo)致應(yīng)用啟動(dòng)耗時(shí)增加(10s內(nèi))。

      接入類型

      選擇命名空間接入

      容器集群命名空間

      選擇容器集群命名空間

      治理命名空間

      選擇治理命名空間。在對(duì)應(yīng)命名空間下重新部署現(xiàn)有應(yīng)用或新創(chuàng)建的應(yīng)用,均會(huì)接入到MSE微服務(wù)治理中。關(guān)于命名空間的相關(guān)信息,請(qǐng)參見微服務(wù)命名空間管理

    為單個(gè)應(yīng)用開啟MSE微服務(wù)治理

    1. 登錄MSE治理中心控制臺(tái),并在頂部菜單欄選擇地域。

    2. 在左側(cè)導(dǎo)航欄,選擇治理中心 > 應(yīng)用治理

    3. 應(yīng)用列表頁(yè)面,單擊ACK應(yīng)用接入

    4. ACK應(yīng)用接入對(duì)話框中,進(jìn)行配置,配置完成后,單擊確定

      image

      配置項(xiàng)

      說(shuō)明

      集群類型

      選擇ACK集群或者ACK Serverless集群

      說(shuō)明

      如果您尚未授權(quán)容器服務(wù)調(diào)用微服務(wù)引擎,則需要單擊請(qǐng)授權(quán)進(jìn)行授權(quán)。

      集群名稱/ID

      選擇接入MSE微服務(wù)治理的集群名稱/ID,可通過(guò)關(guān)鍵詞搜索。

      ack-onepilot

      顯示ack-onepilot接入狀態(tài)。

      • 如果您未安裝ack-onepilot,單擊ack-onepilot右側(cè)的點(diǎn)擊安裝,安裝完成后狀態(tài)會(huì)顯示為已安裝

      • 如果您使用子賬號(hào)接入,提示沒有權(quán)限使用時(shí),您可以登錄容器服務(wù)管理控制臺(tái)進(jìn)入目標(biāo)集群,然后單擊運(yùn)維管理>組件管理,然后找到ack-onepilot,點(diǎn)擊安裝。

      說(shuō)明
      • 該步驟接入的組件為ack-onepilot,您可以登錄容器服務(wù)管理控制臺(tái)進(jìn)入目標(biāo)集群,然后單擊運(yùn)維管理>組件管理查看詳情。

      • ack-onepilot安裝后會(huì)自動(dòng)注入探針,可能會(huì)導(dǎo)致應(yīng)用啟動(dòng)耗時(shí)增加(10s內(nèi))。

      接入類型

      選擇單個(gè)應(yīng)用接入

      接入步驟

      按照接入步驟進(jìn)行操作。

      Step 1:進(jìn)入集群工作負(fù)載-無(wú)狀態(tài)應(yīng)用頁(yè)面,切換到應(yīng)用的命名空間下

      Step 2:找到所接入的應(yīng)用,點(diǎn)擊「查看Yaml」

      Step 3:按以下格式編輯Labels,完成后點(diǎn)擊「更新」

      spec:
        template:
          metadata:
            labels:
              # 填寫“on”表示開啟接入,需加上雙引號(hào)
              msePilotAutoEnable: "on"
              # 填寫接入到的治理命名空間,值不存在可自動(dòng)新建
              mseNamespace: 202401
              # 填寫接入MSE的實(shí)際應(yīng)用名稱,需加上雙引號(hào)
              msePilotCreateAppName: "your-deployment-name"

創(chuàng)建MSE云原生網(wǎng)關(guān)

具體操作,請(qǐng)參見創(chuàng)建MSE云原生網(wǎng)關(guān)

為云原生網(wǎng)關(guān)關(guān)聯(lián)服務(wù)來(lái)源

具體操作,請(qǐng)參見創(chuàng)建服務(wù)來(lái)源

說(shuō)明
  • 基于MSE云原生網(wǎng)關(guān)的全鏈路灰度目前暫只支持容器服務(wù)和MSE Nacos兩種來(lái)源。

  • MSE云原生網(wǎng)關(guān)與容器服務(wù)的Kubernetes集群/MSE Nacos需要處于同一VPC。

步驟一:搭建業(yè)務(wù)應(yīng)用的基線環(huán)境

步驟1:部署后端業(yè)務(wù)應(yīng)用的基線版本

  1. 登錄容器服務(wù)控制臺(tái)
  2. 在左側(cè)導(dǎo)航欄,單擊集群,然后單擊目標(biāo)集群名稱。
  3. 在左側(cè)導(dǎo)航欄,選擇工作負(fù)載 > 無(wú)狀態(tài)
  4. 在頁(yè)面上方,選擇集群的命名空間,然后單擊右上角的使用YAML創(chuàng)建資源
  5. 部署基線應(yīng)用。

    服務(wù)來(lái)源為MSE Nacos

    復(fù)制如下YAML文件內(nèi)容,部署A、B、C三個(gè)應(yīng)用的基線版本。

    說(shuō)明

    代碼中的{nacos server address}需要替換成您創(chuàng)建的MSE Nacos的內(nèi)網(wǎng)域名,同時(shí)需要去掉大括號(hào){}

    展開查看YAML文件

    # 應(yīng)用A的基線版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-a
      template:
        metadata:
          labels:
            app: spring-cloud-a
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-a
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20001
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'
    ---
    # 應(yīng)用B的基線版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-b
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-b
      template:
        metadata:
          labels:
            app: spring-cloud-b
            msePilotCreateAppName: spring-cloud-b
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-b
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20002
            livenessProbe:
              tcpSocket:
                port: 20002
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'
    ---
    # 應(yīng)用C的基線版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-c
      template:
        metadata:
          labels:
            app: spring-cloud-c
            msePilotCreateAppName: spring-cloud-c
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-c
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20003
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'

    服務(wù)來(lái)源為容器服務(wù)

    1. 復(fù)制如下YAML文件,部署Nacos,模擬自建服務(wù)注冊(cè)中心的場(chǎng)景。

      展開查看YAML文件

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nacos-server
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nacos-server
        template:
          metadata:
            labels:
              msePilotAutoEnable: "off"
              app: nacos-server
          spec:
            containers:
              - name: nacos-server
                image: 'registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/nacos-server:v2.1.2'
                env:
                  - name: MODE
                    value: standalone
                  - name: JVM_XMS
                    value: 512M
                  - name: JVM_XMX
                    value: 512M
                  - name: JVM_XMN
                    value: 256M
                imagePullPolicy: Always
                livenessProbe:
                  failureThreshold: 3
                  initialDelaySeconds: 15
                  periodSeconds: 10
                  successThreshold: 1
                  tcpSocket:
                    port: 8848
                  timeoutSeconds: 3
                readinessProbe:
                  failureThreshold: 5
                  initialDelaySeconds: 15
                  periodSeconds: 15
                  successThreshold: 1
                  tcpSocket:
                    port: 8848
                  timeoutSeconds: 3
                resources:
                  requests:
                    cpu: '1'
                    memory: 2Gi
            dnsPolicy: ClusterFirst
            restartPolicy: Always
      
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: nacos-server
      spec:
        type: ClusterIP
        ports:
          - name: nacos-server-8848-8848
            port: 8848
            protocol: TCP
            targetPort: 8848
          - name: nacos-server-9848-9848
            port: 9848
            protocol: TCP
            targetPort: 9848
        selector:
          app: nacos-server
    2. 復(fù)制如下YAML文件,部署A、B、C三個(gè)應(yīng)用的基線版本。

      展開查看YAML文件

      # 應(yīng)用A的基線版本
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-a
        namespace: default
      spec:
        selector:
          matchLabels:
            app: spring-cloud-a
        template:
          metadata:
            labels:
              app: spring-cloud-a
              msePilotCreateAppName: spring-cloud-a
              msePilotAutoEnable: 'on'
          spec:
            containers:
            - name: spring-cloud-a
              image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
              imagePullPolicy: Always
              ports:
                - containerPort: 20001
              livenessProbe:
                tcpSocket:
                  port: 20001
                initialDelaySeconds: 30
                periodSeconds: 60
              # 通過(guò)Nacos的Service訪問(wèn)自建Nacos
              env:
              - name: spring.cloud.nacos.discovery.server-addr
                value: nacos-server
              - name: dubbo.registry.address
                value: 'nacos://nacos-server:8848'
      ---
      # 應(yīng)用B的基線版本
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-b
        namespace: default
      spec:
        selector:
          matchLabels:
            app: spring-cloud-b
        template:
          metadata:
            labels:
              app: spring-cloud-b
              msePilotCreateAppName: spring-cloud-b
              msePilotAutoEnable: 'on'
          spec:
            containers:
            - name: spring-cloud-b
              image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
              imagePullPolicy: Always
              ports:
                - containerPort: 20002
              livenessProbe:
                tcpSocket:
                  port: 20002
                initialDelaySeconds: 30
                periodSeconds: 60
              # 通過(guò)Nacos的Service訪問(wèn)自建Nacos
              env:
              - name: spring.cloud.nacos.discovery.server-addr
                value: nacos-server
              - name: dubbo.registry.address
                value: 'nacos://nacos-server:8848'
      ---
      # 應(yīng)用C的基線版本
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-c
        namespace: default
      spec:
        selector:
          matchLabels:
            app: spring-cloud-c
        template:
          metadata:
            labels:
              app: spring-cloud-c
              msePilotCreateAppName: spring-cloud-c
              msePilotAutoEnable: 'on'
          spec:
            containers:
            - name: spring-cloud-c
              image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
              imagePullPolicy: Always
              ports:
                - containerPort: 20003
              livenessProbe:
                tcpSocket:
                  port: 20003
                initialDelaySeconds: 30
                periodSeconds: 60
              # 通過(guò)Nacos的Service訪問(wèn)自建Nacos
              env:
              - name: spring.cloud.nacos.discovery.server-addr
                value: nacos-server
              - name: dubbo.registry.address
                value: 'nacos://nacos-server:8848'
    3. 復(fù)制如下YAML文件,為入口應(yīng)用A創(chuàng)建Service。

      展開查看YAML文件

      # 暴露應(yīng)用A
      apiVersion: v1
      kind: Service
      metadata:
        name: sc-a
        namespace: default
      spec:
        ports:
          - port: 20001
            protocol: TCP
            targetPort: 20001
        selector:
          app: spring-cloud-a
        type: ClusterIP

步驟2:通過(guò)MSE云原生網(wǎng)關(guān)暴露應(yīng)用A

情況一:新服務(wù)

如果您未在云原生網(wǎng)關(guān)上添加過(guò)應(yīng)用A,可以通過(guò)如下操作暴露應(yīng)用A。

  1. 登錄MSE管理控制臺(tái)。選擇云原生網(wǎng)關(guān) > 網(wǎng)關(guān)列表,選擇已創(chuàng)建的云原生網(wǎng)關(guān)實(shí)例。在左側(cè)導(dǎo)航欄路由管理頁(yè)面,選擇服務(wù)頁(yè)簽,單擊創(chuàng)建服務(wù)。具體操作,請(qǐng)參見創(chuàng)建服務(wù)

    • 來(lái)源為容器服務(wù)

      • 服務(wù)來(lái)源選擇容器服務(wù)

      • 命名空間選擇default。

      • 服務(wù)列表選擇sc-a。

    • 來(lái)源為MSE Nacos

      • 服務(wù)來(lái)源:選擇MSE Nacos

      • 命名空間:選擇public。

      • 服務(wù)列表:選擇sc-A

  2. 單擊目標(biāo)服務(wù)sc-a / sc-A,在服務(wù)版本區(qū)域查看sc-a / sc-A的服務(wù)版本配置是否滿足如下條件:

    • 版本名稱base

    • 標(biāo)簽名opensergo.io/canary

    • 標(biāo)簽值為空。

    image

    正常情況下,云原生網(wǎng)關(guān)默認(rèn)為導(dǎo)入的Nacos的服務(wù)和容器服務(wù)的服務(wù)添加以上base版本,且base版本的實(shí)例數(shù)大于0。

  3. 路由管理頁(yè)面,選擇路由頁(yè)簽。單擊創(chuàng)建路由,為服務(wù)sc-a / sc-A創(chuàng)建路由完成對(duì)外暴露。具體操作,請(qǐng)參見創(chuàng)建路由

    配置項(xiàng)

    描述

    路徑(Path)

    選擇匹配條件為前綴是,路徑為/a。

    使用場(chǎng)景

    選擇按標(biāo)簽(標(biāo)簽路由)

    后端服務(wù)

    選擇sc-a / sc-A,服務(wù)的版本選擇base

    Fallback

    開啟Fallback開關(guān)。選擇sc-a / sc-A,服務(wù)的版本選擇不限制

    image

    說(shuō)明

    請(qǐng)確保后端服務(wù)這里有且只有base版本,否則在全鏈路灰度頁(yè)面無(wú)法選擇此路由。

情況二:線上已有服務(wù)

如果您的實(shí)際場(chǎng)景是針對(duì)已導(dǎo)入的服務(wù),可通過(guò)如下操作暴露應(yīng)用A。

  1. 登錄MSE管理控制臺(tái)。選擇云原生網(wǎng)關(guān) > 網(wǎng)關(guān)列表,選擇已創(chuàng)建的云原生網(wǎng)關(guān)實(shí)例。在左側(cè)導(dǎo)航欄路由管理頁(yè)面,選擇服務(wù)頁(yè)簽。單擊目標(biāo)服務(wù),在服務(wù)版本區(qū)域查看服務(wù)版本信息。

    正常情況下,該服務(wù)不存在版本名稱為base,標(biāo)簽名為opensergo.io/canary,標(biāo)簽值為空的服務(wù)版本。

  2. 重新部署服務(wù)A。

  3. 服務(wù)版本區(qū)域,單擊添加新版本,配置如下參數(shù),然后單擊操作列的對(duì)勾圖標(biāo)保存設(shè)置。最后確認(rèn)base版本的實(shí)例數(shù)是否大于0。

    • 版本名稱設(shè)置為base

    • 標(biāo)簽名設(shè)置為opensergo.io/canary

    • 標(biāo)簽值為空。

  4. 路由管理頁(yè)面,選擇路由頁(yè)簽。編輯已有的路由,用于暴露服務(wù)。

    配置項(xiàng)

    描述

    路徑(Path)

    選擇匹配條件為前綴是,路徑為/a。

    使用場(chǎng)景

    選擇按標(biāo)簽(標(biāo)簽路由)

    后端服務(wù)

    選擇已有服務(wù),服務(wù)的版本選擇base

    Fallback

    開啟Fallback開關(guān)。選擇已有服務(wù),服務(wù)的版本選擇不限制,使服務(wù)達(dá)到高可用的目的。

    image

    說(shuō)明

    請(qǐng)確保后端服務(wù)這里有且只有base版本,否則在全鏈路灰度頁(yè)面無(wú)法選擇此路由。

步驟3:測(cè)試基線版本流量

  1. 登錄MSE網(wǎng)關(guān)管理控制臺(tái),并在頂部菜單欄選擇地域。

  2. 在左側(cè)導(dǎo)航欄,選擇云原生網(wǎng)關(guān) > 網(wǎng)關(guān)列表,單擊目標(biāo)網(wǎng)關(guān)名稱。

  3. 在左側(cè)導(dǎo)航欄,單擊基本概覽

  4. 網(wǎng)關(guān)入口頁(yè)簽,查看SLB的入口地址

  5. 使用curl命令,測(cè)試基線版本流量,發(fā)現(xiàn)流量經(jīng)過(guò)了A、B和C的基線版本。如下所示:

    # 測(cè)試命令
    curl x.x.1.1/a
    
    # 測(cè)試結(jié)果
    A[10.0.3.178][config=base] -> B[10.0.3.195] -> C[10.0.3.201]%

    如測(cè)試結(jié)果所示,B和C輸出結(jié)果的應(yīng)用名后面沒有版本,則代表訪問(wèn)對(duì)應(yīng)應(yīng)用的基線版本。

步驟二:搭建業(yè)務(wù)應(yīng)用的灰度環(huán)境

如果業(yè)務(wù)應(yīng)用要發(fā)布新功能,新功能要求應(yīng)用A和應(yīng)用C同時(shí)發(fā)版,這時(shí)就需要借助全鏈路灰度來(lái)同時(shí)驗(yàn)證不同應(yīng)用的灰度版本。

步驟1:部署后端業(yè)務(wù)應(yīng)用的灰度版本

  1. 登錄容器服務(wù)控制臺(tái)
  2. 在左側(cè)導(dǎo)航欄,單擊集群,然后單擊目標(biāo)集群名稱。
  3. 在左側(cè)導(dǎo)航欄,選擇工作負(fù)載 > 無(wú)狀態(tài)
  4. 在頁(yè)面上方,選擇集群的命名空間,然后單擊右上角的使用YAML創(chuàng)建資源
  5. 復(fù)制以下YAML文件內(nèi)容,部署A、C兩個(gè)應(yīng)用的灰度版本。

    服務(wù)來(lái)源為MSE Nacos

    說(shuō)明

    代碼中的{nacos server address}需要替換成您創(chuàng)建的MSE Nacos的內(nèi)網(wǎng)域名,同時(shí)需要去掉大括號(hào){}

    展開查看YAML文件

    # 應(yīng)用A的灰度版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a-gray
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-a-gray
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-a-gray
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-a
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20001
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'
    ---
    # 應(yīng)用C的灰度版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c-gray
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-c-gray
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-c-gray
            msePilotCreateAppName: spring-cloud-c
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-c
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20003
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'

    服務(wù)來(lái)源為容器服務(wù)

    展開查看YAML文件

    # 應(yīng)用A的灰度版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a-gray
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-a
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-a
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-a
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20001
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 30
              periodSeconds: 60
            # 通過(guò)Nacos的Service訪問(wèn)自建Nacos
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: nacos-server
            - name: dubbo.registry.address
              value: 'nacos://nacos-server:8848'
    
    ---
    # 應(yīng)用C的灰度版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c-gray
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-c
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-c
            msePilotCreateAppName: spring-cloud-c
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-c
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20003
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 30
              periodSeconds: 60
            # 通過(guò)Nacos的Service訪問(wèn)自建Nacos
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: nacos-server
            - name: dubbo.registry.address
              value: 'nacos://nacos-server:8848'

步驟2:創(chuàng)建灰度環(huán)境泳道組

  1. 登錄MSE治理中心控制臺(tái),并在頂部菜單欄選擇地域。

  2. 在左側(cè)導(dǎo)航欄,選擇治理中心 > 全鏈路灰度

  3. 單擊創(chuàng)建泳道組及泳道。如果您選擇的微服務(wù)空間內(nèi)已經(jīng)創(chuàng)建過(guò)泳道組,則單擊創(chuàng)建泳道組

  4. 創(chuàng)建泳道組面板,單擊+ 創(chuàng)建泳道組,在創(chuàng)建泳道組頁(yè)面,設(shè)置如下相關(guān)配置,然后單擊確定

    配置項(xiàng)

    說(shuō)明

    泳道組名稱

    自定義泳道組的名稱。

    入口類型

    選擇MSE 云原生網(wǎng)關(guān)

    泳道組流量入口

    選擇目標(biāo)云原生網(wǎng)關(guān)。

    泳道組涉及應(yīng)用

    選擇spring-cloud-aspring-cloud-bspring-cloud-c

    創(chuàng)建泳道組.png

    泳道組創(chuàng)建完成后,在全鏈路灰度頁(yè)面的泳道組區(qū)域,可以查看您創(chuàng)建的泳道組。如需變更泳道組信息,單擊編輯圖標(biāo),可在頁(yè)面自行修改相關(guān)信息。

步驟3:創(chuàng)建灰度環(huán)境泳道

說(shuō)明
  • 使用全鏈路灰度功能時(shí),需要您給灰度應(yīng)用添加一個(gè)特殊的 tag 標(biāo)記,以便將這些節(jié)點(diǎn)和其他節(jié)點(diǎn)區(qū)分開來(lái)。容器環(huán)境下需要您在spec.template.metadata.labels下增加alicloud.service.tag: ${tag}信息,ECS環(huán)境下需要添加Java啟動(dòng)參數(shù)-Dalicloud.service.tag=${tag}

  • 以云原生網(wǎng)關(guān)作為全鏈路灰度入口時(shí),MSE支持兩種泳道灰度模式。

    • 按請(qǐng)求內(nèi)容灰度:當(dāng)請(qǐng)求內(nèi)容可以用于灰度識(shí)別時(shí),建議采用此種灰度模式。如果不可以,也強(qiáng)烈建議您通過(guò)系統(tǒng)改造增加此類灰度標(biāo)識(shí),以便獲得更好的灰度效果。比如,可以保持灰度請(qǐng)求前后的一致性。

    • 按比例路由灰度:當(dāng)請(qǐng)求內(nèi)容無(wú)法用于灰度識(shí)別且遺留系統(tǒng)也無(wú)法進(jìn)行改造時(shí),可以采用此種退化的灰度模式。該模式有一定弊端,可能導(dǎo)致同一來(lái)源的請(qǐng)求進(jìn)入不同泳道,而造成灰度請(qǐng)求前后行為的不一致。

  • 泳道路由模式在一個(gè)泳道組中需要保持一致。您只有在創(chuàng)建泳道組中第一條泳道時(shí)可以調(diào)整泳道路由的灰度模式。

  1. 全鏈路灰度頁(yè)面底部,單擊點(diǎn)擊創(chuàng)建第一個(gè)分流泳道。如果您選擇的微服務(wù)空間內(nèi)已經(jīng)創(chuàng)建過(guò)泳道,則單擊創(chuàng)建泳道

  2. 創(chuàng)建泳道面板,設(shè)置流控泳道相關(guān)配置,然后單擊確定

    創(chuàng)建按請(qǐng)求內(nèi)容路由的泳道

    配置項(xiàng)

    說(shuō)明

    配置節(jié)點(diǎn)標(biāo)簽

    需要您給灰度應(yīng)用節(jié)點(diǎn)打上標(biāo)簽,用來(lái)和正常節(jié)點(diǎn)做區(qū)分。

    填寫泳道信息

    泳道標(biāo)簽:該泳道內(nèi)的匹配的流量去往的目標(biāo)標(biāo)簽。

    確認(rèn)匹配關(guān)系:檢查您配置了該標(biāo)簽的應(yīng)用節(jié)點(diǎn)數(shù)是否符合預(yù)期。

    路由和灰度規(guī)則

    設(shè)置流量進(jìn)入該泳道的規(guī)則。

    • 網(wǎng)關(guān)基線路由:選擇在步驟一創(chuàng)建的基線路由test。

    • 泳道路由模式(泳道組內(nèi)需保持一致):選擇按請(qǐng)求內(nèi)容路由

    • 條件列表:?jiǎn)螕粝路降?b data-tag="uicontrol" id="uicontrol-fut-dwi-mpe" class="uicontrol">+添加新的規(guī)則條件,新增規(guī)則條件。

      本示例灰度條件配置如下:

      • 參數(shù)類型:Header。

      • 參數(shù):canary。

      • 條件:精確匹配。

      • :gray。

    創(chuàng)建按比例路由的泳道

    說(shuō)明

    創(chuàng)建按比例路由的泳道,需要ack-onepilot版本為3.0.18及以上,且探針版本為3.2.3及以上。

    配置項(xiàng)

    說(shuō)明

    配置節(jié)點(diǎn)標(biāo)簽

    需要您手工給您的灰度應(yīng)用節(jié)點(diǎn)打上標(biāo)簽,用來(lái)和正常節(jié)點(diǎn)做區(qū)分。

    填寫泳道信息

    泳道標(biāo)簽:該泳道內(nèi)的匹配的流量去往的目標(biāo)標(biāo)簽。

    確認(rèn)匹配關(guān)系:檢查您配置了該標(biāo)簽的應(yīng)用節(jié)點(diǎn)數(shù)是否符合預(yù)期。

    路由和灰度規(guī)則

    設(shè)置流量進(jìn)入該泳道的規(guī)則。

    • 網(wǎng)關(guān)基線路由:選擇在步驟一創(chuàng)建的基線路由test。

    • 泳道路由模式(泳道組內(nèi)需保持一致):選擇按比例路由

    • 流量比例:30%。

    說(shuō)明

    您還可以為每條網(wǎng)關(guān)基線路由分別設(shè)置不同的流量比例,開啟該功能時(shí),您需要注意該網(wǎng)關(guān)基線路由已經(jīng)當(dāng)前在所有泳道組中配置的流量比例總和不應(yīng)超過(guò) 100%。

完成泳道創(chuàng)建后,在全鏈路灰度流量分配區(qū)域,可以查看泳道詳情,還可以進(jìn)行如下操作。

  • 操作列,選擇開啟,創(chuàng)建的泳道將會(huì)生效,即流量會(huì)按照泳道方式進(jìn)行流轉(zhuǎn),滿足規(guī)則的流量會(huì)優(yōu)先流向標(biāo)記有當(dāng)前泳道對(duì)應(yīng)標(biāo)簽的應(yīng)用版本,如果沒有對(duì)應(yīng)標(biāo)簽的應(yīng)用版本則流向未打標(biāo)的應(yīng)用版本。

  • 操作列,選擇關(guān)閉,關(guān)閉創(chuàng)建的泳道,即該應(yīng)用往后的流量會(huì)流向未打標(biāo)的應(yīng)用版本。

  • 單擊圖標(biāo)圖標(biāo),可以查看該泳道的流量比例。

  • 單擊應(yīng)用狀態(tài)圖標(biāo)圖標(biāo),可以設(shè)置該泳道上應(yīng)用的狀態(tài)。

步驟4:測(cè)試灰度版本流量

測(cè)試按請(qǐng)求內(nèi)容路由的泳道

使用curl命令測(cè)試灰度流量。

# 測(cè)試命令
curl -H "canary: gray" x.x.x.x/a

# 測(cè)試結(jié)果
Agray[10.0.3.177][config=base] -> B[10.0.3.195] -> Cgray[10.0.3.180]

如測(cè)試結(jié)果所示,流量經(jīng)過(guò)了A、C的灰度環(huán)境,由于B沒有g(shù)ray環(huán)境,所以流量自動(dòng)容災(zāi)到基線版本。

測(cè)試按比例路由的泳道

可以通過(guò)如下Python腳本測(cè)試按比例路由的分流情況(需要安裝requests包),并將“x.x.x.x”替換為云原生網(wǎng)關(guān)的入口SLB地址。

展開查看Python腳本

# pip3 install requests
# python3 traffic.py
import requests


TOTAL_REQUEST = 100
ENTRY_URL = 'http://x.x.x.x/a'

def parse_tag(text:str):
    '''
    A[10.0.23.64][config=base] -> B[10.0.23.65] -> C[10.0.23.61]
    Agray[10.0.23.64][config=base] -> B[10.0.23.65] -> Cgray[10.0.23.61]
    Ablue[10.0.23.64][config=base] -> B[10.0.23.65] -> Cblue[10.0.23.61]
    '''
    print(text)
    app_parts = text.split(' -> ')
    # tag_app: C[10.0.23.61] / Cgray[10.0.23.61]
    tag_app = app_parts[-1]
    
    splits = tag_app.split('[')
    
    # tag_part: C / Cgray
    tag_part = splits[0]
    tag = tag_part[1:]
    return tag if len(tag) > 0 else 'base'

def get_tag(url:str):
    resp = requests.get(url)
    resp.encoding = resp.apparent_encoding
    return parse_tag(resp.text)

def cal_tag_count(url:str, total_request:int):
    count_map = {}
    for i in range(total_request):
        tag = get_tag(url)
        if tag not in count_map:
            count_map[tag] = 1
        else:
            count_map[tag] += 1

    print()
    print('Total Request:', total_request)
    print('Traffic Distribution:', count_map)


if __name__ == '__main__':
    cal_tag_count(ENTRY_URL, TOTAL_REQUEST)

從結(jié)果可以看到,約有30%比例的流量去往了灰度環(huán)境。

image.png

(可選)步驟三:可觀測(cè)

若應(yīng)用出現(xiàn)異常,您可以通過(guò)MSE提供的可觀測(cè)能力查看異常數(shù)據(jù),幫助您快速定位問(wèn)題。

云原生網(wǎng)關(guān)可觀測(cè)

在MSE云原生網(wǎng)關(guān)的路由管理頁(yè)面,選擇服務(wù)頁(yè)簽。單擊目標(biāo)服務(wù),在基礎(chǔ)監(jiān)控區(qū)域查看服務(wù)各個(gè)版本的流量情況。

基礎(chǔ)監(jiān)控

  • QPS:該應(yīng)用各個(gè)版本的QPS數(shù)據(jù)。

  • Errors:該應(yīng)用各個(gè)版本的出錯(cuò)請(qǐng)求數(shù)。

  • RT(ms):該應(yīng)用各個(gè)版本的請(qǐng)求響應(yīng)耗時(shí)。

微服務(wù)治理可觀測(cè)

在MSE微服務(wù)治理的全鏈路灰度頁(yè)面,單擊目標(biāo)應(yīng)用,在應(yīng)用 QPS 監(jiān)控區(qū)域,可查看對(duì)應(yīng)泳道基線版本和灰度版本的流量情況。

應(yīng)用監(jiān)控

  • 總QPS:該應(yīng)用總的QPS。

  • 異常QPS:該應(yīng)用出錯(cuò)的請(qǐng)求數(shù)。

  • gray:該應(yīng)用gray版本的QPS。