Dubbo-go v3.0 正式发布 ——打造国内一流开源 Go 服务框架
作者介绍: 李志信(github @laurencelizhixin),dubbo-go 3.0 负责人,Apache Dubbo PMC,来自阿里云中间件团队,从事 Go 语言中间件的研发和开源工作。 于雨 (github @AlexStocks),dubbo-go 社区负责人,Apache Dubbo PMC,蚂蚁集团可信原生部【TNT】基础设施和中间件研发一线程序员。工作十一年来陆续参与和改进过 Redis/Pika/Pika-Port/etcd/Muduo/Dubbo/dubbo-go/Sentinel-golang/Seata-golang 等知名项目。 牛学蔚(github @justxuewei),Apache Dubbo Committer,北邮计算机学院二年级研究生,对中间件、云原生领域有着浓厚的兴趣。 董剑辉(github @Mulavar),Apache Dubbo Committer,目前主要关注的开源方向为 Dubbo、Flink、Calcite。
一 Dubbo-go 简介
1 什么是 Dubbo-go
包括 Apache/Dubbo 与 Apache/Dubbo-go 在内的 Dubbo 生态被评为 2021 年中国 20 大最活跃社区之一,位居阿里所有开源项目第二【第一是蚂蚁集团的 AntD】
Dubbo-go 已经成功申报中国科学技术协会主办的「 2021“科创中国”开源创新榜评选 」
Dubbo-go 开源社区被 OSCHINA 评为“2021 年度 OSCHINA 优秀开源技术团队”
2 功能介绍
互联互通能力
其中 Triple 协议是 Dubbo3 生态主推的协议,是基于 gRPC 的扩展协议,底层为HTTP2,可与 gRPC 服务互通。相当于在 gRPC 可靠的传输基础上,增加了 Dubbo 的服务治理能力。
Devops 能力
3 目标用户
广大 Go 语言微服务开发者
如果您是 Go 语言微服务开发者,希望基于轻量级微服务框架快速开发自己的服务,那么 Dubbo-go 3.0 将是您很好的一个选择。
Dubbo 生态多语言使用者
如果您是 Dubbo 生态使用者,或者在语言切换的过程中面对兼容性问题,Dubbo-go 在多协议跨语言互通的场景下会祝您一臂之力。
gRPC 使用者
如果您希望在 gRPC 生态中增加服务治理能力,Dubbo-go 可帮助您很容易地从 gRPC 接入 Dubbo 生态,在不改变业务代码的情况下提供服务治理能力的支持。
云原生架构师
如果你在为公司选择云原生解决方案,dubbogo 3.0 提供的 proxyless service mesh 也是一个很好的选择,它可以帮助你以最低的成本助你从微服务体系接入 istio 控制面。当然,dubbogo 的控制面能力还需要进一步加强,在未来的 3.1 版本中提供 proxyless 和 proxy 两套 service mesh 方案。
二 Dubbo-go 3.0 有哪些不同
1 新配置方案
配置结构
dubbo:
registries:
ZKRegistry: # 注册中心配置
protocol: zookeeper # 注册中心类型
address: 127.0.0.1:2181 # 注册中心配置
protocols:
triple: # 协议配置
name: tri # 协议名
port: 20000 # 服务端监听端口
provider:
services:
GreeterProvider: # 服务提供者类名
interface: com.dubbogo.sample.DemoServiceName # 接口 ID
配置中心 在 Dubbo-go 3.0 中,可以将上述框架配置或用户配置放置在配置中心内便于管理。在容器内只需要放置配置中心相关信息即可基于该配置启动框架。
dubbo:
config-center: # 配置中心信息
protocol: nacos
address: 127.0.0.1:8848
data-id: dubbo-go-samples-configcenter-nacos-server
配置API 开发者可以在代码内通过配置 API 生成配置实例结构,代码中生成的配置与从文件内读取的配置等价。参考于 Java Builder 的设计来自于社区同学们,也代表了开发者对于接口易用性的诉求。
// 1. 通过 Builder 模式创建配置中心的配置
configCenterConfig := config.NewConfigCenterConfigBuilder().
SetProtocol("nacos").SetAddress("127.0.0.1:8848").
SetDataID("dubbo-go-samples-configcenter-nacos-server").
SetGroup("dubbogo").
Build()
// 2. 通过 Builder 模式创建根配置
rootConfig := config.NewRootConfigBuilder().
SetConfigCenter(configCenterConfig).
Build()
// 3. 加载配置并启动框架
rootConfig.Load()
2 Triple + PB 协议
Dubbo-go 在上半年首次发布的 3.0.0-rc1 版本内已经支持 Triple 协议。在此期间,由合作方钉钉部门相关同学提出了较多针对响应时延、稳定性等优化建议。时至今日,在性能、用户使用体验、泛化调用、异常回传、PB反射等方面都进行了大量的优化工作。
性能优化
将旧版本基于 net/http2 的实现切换为基于 grpc 的 http2 层实现方案。增强了底层传输的稳定性和性能。经过压测,4c8g 单机 Provider 可以处理 7万 tps 的简单请求。
我们使用了 3 台相同规格机器,一台作为Server(运行一个 triple-server),一台作为Client(运行一个triple-server 和triple client) ,一台作为施压机向 Client 发起针对整个链路的调用施压,并进行数据记录,记录rt、真实 tps 以及client 和 server 的 CPU 占比数据。
反射支持
Triple 默认开启 proto 反射,用户可以使用 grpc_cli 针对 Triple 协议暴露的pb序列化服务进行展示和调试。
在 proto 反射支持的前提下,dubbo-go-pixiu 提供了网关层协议转换调用 triple 服务的支持。
grpc_cli ls localhost:20000
org.apache.dubbogo.samples.api.Greeter
grpc.reflection.v1alpha.ServerReflection
- 用户编程方式新 PB 编译插件,新版本 dubbo-go 推荐 go 用户使用 proto 文件定义接口,与 gRPC-go 的使用方式类似。
$ go install github.com/dubbogo/tools/cmd/protoc-gen-go-triple@v1.0.5
$ protoc --go_out=. --go-triple_out=. ./helloworld.proto
3 柔性服务
动态性能评估:用户不需要事先设置机器权重,框架在运行时自动评估系统性能,性能好的机器承担更多流量,性能不足的机器承担更少的流量;
故障自愈能力:负载均衡算法能够自动摘除故障的节点,并具备故障自愈能力;
适当限流策略:避免服务雪崩问题。
4 Pixiu 网关
Dubbo-go-pixiu 网关支持调用 GO/Java 的 Dubbo 集群。在 Dubbo-go 3.0 的场景下,我们可以通过 Pixiu 网关,在集群外以 HTTP 协议请求 pixiu 网关,在网关层进行协议转换,进一步调用集群内的Dubbo-go 服务。
package org.apache.dubbo.quickstart.samples;
service UserProvider {
rpc SayHello (HelloRequest) returns (User) {}
}
message HelloRequest {
string name = 1;
}
dubbo:
application:
name: my-dubbogo-app
$ kubectl apply -f https://raw.githubusercontent.com/dubbogo/triple-pixiu-demo/master/deploy/pixiu-triple-demo.yml
namespace/dubbogo-triple-nacos created
service/dubbo-go-nacos created
deployment.apps/dubbogo-nacos-deployment created
deployment.apps/pixiu created
deployment.apps/server created
service/pixiu created
$ kubectl get svc -n dubbogo-triple-nacos
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dubbo-go-nacos ClusterIP 192.168.123.204 <none> 8848/TCP 32s
pixiu LoadBalancer 192.168.156.17530.XXX.XXX.XX 8881:30173/TCP 32s
$ curl -X POST -d '{"name":"laurence"}'http://30.XXX.XXX.XX:8881/dubbogoDemoServer/org.apache.dubbo.laurence.samples.UserProvider/SayHello
{"name":"Hello laurence","id":"12345","age":21}
5 运维能力与工具
可观测性
日志
cli工具
三 用户视角的 Dubbo-go
1 面向接口和配置的开发
框架配置文件:dubbogo.yaml
框架启动所依赖的配置项。
接口定义
编写 proto 文件,并使用提供的 protoc-gen-go-triple 插件以及官方 protoc-gen-go 插件进行编译。接口代码实现
编写服务实现,并使用框架进行启动即可。
2 代码示例仓库 dubbo-go-samples
四 社区协作
作为一个能力功能非常丰富的服务平台,dubbogo 社区很重视与各大开源社区特别是阿里系开源产品社区以及各个公司的合作。
- Nacos 社区
早期 Dubbo-go 社区就与 Nacos 社区展开密切合作,由多位核心贡献者参与 Dubbo-go 研发支持中,在 3.0.0 版本中,增加了多位 Nacos 社区成员,在社区迭代中作出了许多建设性的建议和贡献。
- Polaris 社区
北极星(Polaris)是腾讯开源的服务发现和治理中心,致力于解决分布式或者微服务架构中的服务可见、故障容错、流量控制和安全问题。在 3.0.0 版本的开发中,Dubbo-go 社区与 Polaris 社区展开合作,实现了把 Polaris 作为 dubbo-go 的注册中心。
- Sentinel-Golang 社区
Sentinel 是面向分布式服务架构的流量控制组件,在Sentinel-Golang 首个版本 0.1.0 正式发布后,Dubbo-go 社区就与 Sentinel-Golang 社区展开密切合作,在功能上支持 Sentinel-Golang 作为流量控制。
- Seata-golang 社区
从 dubbogo v1.3 开始, 就集成了 seata-golang,实现了 TCC 模式分布式事务的调用。
两个社区现已合作将 TCC 模式 seata-golang 集成到了 dubbo-go-pixiu 中,只需要简单的配置、就能集成 TCC 模式协调分布式事务的方案,整体流程原理见上图。为了进一步降低大家使用分布式事务的门槛,seata-golang 社区也在考虑将 AT 模式做到 DB 代理层,届时在 dubbo-go-pixiu 中使用 seata-golang 会更加方便,敬请期待。
- 其他公司
dubbogo 本身是一个有着极高生产环境需求的项目,在发展过程中与阿里等很多公司有过合作。这些合作使得双方都有收益,dubbogo 的质量得以保证,功能得以拓展,合作方自身的平台稳定性得到极大提升。
五 展望
1 流量路由规则
2 统一控制面与服务架构创新
3 进一步云原生化
数据采集系统 Flume 快速入门
点击阅读原文查看详情!
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。