网易数帆开源Slime Meshregistry,化解服务网格多注册中心兼容之痛

百家 作者:InfoQ 2023-05-10 15:01:58

作者 | 网易数帆  
背   景

服务发现是微服务治理的核心环节。传统的微服务架构采用 Consumer/Provider 模式,Provider 将服务信息注册到注册中心,Consumer 通过注册中心发现 Provider 的服务信息。在云原生服务网格体系中,服务发现由控制面 Istio 完成。Istio 以内置方式实现了 Kubernetes、Eureka 等注册中心的适配器,并通过适配器获取各注册中心的服务信息,然后转换成 Istio 体系的服务模型,推送至数据面 Envoy。但随着 Istio 的演进,对接外部注册中心的代码变得难以维护。在 Istio 1.8 时,社区移除了内置对接第三方注册中心的适配器代码,只保留了对接 Kubernetes 注册中心的逻辑。

移除并不意味不再支持,Istio 给出的方案是 MCP 以及后续的 Mcp-over-xds 协议。用户可以实现自己的 Mcp(Xds) Server,其主要包含两个功能:

  1. 对接第三方服务注册中心,获取服务信息

  2. 将服务信息转换成 Istio ServiceEntry, 并通过 Mcp(Mcp-over-xds) 协议下发至 Istio

还存在另一种方式进行第三方注册中心服务的对接,实现自己的 Adapter, 其主要包含两个功能:

  1. 对接第三方服务中心,获取服务信息

  2. 将服务信息转换成成 Istio ServiceEntry, 并提交至 ApiServer

架   构

网易数帆轻舟微服务团队在服务网格的落地实践过程中发现,大量用户只是将 Kubernetes 作为部署和管理的平台,服务信息依旧注册在第三方服务注册中心,如 Nacos 和 ZooKeeper。因此我们必须解决对接第三方注册中心的问题,才能帮助这些服务接入服务网格。

对比了上面的两种对接第三方服务注册中心的方案,Mcp Server 模式的优势是采用 Mcp-over-xds 协议,性能优于调用 Api-Server 接口,但是实现的复杂度较高;Adapter 模式的优势是相对简单,但是会大量请求 Api-server,性能较差且增加 Api-Server 的压力。因此我们选择实现自己的 Mcp (Mcp-over-xds) Server - Meshregistry,并且将其开源,社区代码可参考 Slime/meshregistry(https://github.com/slime-io/slime/tree/master/staging/src/slime.io/slime/modules/meshregistry)。针对客户场景大量使用的 Nacos、ZooKeeper、Eureka 这一现状,Meshregistry 已经实现了以上三种服务注册中心的对接。

实   现

Meshregistry 主要实现了以下功能:获取服务信息Meshregistry 目前适配了 Nacos、ZooKeeper、Eureka 三个注册中心。其中 ZooKeeper 既支持 Polling 方式(轮询)也支持 Watch 方式同步服务信息,Eureka 和 Nacos 支持 Polling 方式获取服务信息。

模型转换

EventSource 在获取服务信息后,由于各个服务注册中心的服务模型不一致,所以需要将各自服务模型转换成 Istio 服务模型 ServiceEntry, 并产生一条 Event 事件。Event 事件会创建、更新、删除内存中的 ServiceEntry 数据,同时通知 Mcp-over-xds Server 有服务信息变更。

推送数据

Mcp-over-xds Server 获取服务变更请求后,会对内存中的 ServiceEntry 进行实时计算,并通过 Xds 协议将数据推送到 Istiod。在该过程中,我们实现了语义上的增量推送。原先场景下,服务注册中心一个实例的上下线,将会触发 Mcp-over-xds Server 中的全部 ServiceEntry 的推送。实现增量推送后,只会触发这个实例对应的 ServieEntry 的推送,该优化极大减少了 Xds 推送量,提升整个网格的性能。

使用样例

下发以下资源,对接 Nacos 服务注册中心的 Meshregistry 模块(前提是已经部署了 slimeboot)具体配置可参考 Slime 安装 (https://github.com/slime-io/slime/blob/master/doc/zh/slime-boot.md)。安装成功后,会在 mesh-operator 下出现 meshregistry 的 deployment

在 Istio 的 ConfigMap 中,给 Istio 配置 ConfigSource,数据源为我们的 Meshregistry 服务

手动将服务注册至 Nacos

查询 Meshregistry 的':8081/meshregistry/xdsCache'接口,获取刚注册的服务信息

查询 Istiod 的'15014:debug/configz'接口,获取刚注册的服务信息

社   区

欢迎认领 issue: https://github.com/slime-io/slime/issues

欢迎加入 Slime 社区群,及时了解更多 Slime 动向:

微信群:请添加微信号 yonka_hust 进群 (备注: slime)

其他有用的信息可以查阅官网 Slime-Home:https://slime-io.github.io/

作者简介:

刘立罗,网易数帆高级服务端开发工程师,Istio 社区成员,Slime Maintainer,主要负责 Slime 及网易轻舟服务网格的设计与研发,具有多年云原生相关领域的实践经验。

今日好文推荐

从微服务转为单体架构、成本降低 90%,亚马逊内部案例引发轰动!CTO:莫慌,要持开放心态

比Python快35000倍!LLVM&Swift之父宣布全新编程语言Mojo:编程被颠覆了

拼多多回应将总部从中国迁至爱尔兰;微软Bing爆炸级更新,文生图原生支持中文;75岁人工智能教父离职谷歌,痛悔毕生工作| Q资讯

谷歌、OpenAI 都白干,开源才是终极赢家!谷歌内部文件泄露:欲借开源打败 OpenAI

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接