你看得起劲的斗鱼直播,已经在 GitHub 开源了自家项目!
前不久,斗鱼将基于 Go 语言的微服务框架 Jupiter 开源。作为国内知名的互联网直播公司,这也是斗鱼首次以公司的名义正式推出开源项目。
近年来,得益于日渐增长的高并发业务需求,微服务架构开始在国内逐渐普及。同时,专为高并发而生的 Go 语言及其相关生态在国内的发展也突飞猛进。目前,市面上主流的微服务架构包括 Spring cloud、Dubbo 等,并且都有团队为之专门推出了对应的 Go 版本,以充分发挥 Go 在微服务架构中的高并发优势。
而网络直播正是一项高并发的业务,斗鱼的分布式业务模型一直让我们颇为好奇。为进一步了解斗鱼的 Jupiter 与其他主流微服务框架的区别,以及斗鱼内部技术栈的发展,我们第一时间邀请到了斗鱼 Go 团队研发工程师吕超,一起回顾了 Jupiter 的开源历程,以及斗鱼近几年的技术栈变化。
Jupiter 的诞生
据悉,Jupiter 脱胎于斗鱼内部的 Golang 微服务框架,经过三年打磨、几百个服务的线上验证,并历经多机房建设、云化、容器化等多次基础架构演进。目前,Jupiter 发布了 0.5.0 版本,基本涵盖了内部框架的主要功能。但因为内部框架含有许多定制的特性以及一些历史包袱,许多功能并没有完整释放出来。“ 我们也在整理,尽快把这部分功能释放出来。”
那么斗鱼在搭建微服务架构的过程中,为什么不采用现成的微服务框架,而是选择自己“造轮子”,重新创造了 Jupiter 呢?吕超告诉我们,斗鱼是在 2016 年底开始启用微服务架构的,也是在当时引入了 Go 技术栈。
Jupiter 也不是一开始就构思好的。“ 刚开始,我们大量使用开源的类库来攒应用。开源类库的功能不足,bug 没法及时修复,我们就二开。为了满足内部多技术栈通信的需求,我们开始编写统一的 RPC 框架,逐渐形成了早期的 Jupiter。” 随着服务规模的增长,基础架构的演进,Jupiter 也在不断成长为支持多应用场景、关注开发效率和治理效率,并能从容应对基础架构演进的微服务框架。
作为一个成长中的开源项目, Jupiter 与市面上的 Spring Cloud、Dubbo 这类成熟的框架相比,并不算完美。“ 在功能上, Jupiter 还有许多不足。但 Jupiter 是 Go 原生的,采用的许多方案也都是 Go 生态里大家喜闻乐见的,比如 gRPC、ETCD、Prometheus、Jaeger 等。同时,Jupiter 是面向服务治理的框架,对一些模块的处理比较开放,比如 echo、gin 这些都很容易集成进来,当然也包括各公司自研的 RPC 框架。” 吕超表示,虽然目前的 Jupiter 还不是最完美的框架,但却是基于斗鱼多年的实际业务经验积累起来的,是目前最适合斗鱼的微服务架构。
为什么选择 Go
Go 语言是由谷歌于 2009 年推出的一门相对比较新的编程语言,因其原生支持高并发的特性,被誉为云原生时代的容器语言。但 Go 在国内的起步较晚,目前 Go 相关的生态在国内还并不完善,甚至还有很多开发者仍对这门所谓的云原生时代新语言持观望态度。在与吕超的交流中我们得知,成立于 2014 年的斗鱼最开始使用的也不是 Go 。
“ 斗鱼 Web 部门一开始使用的是 PHP,一直到 2016 年底,为应对业务规模的快速增长,逐步引入 Go、Java 从而形成了多技术栈的局面。” 吕超介绍说,“ 引入 Go 也是看中了 Go 在高并发应用开发和容器化上的优势,事实上在随后两年的服务化工程中,Golang 确实也展现了这种优势。”
然而迁移到 Go 的过程并不容易。据吕超回忆,“ 由弱类型语言转向强类型语言,类库的匮乏,以及 Go 在包管理功能上的混乱都给我们造成了不少的困难。但 Go 语言机制比较简单和直观,没有那么多花里胡哨的东西,这也带来一个潜在优势就是 Go 应用的重构和迭代成本是非常低的,这一定程度上降低了迁移的难度。”
也正是为了提高 Go 应用的开发效率,斗鱼的团队开发了 Jupiter 。“ 随着应用规模的增大,Jupiter 也非常关注治理效率。服务化做的差不多的时候,也开始承担多机房建设、云化、容器化、混沌工程等基础建设的一些工作,以保障业务逻辑与这些基建的无缝对接。当然这里更多的是需要治理平台和运维的 PaaS 平台的支持,幸运的是,我们的服务治理平台 Juno 也开源了。通过 Jupiter 和 Juno,可以实现比较完整的服务治理体验。”
与其它微服务框架的区别
由于 Go 语言支持高并发特性,一些已经比较成熟的微服务架构也在近期推出了 Golang 重构版本,比如我们前
段时间报道的 Dubbo Go 。吕超表示,他们的团队也一直在关注 Dubbo Go 这个项目,同时也很乐见 Golang 生态里有这样优秀的 RPC 框架。实际上,Jupiter 与 Dubbo Go 等这些优秀的 RPC 框架相比,更多的是一种互补的关系。
首先,相比于 RPC 框架,Jupiter 更侧重于微服务治理。斗鱼内部的 Jupiter 深度定制了 echo, gRPC 框架,并支持公司内部自研的 RPC 框架。一方面是为了解决公司内部多技术栈 (php/Go/java/cpp) 的数据通信,另一方面也是为了解决早期一些开源框架功能不足的问题。
但是随着公司内部 RPC 框架的整合,以及开源框架的持续完善,这两个问题得到了很大的缓解。“ 所以我们也在逐步简化 RPC 框架,专注于服务治理。开源的 Jupiter 也延续了这个理念,通过简单的适配,gin/Goframe 等优秀框架都可以很方便的集成进来,这里的适配主要指一些基于管理和治理需要的必要封装。”
其次,Jupiter 不只是一个 RPC 框架。Jupiter 关注的是应用的服务治理,除了 RPC,应用还有缓存、存储、消息队列、任务编排等。这些都是需要治理的,除了可观测性的三驾马车: 日志埋点、指标采集、链路追踪外,Jupiter 还支持统一错误码、在线 profiling、开发模式、动态配置等基础功能,治理精度更高,维度更丰富。
我们知道,微服务架构中的一个关键点是服务之间的通信,特别是多技术栈场景下的跨语言通信。在斗鱼内部,Java 团队采用的就是 Dubbo 框架,为了实现 Go 应用与 Java 应用通信,团队采用了一种折中的办法是:
Java 团队的 Dubbo 框架采用 Dubbo-gRPC 作为通信协议,实现通信协议上的互通。
Go 团队的 Jupiter 框架通过多注册键的方式,支持 Dubbo 基于接口的注册协议,实现服务注册和发现上的互通。
“ 这个方法虽然能用,但不那么优雅。真正要解决问题,还是需要打通服务注册协议。我们注意到了 Dubbo 和 Dubbo Go 基于应用注册方面的进展,我们对此非常期待,也在研究怎么把 Jupiter 和 Dubbo Go 做一个结合,从而优雅的与 Dubbo 互通。” 吕超表示,让 Jupiter 与 Dubbo 架构更好的互通,是团队下一步要努力解决的问题。
微服务架构的意义
分布式的微服务架构从诞生之日起就受到不少争议,网上也有人认为很多企业继续沿用统一部署的传统架构即可,无需盲目追求新技术。吕超结合斗鱼的业务经验,分享了他对于微服务架构应用前景的看法:“ 我觉得技术架构都是一个演进过程,遵从康威定律:组织架构决定技术架构。”
斗鱼是随着业务的发展,组织架构的变迁,导致原有的单体应用架构在维护和治理上存在一定问题,因此逐步迁移到微服务。微服务帮斗鱼解决了以下问题:
评论