bilibili go项目源码分析

时间:2024-10-25 07:30:07
  1. go 项目源码
  2. 约329个Go服务, 历史约170人左右贡献过Go代码. 代码和目录规范性比较好, 代码生成工具建设比较好, 大家可以借鉴一下.
    对于一个Golang开发者来说, 入职B站, 我觉得大概2-3天就可以copy&&paste开始贡献业务代码了. 其他语言开发者,
    3-4天吧, 因为学习Golang花一天. B站Go不依赖CGO, 业务代码可以在windows编译通过! 启动!
    组件基本是基于开源组件封装. RPC基于grpc封装, 协议编码为proto, 没有我们通常那样的包头.
    服务注册与发现已经包装在RPC中. 注册使用自研的discovery, 基于类似url的方式去注册和寻址.
    数据存储多使用memcache, redis和DB. hbase也使用比较多. 用于鉴权, 用户数据存储. 对于一些kv数据,
    外部没有支持冷热分离的kv存储, hbase是一个非常好的选择: 基于HDFS, 热数据加载到内存, 列式存储, 强一致,
    可配置副本数. 消息队列为使用基于kakfa, 实现了redis协议的databus. 小文件存储: B站自己实现的bfs
    监控上报使用的是prometheus, 对于中小公司, 没法建设自己的监控组件, prometheus是很不错的选择. 简单浏览了下,
    这份代码在SQL上没有注入风险. 生产环境的配置并没有在这份代码中. 一个合格的开发者, 即使所有源码流出去,
    也不会对系统造成任何危害. 不过B站的代码似乎打点监控做的不是很多(可能没有太多的去强调?)

cmd: 放和配置文件, 作为启动入口
conf: 放配置文件对应的golang struct, 使用的是toml
model: 放结构体, 比如Http参数转换用的struct, DB存储对应的struct, 各层之间传递用的struct
dao: data access object, 数据库访问方法, redis, memcache访问方法, 还有一些RPC调用也放在这里面
http: 提供http服务, 主要是提供协议转换, 聚合. 逻辑还是再service层做.
service: 对于后端服务来说, 该目录提供服务的实现, 对于http服务, 该目录提供http服务的实现.

所有的服务均遵守该目录结构. model层放VO, DO等, dao层用于数据层封装, 隔离本服务的领域逻辑与外部数据. http层提供协议转换. service实现具体逻辑.
比较像Java开发的模式, 可能在公司很多人不是很喜欢这样复杂的目录, 喜欢什么都放在一个目录下.
不过这样的分目录是一种比较好的实践. 各层分的清清楚楚, 一个服务从1个接口到10个接口, 都比较清晰. 对于服务改动来说,也比较好聚焦于某一层.

B站Golang技术栈分析
技术栈 技术选型 参考链接
RPC 基于grpc封装的warden框架, 已开源 /bilibili/kratos
HTTP框架 基于gin封装的blade master框架, 已开源 同上
服务注册与发现 初期为zk, 后面逐步改为参考Spring Cloud体系Eureka自研的discovery 已开源 /bilibili/discovery
存储 DB, redis, memcache, hbase存储一些用户kv信息和历史流水, 已封装好库 library/database/ client库已开源 /bilibili/kratos
搜索 B站视频, 用户, 历史记录等使用es搜索, 客户端已封装在基础库中 library/database/elastic
小文件存储 毛剑个人研发的bfs, 已开源. /i6272104949560115714/ /Terry-Mao/bfs
消息队列 基于kafka封装的databus
log 基于uber的zap封装的日志框架
配置及配置中心 支持从环境变量读取配置, 从toml中解析配置, 支持远程配置中心(自研, mysql存储, 本地落地,http协议, long poll, 客户端有更新事件, 类似于携程开源的Apollo)
监控 使用开源的prometheus, 框架和库(sql, redis, hbase等)中已预埋计数点和时间统计点, 同时也可以在业务逻辑中打点. library/stat/
trace trace似乎是基于agent的方式, 使用unix domain socket进行传送, 框架和库已预埋点. library/net/
研发流程管理 TAPD, 哈哈, 有相关的tapd struct信息
其中RPC, HTTP框架, 数据访问的一些库封装, 包括生成工具, 均以kratos项目在github开源了(/bilibili/kratos Kratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具)

B站目前使用及封装的中间件的详细介绍在Gopher China 2017 B站的分享有提到原理和使用情况.
/s/4uA6iE7HC_SAfdIATAdrrA
bfs介绍
/p/923917220d23
B站运维体系发展
/slides/3840