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

基于自建Spring Cloud Gateway或Zuul網(wǎng)關(guān)實(shí)現(xiàn)全鏈路灰度

更新時(shí)間:

Spring Cloud Gateway和Zuul是兩種常用的微服務(wù)架構(gòu)中的API網(wǎng)關(guān),它們均能實(shí)現(xiàn)路由轉(zhuǎn)發(fā)和過(guò)濾器處理等功能。通過(guò)配置路由規(guī)則,可以將請(qǐng)求路由到灰度環(huán)境中,對(duì)灰度版本進(jìn)行驗(yàn)證和測(cè)試。借助MSE提供的全鏈路灰度能力,您無(wú)需修改業(yè)務(wù)代碼,即可實(shí)現(xiàn)端到端的全鏈路流量控制。本文介紹如何通過(guò)配置Spring Cloud Gateway或者Zuul網(wǎng)關(guān)實(shí)現(xiàn)全鏈路灰度。

前提條件

背景信息

本文通過(guò)模擬真實(shí)的調(diào)用鏈路為您演示MSE全鏈路灰度功能。您無(wú)需修改任何業(yè)務(wù)代碼,只需要給入口應(yīng)用設(shè)置流量規(guī)則,該流量的標(biāo)簽會(huì)通過(guò)鏈路透?jìng)鞯较乱粋€(gè)灰度版本中。在每個(gè)應(yīng)用的調(diào)用過(guò)程中,符合金絲雀條件的流量會(huì)優(yōu)先調(diào)用對(duì)應(yīng)的版本,如果沒有對(duì)應(yīng)版本則會(huì)自動(dòng)切換回基線版本(即穩(wěn)定版本)。

部署spring-cloud-gateway、spring-cloud-a、spring-cloud-b、spring-cloud-c這四個(gè)業(yè)務(wù)應(yīng)用,以及注冊(cè)中心Nacos Server。調(diào)用鏈路為:spring-cloud-gateway->A->B->C。

應(yīng)用之間的調(diào)用既包含了Spring Cloud服務(wù)調(diào)用,也包含了Dubbo服務(wù)調(diào)用。

image

全鏈路灰度提供了給流量染色,并讓灰度流量?jī)?yōu)先調(diào)用灰度節(jié)點(diǎn)的能力,幫助您進(jìn)行可控的灰度驗(yàn)證,保障穩(wěn)定性。

全鏈路灰度驗(yàn)證通常采用以下策略:

  • 直接調(diào)用現(xiàn)有線上流量的一小部分進(jìn)行測(cè)試,通常按照百分比控制。

  • 按照特定規(guī)則篩選線上流量進(jìn)行驗(yàn)證,如使用指定的Header或Cookie等。

本文將分別介紹上述兩種策略配置方式,以便適應(yīng)微服務(wù)架構(gòu)中不同的灰度發(fā)布需求。

步驟一:將應(yīng)用接入MSE微服務(wù)治理

將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集群ACS集群

    說(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集群ACS集群

    說(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"

步驟二:部署應(yīng)用(模擬線上場(chǎng)景)

  1. 登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群

  2. 集群列表頁(yè)面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇工作負(fù)載 > 無(wú)狀態(tài)

  3. 無(wú)狀態(tài)頁(yè)面選擇命名空間,然后單擊使用YAML創(chuàng)建資源

    本文示例中部署一個(gè)注冊(cè)中心Nacos Server,然后部署spring-cloud-gateway、spring-cloud-a、spring-cloud-b、spring-cloud-c這四個(gè)業(yè)務(wù)應(yīng)用。您也可以直接在Demo中獲取對(duì)應(yīng)的源碼。

    • 注冊(cè)中心Nacos Server YAML

      展開查看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
    • spring-cloud-c應(yīng)用YAML

      展開查看YAML文件

      # Source: mse-simple-demo/templates/spring-cloud-c-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-c
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-c
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-c"
              app: "spring-cloud-c"
          spec:
            containers:
              - name: spring-cloud-c
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                - name: http-port
                  containerPort: 20003
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • spring-cloud-b應(yīng)用YAML

      展開查看YAML文件

      # Source: mse-simple-demo/templates/spring-cloud-b-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-b
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-b
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-b"
              app: "spring-cloud-b"
          spec:
            containers:
              - name: spring-cloud-b
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - name: http-port
                    containerPort: 20002
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • spring-cloud-a應(yīng)用YAML

      展開查看YAML文件

      # Source: mse-simple-demo/templates/spring-cloud-a-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-a
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-a
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-a"
              app: "spring-cloud-a"
          spec:
            containers:
              - name: spring-cloud-a
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - name: http-port
                    containerPort: 20001
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • spring-cloud-gateway應(yīng)用YAML

      展開查看YAML文件

      # Source: mse-simple-demo/templates/spring-cloud-gateway-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-gateway
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-gateway
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-gateway"
              app: spring-cloud-gateway
          spec:
            containers:
              - image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-gateway:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                  - name: enable.auto
                    value: "true"
                  - name: enable.rpc.invoke
                    value: "true"
                  - name: enable.sql
                    value: "false"
                  - name: enable.sentinel.demo.flow
                    value: "true"
                name: "spring-cloud-gateway"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - containerPort: 20000
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
      ---
      # Source: mse-simple-demo/templates/spring-cloud-gateway-service.yaml
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
          service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
        name: spring-cloud-gateway-slb
      spec:
        ports:
          - port: 80
            protocol: TCP
            targetPort: 20000
        selector:
          app: spring-cloud-gateway
        type: LoadBalancer

    執(zhí)行以下命令查看部署結(jié)果:

    kubectl get svc,deploy

    預(yù)期輸出:

    NAME                               TYPE           CLUSTER-IP   EXTERNAL-IP  PORT(S)             AGE
    service/kubernetes                 ClusterIP      172.16.x.x   <none>       443/TCP             23h
    service/nacos-server               ClusterIP      172.16.x.x   <none>       8848/TCP,9848/TCP   94s
    service/spring-cloud-gateway-slb   LoadBalancer   172.16.x.x   8.130.x.x    80:32641/TCP        57s
    
    NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/nacos-server           1/1     1            1           94s
    deployment.apps/spring-cloud-a         1/1     1            1           66s
    deployment.apps/spring-cloud-b         1/1     1            1           74s
    deployment.apps/spring-cloud-c         1/1     1            1           83s
    deployment.apps/spring-cloud-gateway   1/1     1            1           57s

步驟三:部署spring-cloud-c、spring-cloud-a應(yīng)用的灰度版本

  1. 登錄容器服務(wù)管理控制臺(tái)使用如下YAML部署spring-cloud-c應(yīng)用的灰度版本:

    展開查看YAML文件

    # Source: mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c-gray
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: spring-cloud-c-gray
          version: gray
      template:
        metadata:
          labels:
            msePilotAutoEnable: "on"
            msePilotCreateAppName: "spring-cloud-c"
            alicloud.service.tag: gray
            app: "spring-cloud-c-gray"
            version: gray
        spec:
          containers:
            - name: spring-cloud-c
              image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1"
              imagePullPolicy: Always
              env:
                - name: nacos.host
                  value: "nacos-server"
                - name: nacos.namespace
                  value: "public"
              resources:
                requests:
                  cpu: 1
                  memory: 2Gi
                limits:
                  cpu: 1
                  memory: 2Gi
              ports:
                - name: http-port
                  containerPort: 20002
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
                - podAffinityTerm:
                    topologyKey: failure-domain.beta.kubernetes.io/zone
                  weight: 50
                - podAffinityTerm:
                    topologyKey: kubernetes.io/hostname
                  weight: 100
  2. 使用如下YAML部署spring-cloud-a應(yīng)用的灰度版本:

    展開查看YAML文件

    # Source: mse-simple-demo/templates/spring-cloud-a-gray-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a-gray
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: spring-cloud-a-gray
          version: gray
      template:
        metadata:
          labels:
            msePilotAutoEnable: "on"
            msePilotCreateAppName: "spring-cloud-a"
            alicloud.service.tag: gray
            app: "spring-cloud-a-gray"
            version: gray
        spec:
          containers:
            - name: spring-cloud-a
              image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1"
              imagePullPolicy: Always
              env:
                - name: nacos.host
                  value: "nacos-server"
                - name: nacos.namespace
                  value: "public"
              resources:
                requests:
                  cpu: 1
                  memory: 2Gi
                limits:
                  cpu: 1
                  memory: 2Gi
              ports:
                - name: http-port
                  containerPort: 20001
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
                - podAffinityTerm:
                    topologyKey: failure-domain.beta.kubernetes.io/zone
                  weight: 50
                - podAffinityTerm:
                    topologyKey: kubernetes.io/hostname
                  weight: 100

步驟四:創(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ō)明

    泳道組名稱

    自定義泳道組的名稱。

    入口類型

    選擇Java服務(wù)網(wǎng)關(guān)

    入口應(yīng)用

    選擇spring-cloud-gateway

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

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

    創(chuàng)建泳道組

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

步驟五:創(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}

  • 以Java網(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)整網(wǎng)關(guān)路由規(guī)則Path和泳道路由模式。

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

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

配置項(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ī)則。

  • 輸入Path:若為空則代表匹配所有路徑。

  • 灰度模式:選擇按比例灰度

  • 流量比例:30%。

說(shuō)明

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

創(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)簽。本示例將泳道目標(biāo)標(biāo)簽設(shè)置為gray

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

配置路由和灰度規(guī)則

設(shè)置相應(yīng)的路由規(guī)則條件。

  • 輸入Path。若為空則代表匹配所有路徑。

  • 灰度模式:選擇按內(nèi)容灰度

  • 灰度條件:新增規(guī)則條件,選擇以下條件同時(shí)滿足

    本示例設(shè)置灰度條件為:請(qǐng)求Parameter名為name,值為xiaoming。配置如下:

    • 參數(shù)類型:Parameter

    • 參數(shù):name

    • 條件:==

    • :xiaoming

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

請(qǐng)確保MSE Java Agent的版本為3.2.3及以上,否則會(huì)影響百分比灰度能力。

配置項(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)簽。本示例將泳道目標(biāo)標(biāo)簽設(shè)置為gray

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

配置路由和灰度規(guī)則

設(shè)置相應(yīng)的路由規(guī)則條件。

  • 輸入Path:若為空則代表匹配所有路徑。

  • 灰度模式:選擇按比例灰度

  • 流量比例:30%。

完成泳道創(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)。

步驟六:測(cè)試基線及灰度版本流量

測(cè)試按請(qǐng)求內(nèi)容路由的泳道
  1. 使用curl命令測(cè)試基線流量:

    curl 8.130.x.x/A/a
    A[192.168.x.x][config=base] -> B[192.168.x.x] -> C[192.168.x.x]
    說(shuō)明

    命令中的8.130.x.x是Spring Cloug Gateway暴露出的公網(wǎng)IP地址。

  2. 使用curl命令測(cè)試灰度流量:

    curl 8.130.x.x/A/a?name=xiaoming
    Agray[192.168.x.x][config=base] -> B[192.168.x.x] -> Cgray[192.168.x.x]
    說(shuō)明
    • 當(dāng)參數(shù)帶上name=xiaoming時(shí),會(huì)命中灰度標(biāo)簽,并向后透?jìng)鳌?/p>

    • 比如灰度請(qǐng)求到A應(yīng)用和C應(yīng)用時(shí),會(huì)請(qǐng)求到Agray和Cgray節(jié)點(diǎn)。

    • 請(qǐng)求到B應(yīng)用時(shí),由于不存在Bgray節(jié)點(diǎn),仍然會(huì)請(qǐng)求B的基線節(jié)點(diǎn)。

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

通過(guò)如下Python3腳本測(cè)試按比例路由的分流情況(需要安裝requests包)。注意將x.x.x.x替換為spring-cloud-gateway網(wǎng)關(guān)的入口SLB地址。

# pip3 install requests
# python3 traffic.py
import requests

TOTAL_REQUEST = 100
ENTRY_URL = 'http://x.x.x.x/A/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ù)治理可觀測(cè)

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

image

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

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

  • GrayQPS:該應(yīng)用的灰度版本的QPS。

相關(guān)文檔