前言
在微服务流行的当下,bilibili(B站)也在业务快速增长的压力下,对历史系统进行了不断的优化,在所谓“大系统小做”的背后付出了挺多的努力,尤其是 Go 作为开发语言的整体运维的支撑相对比较薄弱,例如开发、部署、测试、集成、监控,调试等。在 GopherChina 2017大会上,B 站技术总监毛剑分享了微服务化道路上踩的“坑”以及最终演进后对整个微服务框架的思考。
本次演讲的内容会包含以下几块:1.B站微服务的演进过程;2.高可用;3.中间件;4.持续集成和交付;5.运维体系。
作者介绍
2015年起,在 bilibili(B站)负责 UGC平台和基础架构,开发了直播弹幕开源推送服务 goim ,B站分布式存储 BFS ,引导开发了B站 cache proxy,bili twemproxy 等,对历史主站架构进行迭代和重构,之前六年在猎豹移动工作,当过MySQL DBA,做过C开发,其中开发了gopush-cluster用于猎豹移动的推送体系。喜欢应用服务性能诊断,内核研究,稳定的服务端架构演变。
微服务的演进
原始框架
在刚进入 B站时,面临着技术架构上的一些挑战:首先是部署非常不方便,我们要在没有任何东西依赖的情况下把整套主站搭起来;然后代码方面有两个仓库,要部署的时候全部打包一块往上面扔,结果经常起不来;另外测试的成本也非常高。这样导致的后果是整个开发效率也比较低,因为职责不清晰,整个代码是一坨,不知道哪一个模块是谁负责,甚至有一些是公共的部分是很多人在负责。如图1所示。
升级理念
因为整个B站的业务非常繁杂,我们先从全貌去看到底应该怎么拆分。所以我做了一个图,如图2所示。
图2
最顶层从我的视角看,一个是用户纬度,还有一个帐号,你从中间的服务看,它有会员、投稿、用户财产信息,还有关系链、动态推荐等。从底层的一些辅助服务看,有验证码、IP的查找、推送、配置中心,包括protobuffer的一些服务管理。
为什么要强调这个事情呢?就是起步做微服务的时候,一定要搞清楚整个业务的责权或者叫边界。我们一开始的打法就是农村包围城市,跟所有核心有关的业务逐步拆了。比如用户的播放历史、收藏夹、评论等,这些是跟我们