快速融入云原生,携程开源 Dubbo for Go 版本

2020 年 2 月 15 日

快速融入云原生,携程开源 Dubbo for Go 版本

Go 目前在携程还不算是主流,但是聚集了一批忠实的拥趸,依托携程内部 Golang 社区,源源不断地发展壮大,已经有了规模可观的项目实践,发展势头十分迅猛。


近期,基于开源社区 dubbo-go 的早期项目,携程重构开发了更易于扩展且功能更加完善的 dubbo-go v1.0.0 版本,并且开源,重新贡献回了社区。


背景


5 月 21 日,经过一年多的孵化,Apache Dubbo 从 Apache 软件基金会毕业,成为 Apache 顶级项目。



Dubbo 是阿里于 2011 年开源的一款高性能 RPC 框架,在 Java 生态中具有不小的影响力。当初经历过一段被外界诟病的“停止维护”灰暗时光,后来在 2017 年 Dubbo 浪子回头,官方宣布重新重点维护。


重新启航的 Dubbo 将首要目标定位于重新激活社区,赢回开发者的信任,并且逐渐将 Dubbo 打造成一个国际化与现代化的项目,目前距离宣布重启已经过了一年半的时间。


在这个过程中,Dubbo 发布了多个版本,并逐渐从一个 RPC 框架向微服务生态系统转变,2018 年年初 Dubbo 入驻 Apache 软件基金会孵化器,开始以 Apache 之道发展社区。


一年之后,Dubbo 在 Apache 孵化器中发布了重启维护以来的首个里程碑版本 2.7.0,添加了社区呼声很高的异步化支持,以及注册中心与配置中心分离等特性。


这期间 Dubbo 3.0 的开发工作也被提上了日程,今年 4 月中旬,官方正式公布了 Dubbo 3.0 的进度,此版本新特性包括支持 Filter 链的异步化、响应式编程、云原生/Service Mesh 方向的探索,以及与阿里内外融合。


然后,Dubbo 毕业了。毕业后的 Dubbo 近期有什么消息呢?


生态还在发展,Dubbo 社区在前几日公开了 Dubbo Roadmap 2019,计划在 2020 年 2 月份发布 Dubbo 3.0 正式版,感兴趣的同学可以详细查阅。



而最近官方又宣布 Go 语言加入 Dubbo 生态,发布了 dubbo-go 项目。



在此之前 Dubbo 的跨语言可扩展性已经有一些实现,支持的语言包括 PHP、Node.js 与 Python,同时也基于标准 Java REST API - JAX-RS 2.0 实现了 REST 的调用支持,具体情况如下:


  • PHP:php-for-apache-dubbo,by 乐信,提供客户端和服务端

  • Node.js:dubbo2.js,by 千米网,提供客户端

  • Node.js:egg-dubbo-rpc,by 蚂蚁金服 egg 团队,提供客户端和服务端

  • Python :py-client-for-apache-dubbo,by 千米网,提供客户端


现在加入了 dubbo-go,Go 开发者也终于可以尝到 Dubbo 的滋味了。


据悉,dubbo-go 项目将于本周完成往 Apache 软件基金会的迁移,作为 Apache Dubbo 顶级项目的子项目,届时 dubbo-go 项目的新地址也将变为:https://github.com/apache/dubbo-go


开源中国访谈实录


关于 dobbo-go 项目的研发背景与具体技术细节等,开源中国采访了项目共同发起人——携程基础中台研发部何鑫铭。


:dubbo-go 是什么,定位是什么,为什么做这个项目?


: dubbo-go 是 Dubbo 的完整 Go 语言实现。


我们知道 Dubbo 本身基于 Java,很多公司也都以 Java 开发为主,并且使用 Dubbo 作 RPC 或微服务开发框架。


而最近 Go 语言生态发展比较迅速,因其语言优势,我们已经有部门开始尝试使用 Go 开发一些新的项目,就会存在亟需解决的问题:


  • 如何实现 Go 项目和 Java & Dubbo 项目的互通?

  • Go 项目本身也有对 RPC 与微服务开发框架的诉求,如何解决?


基于这两个问题,携程团队基于 dubbo-go 的早期项目,重构开发了更易于扩展且功能更加完善的 dubbo-go v1.0.0 版本,并贡献回了社区。


它首要目的就是解决 Go 项目与 Java & Dubbo 项目的互通问题,同时也为 Go 项目提供了一种 RPC 与微服务开发框架的选择。


dubbo-go 提供客户端与服务器端,目前 dubbo-go 社区作为 Dubbo 生态最活跃的社区之一,后面的定位需要配合 Dubbo 官方的要求与社区用户的需求。


:我们知道 Dubbo 在 Java 生态上是有非常高的成就的,而目前 Go 生态本身也有一些知名的微服务框架,那 dubbo-go 之于 Go 生态,是否有与其它框架比拼的能力?


:我们最大的能力就是作为 Dubbo 的 Go 语言版本,打通了两种语言之间的 gap,让 Dubbo 更加贴近云原生,为开发者也提供了最大的灵活性,显著降低企业现有服务上云的成本,让企业在云原生时代多了一种选择。


:Go 的特性有没有在 dubbo-go 中得到相应的体现?(比如 Go 的高并发是怎么从基于 Java 的 Dubbo 中改造到 dubbo-go 中的?)


:我对于 Go 语言的认知是,首先学习成本比较小,相比于 Java 的学习成本,Go 语言更容易学习和上手。


其次 Go 在语言层面上,比如其 CSP 编程模型在高并发处理上的简单高效、轻量级协程的优势,相比较基于 JVM 的 Java 程序来说,基于 runtime 的 Go 程序瞬时启动能力等特性都吸引着很多开发者,这里就不详细阐述了。


最后就是作为云原生语言的优势,随着 Docker、k8s 与 Istio 等优秀项目的出现,云原生底层基本被 Go 语言统一了,相信企业在云原生模式下开发的日子已经不远了。我觉得 Go 语言的生态应该会越来越好,也会有越来越多的人使用它。


将基于 Java 的 Dubbo 引入到 Go 中,像前边讲的,dubbo-go 带来的优势就是可以快速融入云原生的领域。要说 Go 语言特性体现的话,可以参考一下 dubbo-go 中异步网络 I/O 模型的设计,这部分将 Go 语言轻量级协程的优势体现了出来。


这里也说一下 Go 语言不足的地方:


  • Go 相对 Java 来说还是很年轻的语言,没有模板库可用,所以社区在编写并维护Hessian 2 协议库上付出了很高的开发成本;

  • 比起 Java 的 try/catch 错误处理方式,Go 的 error 处理能力偏弱;

  • 总体生态还是不如 Java,如没有像 Netty 一样的强有力网络 I/O 库。


为什么提到这一点呢,因为 Dubbo 自身使用了 Netty 和 Hessian 2 协议官方 Java 库,而 dubbo-go 在开始做的时候这些都是没有的,这使得 dubbo-go 一路走来非常艰辛,但是社区最终都克服了,并且额外贡献了开源的 Getty 和 Hessian2 项目。


这里特别感谢 dubbo-go 社区早期的组织者于雨,项目的早期版本是 2016 年在其领导胡长城和同事刘畏三支持下开发的,他贡献的 Hessian2 和 Getty 项目,也为最新版本的 dubbo-go 打好了坚实的基础。


:前不久 Dubbo 才宣布之后会在 3.0 中强调 Service Mesh ,这就是语言无关的了,那 dubbo-go 还有必要在这时候加入生态吗?


:Service Mesh 确实是微服务未来发展的一个大方向,但是现阶段在国内大公司还没有看到非常成功的案例,很多中小公司自身微服务还未拆分完毕甚至于还未开始。


目前 dubbo-go 社区优先解决这种类型企业微服务技术落地环节中遇到的问题,专注于补齐相关功能、优化整体性能和解决 bug。至于未来,我相信随着 Dubbo Mesh 在 Service Mesh 领域的探索,dubbo-go 肯定会跟进并扮演重要角色。


:dubbo-go 与 Dubbo 的更新关系是怎么样的?是同步更新特性还是有自己的一些创新?


:我们现在发布的最新版本是 v1.0.0,我们在每一次 release 新的版本后,都会明确说明可以兼容的 Dubbo 版本。所以,dubbo-go 需要兼容对应 Dubbo 版本号的功能,会同步更新一些 Dubbo 特性。


:新发布版本带来什么值得关注的特性?


:当前发布的 v1.0.0 版本支持的功能如下:


  • 角色:Consumer(√)、Provider(√)

  • 传输协议:HTTP(√)、TCP(√)

  • 序列化协议:JsonRPC v2(√)、Hessian v2(√)

  • 注册中心:ZooKeeper(√)

  • 集群策略:Failover(√)

  • 负载均衡:Random(√)

  • 过滤器:Echo Health Check(√)

  • extension 扩展机制


dubbo-go v1.0.0 版本,主要由我和同在携程的同事方银城维护,社区成员周子庆高辛格参与贡献,该版本沿用了 Dubbo 的代码分层解耦设计。Dubbo 2.6.x 的主要功能都会逐渐在 dubbo-go 中实现,包括 Dubbo 基于 SPI 的代码拓展机制,dubbo-go 也有对应的 extension 扩展机制与之对应。


我们在未来将逐渐推出目前可扩展模块的更多实现,如补齐更多的 Loadbalance 负载均衡、Cluster Strategy 集群策略实现(目前这些任务由社区伙伴主动认领,希望更多的 Go 语言爱好者朋友可以加入社区贡献);又如云原生领域非常流行的 k8s,我们也将同步 Dubbo 的 roadmap,跟进 k8s 作为注册中心的支持,目前由社区成员张海彬负责跟进。


当然广大开发者们也可以对这些模块接口进行新的实现,通过 extension 拓展,以完成自己的特殊需求而无需修改源代码。同时,我们非常欢迎开发者为社区贡献有用的拓展实现。


此版本解决了一大重点问题:与 Dubbo Java 版本互通的解决方案。我们将这部分提取出了 Hessian2 项目,该项目源自社区于雨的早期贡献,现在由社区成员望哥负责维护,周子庆高辛格参与贡献。


目前该项目已经完成了对 Java 大部分类型的兼容支持。大家也可以单独将该项目集成到自己的项目中,它的开源协议是 Apache-2.0。


另外一个比较重要的就是 dubbo-go 现在使用的 TCP 异步网络 I/O 库,该库也是基于于雨早期写的 Getty 项目,目前由社区的望哥方银城负责维护,它同样也是 Apache-2.0 的开源协议。下一版本我们会针对 dubbo-go 和 Getty 的网络 I/O 与线程派发这一部分进行进一步优化。


除此之外,我们计划下一步支持 Dubbo 的另外几大重要功能,如:


  • routing rule 路由规则(dubbo v2.6.x)

  • dynamic configuration 动态配置中心(dubbo v2.7.x)

  • metrics 指标与监控(dubbo v2.7.x)

  • trace 链路监控(dubbo ecos)


:目前项目的应用情况如何?


:dubbo-go 现在已经开始被一些企业尝试应用于 Go 语言应用融入企业已有 Java & Dubbo 技术栈,以及搭建全新 Go 语言分布式应用等场景。比如中通快递内部 Go 调用 Java Dubbo 服务;作为携程 Go 语言应用的服务框架以及 Go、Java 应用互通。


具体的应用情况可以查看:https://github.com/dubbo/go-for-apache-dubbo/issues/2


:接下来的演进方向是怎么样的?


:在 dubbo-go 迁往 Apache 软件基金会作为 Apache Dubbo 的子项目后,首先最重要的是性能的进一步优化,目前性能上虽然能够达到应用的生产级别要求,但我们觉得还没有发挥出 Go 语言的优势,还有比较大的优化空间。比如前边提到的 Getty,下一版本会针对 dubbo-go 应用 Getty 的网络 I/O 模型与线程派发做一些优化。


另外包含上面提到的我们近期需要补全一些重要功能,最大限度地在功能完整性上能够跟 Dubbo 兼容。关于未来 dubbo-go 的发展,也会向 Dubbo 2.7.x 版本这条线上的路线图演进。


:说到性能,当前性能情况具体如何?


:我们有做一个 dubbo-go-benchmark 项目,在 CPU 型号为 Intel® Xeon® CPU E5-2609 0 @2.40GHz,CPU 核心数为 4*8 的硬件水平下,发送 1k 并返回 1k 的数据,100 并发数,100w 总请求数,qps 可以达到 1.2 万左右。


CPU 性能换成比较高的配置如 Intel Core i9 2.9GHz,qps 可以到达 2 万左右。


我们后面会对 Hessian2 库和 Getty 库进行持续性能优化,以给广大使用者节约资源。


作者介绍


何鑫铭,携程基础中台研发部技术专家,dubbo-go 主要作者。目前专注于 Golang & Java、中台架构、中间件与区块链等技术。


本文转载自公众号携程技术(ID:ctriptech)。


原文链接


https://mp.weixin.qq.com/s/ndj-bQJXSlm-WVB6D1DjCA


2020 年 2 月 15 日 17:45183

评论

发布
暂无评论
发现更多内容

Spring-技术专题-Bean的生命周期简介

李浩宇/Alex

spring

更改用户host留下的坑

Simon

MySQL

MySQL-长事务详解

Simon

MySQL mysql事务

python自动生成一整月的排班表

openbytes

Python

因为套用这个模板,我成了公司最佳员工

华为云开发者社区

网站架构 华为云 网站搭建 匀速建站 SEO

5. JsonFactory工厂而已,还蛮有料,这是我没想到的

YourBatman

Jackson Fastjson JSON库 JsonFactory

LeetCode题解:66. 加一,倒序遍历+可中途退出,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

MySQL视图介绍

Simon

MySQL

火眼云CEO张陆鹏:A轮融资5000万,解密国内ABM生态首位玩家

ToB行业头条

【数据结构与算法】用动图解说数组、链表、跳表原理与实现

三钻

数组 链表 数据结构与算法 跳表

哥尼斯堡七桥问题

InfoQ_aef2dd810f7f

IOTA架构下的数据采集

易观大数据

通过波士顿矩阵模型做产品定位

GuOjixIE

数据分析 产品定位 波士顿矩阵模型

揭秘MySQL主从数据不一致

Simon

MySQL 主从复制

如何让我的简历有价值、有亮点

escray

学习 面试 简历 面试现场

如何选择一台打印机

别把虾米不当海鲜

90后程序员小姐姐在线征婚!年薪70w!拥有五套房!她却担心自己因为年龄大嫁不出去!

程序员生活志

程序员

芯片破壁者(十三):台湾地区半导体的古史新证

脑极体

[8.20]leetcode每日一题,

一起搞稽

算法 DFS

基于Ambari的大数据平台搭建

数据社

大数据 hadoop ambari

PHP中的错误和异常

书旅

php 异常 常见错误

质量门禁:Verigreen开启Git的Commit门禁

陈磊@Criss

市值管理量化机器人,做市机器人,自动刷单机器人

WX13823153201

比特币 数字货币

设计模式-技术专题-建造者模式(Builder)

李浩宇/Alex

Java 设计模式

PM2 管理node.js开机自启动(非root用户)

openbytes

node.js

史上最强DIY,手工制作一只会说话的机器狗

华为云开发者社区

聊天机器人 nlp 华为云 语言识别 语言合成

LeetCode题解:11. 盛最多水的容器,双循环暴力法,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

37岁程序员被裁,想用6月工资跪舔领导划掉被裁名额,结果蒙了!

程序员生活志

性能优化-技术专题-top和jstack分析高CPU问题

李浩宇/Alex

JVM

关于自增id 你可能还不知道

Simon

MySQL MySQL自增ID

影响音视频延迟的关键因素(二): 采集、前处理、编解码

ZEGO即构

H264 API 3A算法

快速融入云原生,携程开源 Dubbo for Go 版本-InfoQ