客户端|Dubbo-go-Mesh 开启新一代 Go 微服务形态

客户端|Dubbo-go-Mesh 开启新一代 Go 微服务形态

文章图片

客户端|Dubbo-go-Mesh 开启新一代 Go 微服务形态

文章图片



一 什么是 Proxyless Service-Mesh (无代理服务网格) ? 1 Service Mesh 简析
Istio 是当今最流行的开源服务网格 。 它由控制平面和数据平面构成 , 其架构如下(图片摘自 Istio官网) 。

位于图中下半部分的控制平面负责配置、服务信息、证书等资源的下发 。 位于上半部分的数据平面关注业务之间的通信流量;传统服务网格通过代理的方式拦截所有的业务网络流量 , 代理需要感知到控制平面下发的配置资源 , 从而按照要求控制网络流量的走向 。
在 Istio 环境中 , 其控制平面是一个名为 istiod 的进程 , 网络代理是 envoy。 istiod 通过监听 K8S 资源 例如Service、Endpoint 等 , 获取服务信息 , 并将这些资源统一通过 XDS 协议下发给位于数据平面的网络代理 。 envoy 是一个独立的进程 , 以 sidecar(边车)的形式伴随业务应用 Pod 运行 , 他与应用进程共用同一个主机网络 , 并通过修改路由表的方式 , 劫持业务应用的网络流量 。
Service Mesh 可以解决微服务场景下的众多问题 , 随着集群规模的扩大与业务复杂度的增长 , 基于原生 k8s 的容器编排方案将会难以应付 , 开发人员不得不面对巨大的服务治理挑战 。 而 Service Mesh 很好地解决了这一问题 , 它将服务治理需求封装在了控制平面与代理中 , 业务开发人员只需要关注于业务逻辑 。 在应用部署之后 , 只需要运维人员通过修改配置 , 即可实现例如故障恢复、负载均衡、灰度发布等功能 , 这极大地提高了研发和迭代效率 。
Istio 的 sidecar 通过容器注入的形式伴随业务应用进程的整个生命周期 , 对于业务应用是毫无侵入的 , 这解决了业务应用可迁移、多语言、基础架构耦合等问题 。 但这也带来了高资源消耗、请求时延增长的问题 。
Service 为服务治理提供了一个很好的思路 , 将基础架构与业务逻辑解耦 , 让应用开发人员只需关注业务 。 另一方面 , 由于 sidecar 的弊端 , 我们可以考虑使用 sdk 的形式 , 来替代 sidecar 支撑起数据平面 。
2 Proxyless Service-Mesh
无代理服务网格 , 是2018年谷歌提出的一个新的概念 , Isito、gRPC、brpc 等开源社区都在这一方向进行了探索和实践 。 无代理服务网格框架以 SDK 的形式被业务应用引入 , 负责服务之间的通信、治理 。 来自控制平面的配置直接下发至服务框架 , 由服务框架代替上述 sidecar 的功能 。

在无代理服务网格场景下 , 服务框架(SDK)的主要能力可以概括为以下三点:




























【客户端|Dubbo-go-Mesh 开启新一代 Go 微服务形态】









对接控制平面 , 监听配置资源 。对接应用 , 为开发者提供方便的接口 。对接网络 , 根据资源变动 , 响应流量规则 。3 Proxyless 的优缺点 我认为优点如下: 性能:无代理模式的网络调用为点对点的直接通信 , 网络时延会比代理模式小很多 。稳定性:proxyless 的模式是单进程 , 拓扑简单 , 便于调试 , 稳定性高 。框架集成:市面上已有众多 sdk 模式的服务框架 , 切换至 mesh 后便于复用框架已有能力 资源消耗:没有 sidecar , 资源消耗低 。当然 , 缺点也有很多: 语言绑定:需要开发多种语言的 sdk 可迁移性低:无法通过切换 sidecar 的形式来无侵入地升级基础设施 。总体来讲 , 我认为 Proxyless 架构以其高性能、高稳定性的特点 , 更适合与生产环境使用 。二 Dubbo-go 与 Proxyless Service-Mesh 1 Dubbo-go 的能力 Apache/Dubbo-go (github.com/apache/dubbo-go) , 是一款分布式 RPC 框架 , 是 Apache/Dubbo 的 Go 语言实现 。 旨在为开发者提供便利的微服务应用开发体验 。 Dubbo-go 生态为 Go 开发者提供了敏捷的微服务编程接口、配置管理方案、服务治理方案、以及一系列工具与脚手架 , 开发人员可以使用框架提供的能力快速开发自己的微服务应用 。2 Dubbo-go 在 Proxyless Service-Mesh 场景的设计 服务注册发现 Dubbo-go 本身拥有可扩展的服务注册发现能力 , 我们为 service mesh 场景适配了注册中心的实现 。 开发人员可以将 dubbo-go 应用的信息注册在 istiod 控制平面上 。 客户端应用可以查询已经注册的接口数据 , 完成服务发现过程 。归因于 Java 的编程习惯 , Dubbo-go 生态框架的服务注册方式都是接口级别的 。 即客户端只需要引入接口 , 即可发起调用 , 而无需关心下游的应用名、主机名、IP 地址等信息 。 与之相对的是应用级别的服务注册发现 , 主流微服务框架更多这种形式的服务调用方式 , 例如 gRPC、K8S、Istio , 应用级服务发现对应到 mesh 场景下 , 我认为叫 “主机级别服务发现”更合适 , 这种调用方式需要客户端在引入接口的同时 , 还需引入下游的主机名和端口号 。 熟悉 gRPC-go 的同学一定很清楚 , 除了引入 pb 接口 , 还需要在创建客户端时调用 gRPC.Dial(\"xxx\") 建立网络连接 。 而这里的 xxx 就是下游的主机名和端口号 , 这种服务发现的类型和用户编程习惯 , 导致了 gRPC 较为轻松地实践了 Proxyless Service Mesh 。关于应用级服务发现与接口级服务发现的区别和 dubbo 生态的解决方案 , 本文中不多赘述 , 可以参考刘军前辈写的文章文章《Dubbo 迈出云原生重要一步 应用级服务发现解析》简单来说 , 应用级服务发现需要开发者关心接口之外还要关心应用名 , 注册中心的冗余信息较少;接口级服务发现开发者只需要引入接口名 , 但注册中心的冗余信息较多 。熟悉 Dubbo-go、Dubbo 生态的用户 , 不习惯于在编程的过程中指定下游主机名 , 更希望以接口引入的方式 , 直接发起 RPC 调用 , 而不需关心究竟这个接口被哪个应用实现 , 运行在哪台主机、哪个虚拟集群上 。Dubbo-go 为了融入 Istio 体系 , 将扩展出来的注册发现流程进行了特殊改造 。 在复用 Istio 提供的 EDS、CDS 主机发现的能力之外 , 增加了接口名到主机名的映射 , 作为源数据注册在了控制平面上 。 客户端在发起调用前持有接口名 , 通过查询istiod 上的元数据信息 , 拿到接口名到主机名到映射 , 转换为主机名;再通过EDS、CDS和路由 , 完成主机名到下游端点实例的转换 。 完成服务发现流程 。下面用一个更详细的例子来说明服务发现过程: 开发人员使用 dubbogo-cli 工具创建应用模板 , 发布 Deployment / Service pair 到集群中 。服务端拉取全量 CDS 和 EDS 数据 , 比对本机 IP , 拿到当前应用的的主机名 。 并将本应用的所有接口名到主机名的映射 , 注册在 Istiod 上面 。客户端从 istiod 拉取全量接口名到主机名的映射 , 缓存在本地 。 当需要发起调用时 , 查询本地缓存 , 将接口名转换为主机名 , 再通过CDS 和 EDS 拉取到当前 cluster 所对应的全量端点 。全量端点经过 Dubbo-go 内置的 Mesh Router , 筛选出最终的端点子集 , 并按照配置的负载均衡策略进行请求 。开发人员或者第三方组件 , 通过操作 K8S 资源 , 控制 Dubbo-go 流量 。纵观这一过程 , 开发人员全程只需要关注接口即可 , 完全无需关心主机名和端口信息 。 即服务端开发者只需要实现pb接口 , 使用框架暴露出来;客户端开发者只需要引入pb接口 , 直接发起调用即可 , 可以跟随本文第四部分的教程来动手实验一下 。流量治理 Dubbo-go 拥有路由能力 , 通过 xds 协议客户端从 istiod 订阅路由配置 , 并实时更新至本地路由规则 , 从而实现服务的管理 。 Dubbo-go 兼容 Istio 生态的流量治理规则 , 可以通过配置 Virtual Service 和 Destination Rule , 将打标的流量路由至指定子集 , 也可以在灰度发布、切流等场景进行更深入地使用 。云原生脚手架 dubbogo-cli 是 Apach/dubbo-go 生态的子项目 , 为开发者提供便利的应用模板创建、工具安装、接口调试等功能 , 以提高用户的研发效率 。可以执行以下指令安装dubbogo-cli 至 $GOPATH/bin go install github.com/dubbogo/dubbogo-cli@latest dubbogo-cli 支持以下能力 应用模板创建 Demo 创建 编译、调试工具安装 查看 dubbo-go 应用注册信息 调试 dubbo-go 应用接口 使用应用模板的开发流程 通过 dubbogo-cli 生成模板 修改api/api.proto make proto-gen 开发接口 修改 makefile 内镜像名和发布名 打镜像并推送 修改chart/app/values 内与部署相关的value配置 make deploy 使用 helm 发布应用 。详情可以参阅 dubbogo-cli 文档[1