Loading
close

多协议和第三方注册中心支持

time 更新时间:2024-02-05 14:41:14

本章节主要介绍在服务网格,如何实现多协议和第三方注册中心的支持。

操作场景

多协议支持是由envoy自身特点支持,当前支持的协议包括不限于dubbo,mysql,redis,kafka,postgres和mongo。通过协议识别,envoy会记录请求关键信息和请求返回码,并作为可观测性指标等信息暴露服务状态,这是多协议数据面支持的基础。

这里通过基于aeraki-mesh改造的dubbo-controller和registry-hub服务,来支持以下两种场景:

  • dubbo 2协议应用场景:支持zookeeper和nacos注册中心
  • springboot应用场景:支持eureka和consul注册中心

具体架构场景如下:
./images/sm_ug_01.png

  1. consumer客户端位于集群内,且不会有集群外主动访问集群内流量
  2. provider服务端位于集群外

dubbo 2协议应用场景

dubbo协议场景使用限制

  • 当前对dubbo的治理主要 简单路由(interface) 和指标层面,不是很完善,包括重试,负载均衡,缓存等,如需要这些能力,建议用dubbo的流量治理能力或者配置consumer客户端
  • 当使用服务网格的服务发现时,要求 consumer 客户端不连接注册中心,交给服务网格的服务发现,因为服务网格只提供服务发现能力,不能向 consumer客户端动态下发治理相关配置(如重试,负载均衡,缓存等),因此需在启动配置中填写相关配置,比如在dubbo-consumer.properties配置以下项(参考dubbo服务消费者配置),修改配置需要重启consumer客户端。而 provider 服务端则不受影响,仍然支持动态配置(参考dubbo流量管控动态配置)。
dubbo.consumer.timeout
dubbo.consumer.retries
dubbo.consumer.loadbalance
dubbo.consumer.async
dubbo.consumer.connections
dubbo.consumer.cache
等...
  • 如果需要完整的服务网格的治理功能,可以使用基于grpc的dubbo 3协议,不用注册中心,直接用kubernetes service访问provider端。

zookeeper注册中心

apiVersion: ecns.easystack.cn/v1alpha1
kind: RegistryHub
metadata:
  name: registryhub-sample
  namespace:xxx
spec:
  # 生成的 serviceentry 导出到哪个空间
  generate_to: dubbozk
  # 注册中心类型
  type: zookeeper
  # 注册中心地址,需加命名空间
  address: "zookeeper.dubbozk:2181"

如果dubbozk命名空间中的zookeeper有服务注册信息,则会在generate_to指定的空间dubbozk下生成如下的serviceentry:

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  annotations:
    interface: org.apache.dubbo.samples.api.GreetingService
    workloadSelector: ""
  creationTimestamp: "2023-08-22T03:02:18Z"
  generation: 3
  labels:
    manager: aeraki
    registry: dubbo2istio
  name: aeraki-org-apache-dubbo-samples-api-greetingservice-1-0-0-dubbozk
  namespace: dubbozk
  resourceVersion: "4902168"
  uid: cb1b9086-fccf-47aa-a593-7ed3c5aacdfe
spec:
  addresses:    
  - 240.240.0.1
  endpoints:
  - address: 10.42.0.57
    labels:
      anyhost: "true"
      application: zookeeper-demo-provider
      background: "false"
      deprecated: "false"
      dubbo: 2.0.2
      dynamic: "true"
      generic: "false"
      interface: org.apache.dubbo.samples.api.GreetingService
      methods: sayHello
      pid: "7"
      registryName: registryhub-sample
      release: 1.0-SNAPSHOT
      revision: 1.0-SNAPSHOT
      service-name-mapping: "true"
      side: provider
      timestamp: "1692846277949"
      version: 1.0.0
    ports:
      tcp-metaprotocol-dubbo: 20880
    serviceAccount: default
  hosts:
  - org.apache.dubbo.samples.api.greetingservice-1.0.0.dubbozk
  location: MESH_INTERNAL
  ports:
  - name: tcp-metaprotocol-dubbo
    number: 20880
    protocol: tcp
    targetPort: 20880
  resolution: STATIC

同时会在servicemesh空间下生成envoyfilter:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: inbound-org.apache.dubbo.samples.api.greetingservice-240.240.0.1-20880
spec:
  configPatches:
  - applyTo: NETWORK_FILTER
    match:
      listener:
        name: 240.240.0.1_20880
        filterChain:
          filter:
            name: "envoy.filters.network.tcp_proxy"
    patch:
      operation: REPLACE
      value:
        name: envoy.filters.network.dubbo_proxy
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.dubbo_proxy.v3.DubboProxy
          protocol_type: Dubbo
          serialization_type: Hessian2
          statPrefix: outbound|20880||org.apache.dubbo.samples.api.greetingservice
          route_config:
          - name: outbound|20880||org.apache.dubbo.samples.api.greetingservice
            interface: org.apache.dubbo.samples.api.greetingservice
            routes:
            - match:
                method:
                  name:
                    exact: sayHello
              route:
                cluster: outbound|20880||org.apache.dubbo.samples.api.greetingservice

这样dubbo协议的应用consumer就可以通过生成的ServiceEntry的hostsorg.apache.dubbo.samples.api.greetingservice-1.0.0.dubbozk来访问provider服务了。host的生成规则为:${interface}-${version}.${generate_to},其中:

  • interface: provider服务的接口名
  • version:provider服务的版本号
  • generate_to:RegistryHub cr中的generate_to字段值

nacos注册中心

跟zookeeper类似:

kind: RegistryHub
metadata:
  name: registryhub-sample
spec:
  # serviceentry 导出到哪个空间
  generate_to: default
  # 注册中心类型
  type: nacos
  # 注册中心地址,需加命名空间
  address: "nacos.dubbonacos:8848"

springboot场景应用

springboot直接使用的http协议,因此只需要将注册中心数据生成serviceentry即可。

eureka注册中心

apiVersion: ecns.easystack.cn/v1alpha1
kind: RegistryHub
metadata:
  name: registryhub-sample
spec:
  generate_to: springnacos
  type: eureka
  address: "http://eureka.springnacos:8761/eureka"

生成的serviceentry为:

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  annotations:
    manager: encs
    registry: eureka
  creationTimestamp: "2023-08-24T04:35:56Z"
  generation: 1
  labels:
    registry-name: registryhub-sample
  name: eureka-provider.springnacos
  namespace: springnacos
  resourceVersion: "4907683"
  uid: 544a90ac-9f60-493f-9d84-d3658a3aa37c
spec:
  endpoints:
  - address: 10.42.0.59
    labels:
      eurekaname: EUREKA-PROVIDER
  hosts:
  - eureka-provider.springnacos
  location: MESH_INTERNAL
  ports:
  - name: "9000"
    number: 9000
    protocol: tcp
    targetPort: 9000
  resolution: STATIC

这样springboot应用consumer就可以通过生成的ServiceEntry的hostseureka-provider.springnacos 来访问provider服务了。host的生成规则为:${app_name}.${generate_to},其中:

  • app_name: provider服务名
  • generate_to:RegistryHub cr中的generate_to字段值

consul注册中心

跟eureka类似:

apiVersion: ecns.easystack.cn/v1alpha1
kind: RegistryHub
metadata:
  name: registryhub-sample
spec:
  generate_to: springconsul
  type: consul
  address: "http://consul.springconsul:8500"
此篇文章对你是否有帮助?
没帮助
locked-file

您暂无权限访问该产品