云容器引擎 CCE云容器引擎 CCE

更新时间:2021/03/18 GMT+08:00
分享

步骤1 Dubbo SDK适配

为了使用Kubernetes的服务发现能力和服务治理规则,要求适配Dubbo的服务发现模型和Kubernetes一致,如图1所示。

图1 Dubbo、Kubernetes适配规则

Dubbo的RPC请求使用Istio的服务发现和负载均衡,从而使用Istio数据面执行服务治理。如图2,短路SDK服务发现和负载均衡,使用服务名直接访问目标服务。Istio的数据面Envoy拦截到流量,根据访问的服务名执行服务发现和负载均衡,并执行定义在该服务上的治理规则。

图2 Dubbo RPC请求流程

在Dubbo SDK中有如下通用适配,不涉及RPC业务代码和配置文件的修改。

  • 服务部署
    服务部署时会通过环境变量将服务部署信息注入到SDK中,注入的信息主要包括:
    • k8s.appname:部署的服务名。
    • k8s.namespace:部署的Namespace。
    • k8s.zone:表示标示服务部署在Kubernetes集群中还是线下虚拟机集群内。

    k8s.appname、k8s.namespace需要与部署的Kubernetes负载信息一致。在SDK启动时会将这些信息和Interface的关系向Dubbo的注册中心上报。

  • RPC请求:

    客户端SDK在通过Interface发起RPC请求时,首先从服务注册中心中查询到Interface对应的目标服务的服务元数据信息,根据对应规则组装目标服务的RPC请求,并将服务元数据信息放到Dubbo协议的Attachment字段中。

    • 当目标服务和源服务都是Istio集群内服务时,通过k8s.appname、k8s.namespace构造目标服务的集群内访问域名并发起请求。Istio数据面Envoy拦截流量执行服务发现和服务间访问的治理。
    • 当源服务是线下虚拟机服务,目标服务是线上服务时,通过k8s.appname、k8s.namespace构造目标服务的外部访问域名${k8s.appname} }.${k8s.namespace}.hw.rpc.com并发起请求。配合DNS将外部域名解析到Istio的Gateway上,通过Gateway访问集群内Istio服务。

    为了将不同域名的服务通过Gateway转发到不同的Istio服务,在SDK发起访问时,会将目标服务的三个元数据信息通过Dubbo协议的Attachment字段传递,即添加k8s.appname、k8s.namespace和k8s.zone三个键值对。Istio的Gateway在解析Dubbo协议请求内容时,会提取Attachment字段中的k8s.appname、k8s.namespace等信息做路由匹配,并根据k8s.appname、k8s.namespace的match条件将请求转发到不同的后端服务上。

    以上SDK开发的服务,通过如下部署在Istio集群中,并可以在使用Istio进行Dubbo服务的RPC访问间的治理。

分享:

    相关文档

    相关产品