• Jupiter 的诞生
  • 为什么选择 Go
  • 与其它微服务框架的区别
  • 微服务架构的意义
  • 拥抱开源的斗鱼
  • 关于未来

上个月,斗鱼将基于 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 架构更好的互通,是团队下一步要努力解决的问题。

微服务架构的意义

分布式的微服务架构从诞生之日起就受到不少争议,网上也有人认为很多企业继续沿用统一部署的传统架构即可,无需盲目追求新技术。吕超结合斗鱼的业务经验,分享了他对于微服务架构应用前景的看法:“ 我觉得技术架构都是一个演进过程,遵从康威定律:组织架构决定技术架构。”

斗鱼是随着业务的发展,组织架构的变迁,导致原有的单体应用架构在维护和治理上存在一定问题,因此逐步迁移到微服务。微服务帮斗鱼解决了以下问题:

  • 服务的可维护:子系统的内聚性,明确了子系统的职责和边界,可以有效降低各个系统的沟通成本和对接成本,架构上可以更加合理高效
  • 服务的高可用:子系统的 SLA 划分,根据不同 SLA 等级,能够对核心服务做优化和灾备,提升服务可用性
  • 服务的可伸缩:子系统的 QPS 划分,根据不同 QPS 量级,能够对服务的容量进行估算,服务做到可伸缩

总的来说,微服务在业务规模、组织架构达到一定程度的时候,有很多不错的维护和治理优势。“ 换言之,**不是我们选择将单体换成微服务,而是业务发展到一定程度需要微服务。**评价一个企业是否需要微服务架构有个最简单的方式,就是两个披萨的理论。如果维护一个单体应用代码,超过了两个披萨的团队,就有可能人数太多导致沟通问题,这个时候,我们可能就需要做一些拆分。”

拥抱开源的斗鱼

国内大厂拥抱开源的例子不在少数。作为一家国内知名的网络直播平台,斗鱼在开源界尚属新面孔。我们请吕超为我们分享了斗鱼的技术团队对于开源的看法。

“ 在开源 Jupiter 之前,我的许多同事也都在不同程度的参与到开源社区,贡献代码。早期参与开源社区的目的,主要是因为因为内部需要,我们二开了很多开源类库。如果及时的把改动反馈到社区,能极大减轻我们的维护成本。随着参与次数的增多,逐渐产生了开源的想法。同时,Go 原生的面向微服务治理的集成方案比较匮乏。非原生的、从其他语言生态搬过来的框架又有一定的理解成本。种种原因促使我们考虑把微服务框架 Jupiter 和治理平台 Juno 同时开源,为微服务架构方案贡献一点点力。”

通过开源 Jupiter,吕超和他的团队全面的梳理了基础框架的架构设计,总结了服务治理的经验,“ 这对未来我们内部的服务架构和治理体系都有非常大的帮助。” 同时,开源社区的积极反馈也给斗鱼的团队带来了很多有价值的意见和建议。

“ 贡献者的反馈也还是比较多的,有讨论服务治理方案的、有询问架构设计的,甚至还有讨论到具体某行代码的。作为一个刚刚开源的新项目,这些反馈对我们都无比宝贵。” 距离项目开源短短半个月的时间,目前 Jupiter 已经获得了 1066 个 Star 。同时,随着 Jupiter 社区的持续完善,以及与其它开源社区的互动,吕超相信这一定会让 Jupiter 和斗鱼内部的治理体系更加健壮。

“ 之前更多的是个人参与,项目也比较分散。借着这次开源的机会,我们会整合一些开发资源,瞄准我们正在使用或将要使用的一些开源项目,参与进去。然后,推动这些项目在我们内部的使用,形成一个良性的互动。”

吕超总结了自己对参与开源的看法。从个人的角度来讲,参与开源能有效提升个人的代码质量。从公司的角度来讲,能更有效的利用共享资源提升效率。总体上,是一件非常有益的事情。

关于未来

斗鱼未来是否还会开源更多的项目?

吕超向我们透露,目前团队计划是围绕微服务框架 Jupiter 和服务治理平台 Juno,持续的推动开源。过去两年,斗鱼内部积累了许多类库,比如基于内存的对象存储 bigmap,高并发的 redis 客户端 redix,对全链路压测的支持等,因为含有一些内部定制的特性,暂时没有开源。但之后团队会进一步整理,逐步通过 Jupiter 把这些内部的项目释放出来。

“ 作为 Jupiter 配套的后台系统 Juno,我们后续计划会持续完善配置中心、注册中心、监控中心、治理中心等等,Juno 不仅会兼容 Jupiter,也会兼容其他开源的框架,为 Go 微服务生态添砖加瓦。”

最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。需要获取的私信【面试资料】获取!

你经常看的斗鱼直播平台,首次开源了自家项目相关推荐

  1. 使用selenium自动爬取斗鱼直播平台的所有房间信息

    使用selenium自动爬取斗鱼直播平台的所有房间信息 文章目录 使用selenium自动爬取斗鱼直播平台的所有房间信息 使用selenium实现动态页面模拟点击 什么是selenium? selen ...

  2. 斗鱼tv服务器响应失败,是直播源码有问题还是服务器太垃圾,斗鱼直播平台频频崩溃是为何...

    原标题:是直播源码有问题还是服务器太垃圾,斗鱼直播平台频频崩溃是为何 1月29日晚,有不少网友反馈称斗鱼直播出问题了,网页能开但是直播看不了,一直显示主播正在连线中请稍后再试的字样,手机端电脑端齐崩溃 ...

  3. 移动直播之网红主播怎样将直播内容推到斗鱼直播平台的方案

    移动直播之网红主播怎样在没有电脑的情况下将直播内容推到斗鱼直播平台 1. 概要 斗鱼直播平台支持第三方推流,本文描述如何用ENC1编码器推流给斗鱼直播平台 1.1 设备连接 准备4G模块[参考链接] ...

  4. selenium抓取斗鱼直播平台数据

    https://www.cnblogs.com/xinyangsdut/p/7617691.html 程序说明: 抓取斗鱼直播平台的直播房间号及其观众人数,最后统计出某一时刻的总直播人数和总观众人数. ...

  5. python抓取直播源 并更新_Python爬虫实例(二)使用selenium抓取斗鱼直播平台数据...

    程序说明:抓取斗鱼直播平台的直播房间号及其观众人数,最后统计出某一时刻的总直播人数和总观众人数. 过程分析: 进入平台首页,来到页面底部点击下一页,发现url地址没有发生变化,这样的话再使用urlli ...

  6. 编码器如何推流给斗鱼直播平台

    本文链接: https://blog.csdn.net/weixin_45326556/article/details/106333590 编码器如何推流给斗鱼直播平台 1. 概要 2. 在直播平台开 ...

  7. Mac OS 下使用OBS 推流到斗鱼直播平台

    先在斗鱼平台开启推流 保存上面的 rtmp地址和直播码 下载和设置OBS 去官网下载,大小为100+M,我下载了好几个小时,网速忒差 安装成功后,直接打开,点击界面右下角的设置按钮,如下 接着点击推流 ...

  8. 斗鱼 html播放器,斗鱼直播平台简易播放器 v1.2 (20180223更新)

    importwin.ui;/*DSG{{*/varwinform = win.form(text="斗鱼简易播放器";right=935;bottom=607) winform.a ...

  9. swiper实现类似虎牙斗鱼直播平台竖向轮播图样式

    先上最终效果图 直接上代码 <div class="bg_banner"><div class="bg_banner_player">& ...

最新文章

  1. 在Ubuntu上通过VNC Viewer连接Jetson nano桌面
  2. c语言fread读取错误,【求助】C语言fread读取二进制文件时,读取结果全都是零
  3. ubuntu pycharm社区版安装
  4. java 对比度,java批改图片亮度对比度
  5. 手把手带你入门加密算法的Python实现
  6. 竞价排名才是万恶之源
  7. Python——(Anaconda+PyCharm)Youki的Python环境配置笔记(Windows版本)(legacy)~
  8. 哈希表、哈希桶数据结构以及刨析HashMap源码中哈希桶的使用
  9. JAVAWEB NOTE 3
  10. TTP229 16路 电容式 触摸开关 数字触摸传感器 模块
  11. pip install pyinstaller安装报错
  12. Halcon 2D图像转3D效果查看
  13. “智数据,创未来”——2018中国存储与数据峰会在京盛大举行
  14. java生成8位的uuid_分布式系统全局唯一ID简介、特点、生成
  15. 自动驾驶系统设计及应用--清华大学出版--部分笔记
  16. 基于STM32单片机和RFID的智能考勤系统设计
  17. 变异系数(测算数据离散程度相对指标)
  18. 安卓大学生考勤签到app毕业设计
  19. ReplayKit2 Broadcast Upload Extension 直播app列表不出现自己的app
  20. 中国人工智能的未来到底通向何方?| CCF-GAIR 2019

热门文章

  1. 8院士齐聚CCAI 2016,全面揭示人工智能最新技术与应用
  2. 修玛服务器维护后会有吗,狮王休玛(休玛刷新前的预兆)
  3. 自己动手实现4大免费聊天机器人:小冰、图灵、腾讯、青云客
  4. BUUCTF-----SoulLike
  5. About ThatsMyJamRadio
  6. 小米8 android 9.0 rom,小米手机安卓8.0安卓9.0 root卡刷教材安卓手机解密手机内存卡刷教程...
  7. Week11——D 寿司
  8. vs2017编译boost库 ,解决无法打开文件“libboost_filesystem-vc140-mt-1_58.lib” 问题
  9. os.listdir的随机性
  10. 马斯克称脑机接口可治疗肥胖症,SpaceX首批游客滞留国际空间站,苹果要下架一批长期不更新App,今日更多大新闻在此...