Java教程

b站泄露的openbilibili源码,框架大致解读

本文主要是介绍b站泄露的openbilibili源码,框架大致解读,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

b站泄露的openbilibili源码,网上到处都是,比如 https://gitee.com/guiyunweb/openbilibili

 

关于在Goland IDE里读这个openbilibili项目方便自动跳转到定义处以调用处,直接把这个项目放到go path下,注意要把名字openbilibili改成go-common 比如我gopath是/home/zjsxwc/go 那么项目代码目录就是  /home/zjsxwc/go/src/go-common/  然后goland打开这个目录项目就行。

 

每个功能模块都会被编译成一个可执行文件,见app/main/service/<功能模块名>/cmd/main.go

这个可执行文件,会对外提供三种调用, 1. http接口 2. 内部基于tcp直接调用的b站自己写的gorpc  3. 各个语言都通用的grpc

实际业务实现在 app/main/service/<功能模块名>/service/<各个文件>.go 中,

一般都会至少提供一个叫/ping的http接口用于监控和一个 /register 的http接口提供用于服务注册发现的数据。

 

每个队列的job也被编译成了可执行文件,见 app/job/main/<功能模块名>/cmd/main.go 以及 app/job/main/<功能模块名>/service/service.go中,一般job的线程函数在consumeproc,

cmd/main.go还会对外提供http接口控制,一般都会至少提供一个叫/ping的http接口用于监控。

 

有些接口会有缓存与真实实现多个出现,真实实现以Raw开头,比如 RawUserCoin() 就是通过sql查数据库的,而不以Raw开头的UserCoin()是通过缓存或者rpc获取数据

涉及数据库事务包裹的sql方法会以Tx开头,比如TxUpdateCoins

 

b站代码对于高频率接口请求,会使用的队列配合cache缓存实现:

比如被点赞加币,就会

同时 -------->  不阻塞发起队列异步job ->    更新cache中的用户币数目

+++++++++++++++|

+++++++++++++++|

同时 -------->     job中更新数据库的用户真实币数目

 

一般job下的DAO(在app/job/main/<功能模块名>/dao/<各个文件>.go)都是直接数据库操作,而service下的DAO(在 app/main/service/<功能模块名>/dao/<各个文件>.go)则会涉及rpc、缓存、队列、数据库等多种数据来源

 

代码中的毒屎:

队列的databus中library/queue/databus/databus.go:59  redis的命令被故意写错,把PUBLISH写错了set,把SUBSCRIBE写错了mget

_cmdPub     = "SET"
_cmdSub     = "MGET"

redis.ByteSlices(c.Do(_cmdSub, "")) 这条被订阅subscribe的主题被故意写成空字符串。

 

这篇关于b站泄露的openbilibili源码,框架大致解读的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!