本章节主要介绍在服务网格,如何实现多协议和第三方注册中心的支持。
操作场景
多协议支持是由envoy自身特点支持,当前支持的协议包括不限于dubbo,mysql,redis,kafka,postgres和mongo。通过协议识别,envoy会记录请求关键信息和请求返回码,并作为可观测性指标等信息暴露服务状态,这是多协议数据面支持的基础。
这里通过基于aeraki-mesh改造的dubbo-controller和registry-hub服务,来支持以下两种场景:
- dubbo 2协议应用场景:支持zookeeper和nacos注册中心
- springboot应用场景:支持eureka和consul注册中心
- consumer客户端位于集群内,且不会有集群外主动访问集群内流量
- 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"