跨地域、跨可用区的复杂服务场景中,不能仅依赖于 Kubernetes 默认的轮训机制,需要将流量优先路由到最近的服务可用区,确保服务的低延迟,降低流程的使用成本。本文介绍如何通过微服务引擎实现服务的区域优先路由。
开启前
服务提供者 Provider (Serviceb)开启同可用区路由优先前,服务消费者 Consumer(Servicea)基于默认的路由轮询机制,均衡的路由到不同可用区中的服务提供者 Provider (可用区 A 和 B 中的 Serviceb)。
开启后--同可用区优先路由
服务提供者 Provider (Serviceb)开启同可用区优先路由后,服务消费者 Consumer(Servicea)会优先调用同一可用区的服务提供者 Provider ( 仅可用区 A 中的 Serviceb)。
开启后--跨可用区容灾
当同一可用区的服务提供者不可用时,会访问其他可用区和区域的服务提供者。开启同可用区优先路由后将自动开启熔断策略,即在服务实例无法正常提供服务的情况下,将其从上游服务的负载均衡池中移除,不再为其分配新的流量,避免请求到发送到故障实例。
说明
待故障实例恢复后,会重新将其加入负载均衡池中,让请求可以访问到该实例。
同可用区优先路由: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"
登录 容器服务控制台。
创建工作负载。在集群 A 中创建 servicea 和 serviceb 的 v1 版本,在集群 B 中创建 serviceb 的 v2 版本。详细操作参见 创建无状态工作负载。YAML 示例参见 mse-demo.zip
文件。
serviceb
操作 列下的 治理规则。登录 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
删除在集群 A 可用区 A 部署的 serviceb。操作方法参见 删除无状态工作负载。
登录 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