辗转找到bilibili的GO源码,最初泄漏地址 github.com/openbilibili 已经因为违反DMCA被移除。
项目根目录下的app目录包含全部应用源码:
| 目录名 | 内容 |
|---|---|
| admin | 管理后台 |
| common | ??? |
| infra | 基础设施类 |
| interface | 接口 |
| job | 消息队列消费 |
| service | 功能模块 |
| tool | 工具类 |
service 功能模块
功能模块中包含多个分类:
- bbq
- ep
- live
- main
- openplatform
- ops
- video
每个分类中又包含多个微服务模块。
微服务模块 main/account
| 目录名 | 内容 |
|---|---|
| api | gorpc proto |
| cmd | 启动入口类 toml配置文件 |
| conf | 配置类 |
| dao | 数据链接层 |
| model | 数据模型 |
| rpc | rpc |
| server | grpc http |
| service | 业务实现层 |
cmd/main.go
解析命令行参数后并初始化配置文件后,
分别启动 rpcSvr wardenSvr httpSvr,
并进入无限循环获取 os.Signal 信道的信息,
获得指定信号后中止应用。
server/http/http.go
cmd/main.go中调用http.Init()后,
根据传入配置构建blademaster的engine、注册路由及方法,
最后启动engine。
job 消息队列消费模块
与其他模块一致,同样包含多个分类。
微服务模块 main/account-recovery
目录结构与上述微服务模块大体一致。
service/service.go
http/http.go的初始化中调用service.New()后,
根据传入配置构建service,
同时以Goroutine的方式调用service中的全部Consumeproc方法,
方法中无限循环获取对应Databus中Message信道的信息,
并反序列化后调用相应方法。
import (
"context"
"sync"
v1 "go-common/app/service/main/account/api"
"go-common/library/stat/prom"
"go-common/library/sync/errgroup"
)
var _ _cache
// Info get data from cache if miss will call source method, then add to cache.
func (d *Dao) Info(c context.Context, id int64) (res *v1.Info, err error) {
addCache := true
res, err = d.CacheInfo(c, id)
if err != nil {
addCache = false
err = nil
}
if res != nil {
prom.CacheHit.Incr("Info") //缓存击中统计
return
}
prom.CacheMiss.Incr("Info")
res, err = d.RawInfo(c, id)
if err != nil {
return
}
miss := res
if !addCache {
return
}
d.cache.Do(c, func(ctx context.Context) {
d.AddCacheInfo(ctx, id, miss)
})
return
}