You need to enable JavaScript to run this app.
导航
通过 MSE 实现同可用区优先路由和跨可用区容灾
最近更新时间:2024.07.12 15:34:43首次发布时间:2024.05.11 10:12:40

跨地域、跨可用区的复杂服务场景中,不能仅依赖于 Kubernetes 默认的轮训机制,需要将流量优先路由到最近的服务可用区,确保服务的低延迟,降低流程的使用成本。本文介绍如何通过微服务引擎实现服务的区域优先路由。

功能简介

  • 开启前
    服务提供者 Provider (Serviceb)开启同可用区路由优先前,服务消费者 Consumer(Servicea)基于默认的路由轮询机制,均衡的路由到不同可用区中的服务提供者 Provider (可用区 A 和 B 中的 Serviceb)。
    alt

  • 开启后--同可用区优先路由
    服务提供者 Provider (Serviceb)开启同可用区优先路由后,服务消费者 Consumer(Servicea)会优先调用同一可用区的服务提供者 Provider ( 仅可用区 A 中的 Serviceb)。
    alt

  • 开启后--跨可用区容灾
    当同一可用区的服务提供者不可用时,会访问其他可用区和区域的服务提供者。开启同可用区优先路由后将自动开启熔断策略,即在服务实例无法正常提供服务的情况下,将其从上游服务的负载均衡池中移除,不再为其分配新的流量,避免请求到发送到故障实例。

    说明

    待故障实例恢复后,会重新将其加入负载均衡池中,让请求可以访问到该实例。

    alt

场景介绍

同可用区优先路由:Java 应用接入微服务引擎,并开启同可用区优先路由策略后,优先路由到同可用区的服务。
跨可用区容灾:一个可用区服务实例发生故障后,流量将流转到其他可用的服务实例。

  • servicea:部署在可用区 A。
  • serviceb:v1 部署在可用区 A , v2 部署在可用区 B。
  • 服务调用链路:servicea -> serviceb v1/v2
  • 应用类型:servicea 和 serviceb 为部署在 Nacos 集群的 Java 应用。

前提条件

  • 已在不同可用区创建容器服务集群 A 和集群 B。操作方法参见 创建集群

  • 在集群 A 和集群 B 中创建名称相同的命名空间。

  • 已创建微服务引擎实例。

  • 已创建微服务引擎治理中心,操作方法参见 创建治理中心

  • 已创建同步任务,将注册中心中的服务同步至治理中心。

  • 微服务引擎已纳管集群 A 和 集群 B。操作方法参见 添加集群

    spec:
      template:
        metadata:
          annotations:
            sidecar.mesh.io/prestop-timeout: "5000"
          labels:
            sidecar.mesh.io/data-plane-mode: "java_proxyless"
            sidecar.mesh.io/lane: "mse-base"
            sidecar.mesh.io/mse-namespace: "demo-test"
    

操作步骤

步骤一:部署上下游服务

  1. 登录 容器服务控制台

  2. 创建工作负载。在集群 A 中创建 servicea 和 serviceb 的 v1 版本,在集群 B 中创建 serviceb 的 v2 版本。详细操作参见 创建无状态工作负载。YAML 示例参见 mse-demo.zip 文件。

    mse-demo.zip
    5.29KB

步骤二:配置同可用区优先路由策略

  1. 登录 微服务引擎控制台
  2. 在左侧的菜单栏单击 治理中心 > 服务列表
  3. 单击 serviceb 操作 列下的 治理规则
  4. 治理策略 > 流量控制 页面,单击 同可用区优先路由 区域右侧的 开启
    alt
  5. 在二次确认页面,单击 确定

步骤三:验证同可用区优先路由策略

登录 servicea 的工作负载,执行以下命令访问 serviceb,查看流量的走向。

while true;do curl -w '\n' http://localhost/getnext;sleep 1;done

servicea 全部都路由到同可用区的 serviceb v1 版本,即可用区优先路由策略生效。

servicea -> serviceb v1 -> end
servicea -> serviceb v1 -> end
servicea -> serviceb v1 -> end
servicea -> serviceb v1 -> end
servicea -> serviceb v1 -> end
servicea -> serviceb v1 -> end
servicea -> serviceb v1 -> end

步骤四:验证跨可用区容灾策略

  1. 删除在集群 A 可用区 A 部署的 serviceb。操作方法参见 删除无状态工作负载

  2. 登录 servicea 的工作负载,执行以下命令访问 serviceb,查看流量的走向。

    while true;do curl -w '\n' http://localhost/getnext;sleep 1;done
    

由于同可用区的 serviceb v1 版本不可用,servicea 全部都路由到其他可用区的 serviceb v2 版本,即跨可用区容灾策略生效。

servicea -> serviceb v2 -> end
servicea -> serviceb v2 -> end
servicea -> serviceb v2 -> end
servicea -> serviceb v2 -> end
servicea -> serviceb v2 -> end
servicea -> serviceb v2 -> end
servicea -> serviceb v2 -> end