在 Dubbo 服务网格中是通过 Dubbo 控制平面和 Dubbo Agent 协同工作来实现。控制平面基于 Kubernetes CRD 配置生成 gRPC xDS 配置,并通过 xDS 协议下发给 Dubbo Agent,从而实现对服务间流量的细粒度控制。
Dubbo 服务网格的流量管理模型与 Istio 保持一致,但针对 Dubbo 协议和无 Sidecar 架构进行了优化。核心组件包括:
通过配置这些资源,您可以实现流量路由、负载均衡、故障恢复等功能,而无需修改应用程序代码。
ServiceRoute 是 Dubbo 服务网格中用于定义路由规则的核心资源,对应 Istio 的 VirtualService。它允许您配置如何将请求路由到服务的不同版本或实例。
服务路由让您能够:
以下示例展示了如何配置 ServiceRoute 来实现流量分割:
apiVersion: networking.dubbo.apache.org/v1
kind: ServiceRoute
metadata:
name: provider-weights
namespace: grpc-app
spec:
hosts:
- provider.grpc-app.svc.cluster.local
http:
- route:
- destination:
host: provider.grpc-app.svc.cluster.local
subset: v1
weight: 10
- destination:
host: provider.grpc-app.svc.cluster.local
subset: v2
weight: 90
hosts 字段指定了 ServiceRoute 应用到的服务。可以使用完全限定域名(FQDN)或短名称。控制平面会自动将短名称解析为 FQDN。
路由规则定义了如何将请求路由到目标服务。每个路由规则可以包含:
当多个 ServiceRoute 匹配同一个服务时,控制平面会按照配置的创建时间顺序应用规则。更具体的匹配条件会优先于通用规则。
ServiceRoute 支持更复杂的路由场景,包括:
delegate 字段实现路由规则的组合和复用SubsetRule 是 Dubbo 服务网格中用于定义服务子集和流量策略的资源,对应 Istio 的 DestinationRule。它允许您将服务实例组织成逻辑子集,并为每个子集配置流量策略。
SubsetRule 支持多种负载均衡策略,通过 MeshConfig 中的 LocalityLbSetting 配置:
以下示例展示了如何创建子集并配置流量策略:
apiVersion: networking.dubbo.apache.org/v1
kind: SubsetRule
metadata:
name: provider-versions
namespace: grpc-app
spec:
host: provider.grpc-app.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
tls:
mode: ISTIO_MUTUAL
子集通过 Pod 标签进行匹配。在上面的示例中,带有 version: v1 标签的 Pod 会被分配到 v1 子集,带有 version: v2 标签的 Pod 会被分配到 v2 子集。
在 Dubbo 服务网格中,由于采用无 Sidecar 架构,Sidecar 资源的概念被 Dubbo Agent 所替代。Dubbo Agent 嵌入在应用进程中,通过 xDS 协议与控制平面通信。