关于dubbo:DubbogoMesh-开启新一代-Go-微服务形态

36次阅读

共计 4557 个字符,预计需要花费 12 分钟才能阅读完成。

简介:Proxyless Service Mesh 能力将追随 Dubbo-go 下一版本公布,稳固的性能须要社区成员们独特的关注与建设。在此基础之上,咱们还会进一步摸索轻量级 sdk + sidecar 的模型;摸索基于第三方流量治理组件的金丝雀公布能力;摸索基于 dubbo 服务框架的多语言 sevice mesh、与更丰盛的 mesh 生态组件兼容。

作者 | 李志信
起源 | 阿里开发者公众号

一 什么是 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)的次要能力能够概括为以下三点:

  • 对接管制立体,监听配置资源。
  • 对接利用,为开发者提供方便的接口。
  • 对接网络,依据资源变动,响应流量规定。

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]。

三 Dubbo-go-Mesh 的劣势

1 接口级服务发现

前文介绍到了通过接口级服务注册发现的劣势,即开发人员无需关怀上游主机名和端口号,只须要引入接口存根,或实现接口,通过框架启动即可。

2 高性能

咱们在 k8s 集群内部署 Istio 环境,别离测试了 sidecar 模式的 gRPC 服务调用和 Proxyless 模式的 dubbo-go 应用服务调用。发现 proxyless 在申请耗时方面比 sidecar 模式少一个数量级,即性能晋升十倍左右。

3 跨生态

Dubbo-go 是一个横跨多个生态的服务框架。

  • mesh 生态

开发人员能够应用 Dubbo-go 进行利用开发的同时,应用 Istio 生态所提供的弱小能力。

  • gRPC 生态

Dubbo-go 反对与 gRPC 服务互通,HTTP2 协定栈。
Dubbo-go 默认应用 pb 序列化形式,高性能。

  • Dubbo 生态
  • 多语言劣势,能够实现 go-java 利用互通。
  • 兼容 pixiu 网关,不便地进行服务的裸露和协定转换。
  • 应用 Dubbo-go 生态组件。

四 入手体验 Dubbo-go-Mesh

Dubbo-go 目前已反对兼容 Istio 的服务治理能力。反对基于 Istio 的接口级服务发现能力,兼容 Istio 生态的流量管制和治理能力,并且提供了脚手架和利用模板以进步 Go 利用开发效率。

您可参考文档【Dubbo-go 文档 – Mesh 工作】[2],入手搭建一组 Dubbo-go Mesh 利用。

在这组工作中,开发者会从部署 Istio 环境开始,到创立利用模板、构建利用、公布利用、实现服务发现和 RPC、到最终实现流量规定动静配置,察看流量切换。对框架用户有较高的参考意义。

五 瞻望

Proxyless Service Mesh 能力将追随 Dubbo-go 下一版本公布,稳固的性能须要社区成员们独特的关注与建设。在此基础之上,咱们还会进一步摸索轻量级 sdk + sidecar 的模型;摸索基于第三方流量治理组件的金丝雀公布能力;摸索基于 dubbo 服务框架的多语言 sevice mesh、与更丰盛的 mesh 生态组件兼容。

Dubbo-go 也将持续在云原生的方向后退,持续挖掘云计算时代技术红利,与开发者同在。

原文链接
本文为阿里云原创内容,未经容许不得转载。

正文完
 0