B站Golang技术栈分析

本文详细介绍了B站使用的微服务框架Kratos,包括RPC、HTTP框架、服务注册与发现、存储、搜索、小文件存储、消息队列、日志、配置中心、监控、trace和研发流程管理等技术组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

其中RPC, HTTP框架, 数据访问的一些库封装, 包括生成工具, 均以kratos项目在github开源了(https://github.com/bilibili/kratos )Kratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具)

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

<think>好的,用户让我介绍一下Golang的面试题,需要详细的内容。首先,我需要回忆常见的Golang面试题,并分门别类整理。通常,面试题会涉及基础语法、并发模型、内存管理、错误处理、标准库、性能优化、项目经验等。 首先,Golang的基础语法部分,可能会被问到变量声明、数据类型、函数方法、接口和结构体的区别,还有defer、panic、recover这些异常处理机制。比如,defer的执行顺序,接口的动态类型和静态类型等。 接下来是并发模型,这是Golang的强项。Goroutine和channel是必问的。比如,如何同步多个goroutine,channel的有缓冲和无缓冲区别,select语句的使用,以及context包的作用。可能还会问及Mutex和RWMutex的使用场景,避免竞态条件的方法。 内存管理方面,可能会涉及垃圾回收机制(GC)的原理,如何减少GC的压力,比如使用对象池(sync.Pool),避免内存泄漏。指针和值传递的区别,栈和堆的内存分配机制也是常见问题。 错误处理部分,Golang没有异常机制,而是用error类型和panic/recover。面试官可能会问错误处理的最佳实践,如何自定义错误类型,以及何时使用panic而不是返回错误。 标准库方面,可能涉及http包的使用,JSON的序列化和反序列化,时间处理,文件操作等。比如,如何创建一个HTTP服务器,处理路由和中间件,或者使用context传递请求范围的值。 性能优化的问题可能包括如何分析程序的性能瓶颈,使用pprof工具进行性能分析,优化GC的策略,减少内存分配,利用并发提升性能等。有时候会问及逃逸分析,如何确定变量分配在栈还是堆上。 项目经验方面,面试官可能会让候选人描述过去用Golang做过的项目,遇到的挑战,如何解决技术难题,团队协作的经验等。这部分需要结合具体案例,展示实际应用能力。 另外,还有一些高级主题,比如反射(reflect包)的使用场景和注意事项,Go Module的依赖管理,交叉编译,测试和基准测试的编写,以及Golang的设计哲学,比如简洁性和高效性。 需要注意的陷阱题,比如for循环中使用闭包导致变量捕获问题,map的并发读写问题,slice和数组的区别,以及接口的nil判断等。这些题目常用来考察对语言细节的理解。 最后,可能还会有一些算法和数据结构的实现,比如用Golang实现链表、二叉树,或者排序算法,但这类问题相对较少,更多关注语言特性和工程实践。 总结下来,我需要将这些内容分门别类,结构清晰,用中文详细解答每个部分的关键点,并给出示例代码,尤其是涉及并发、接口、错误处理的部分。同时,要确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,并检查语法正确性。</think>以下为Golang面试题的详细解析,按常见考点分类整理: --- ### 一、基础语法 1. **变量与类型** - **值类型 vs 引用类型** 值类型(如数组、结构体)直接存储数据,引用类型(如切片、map、channel)存储数据地址。 ```go a := [3]int{1,2,3} // 值类型(数组) b := []int{1,2,3} // 引用类型(切片) ``` 2. **`defer`执行顺序** 多个`defer`按**后进先出**顺序执行,常用于资源释放: ```go defer fmt.Print("A") // 第3执行 defer fmt.Print("B") // 第2执行 defer fmt.Print("C") // 第1执行 ``` 3. **接口实现原理** 接口包含动态类型和动态值,空接口`interface{}`可接收任意类型: ```go var s interface{} = "hello" ``` --- ### 二、并发模型 1. **Goroutine调度** 依赖GMP模型(Goroutine、Machine、Processor),通过**协作式抢占**实现轻量级线程。 2. **Channel同步** - 无缓冲通道:发送和接收需同时就绪(同步) - 有缓冲通道:缓冲区满时发送阻塞 ```go ch := make(chan int) // 无缓冲 chBuf := make(chan int, 3) // 有缓冲(容量3) ``` 3. **竞态条件解决** 使用`sync.Mutex`或`sync.RWMutex`: ```go var mu sync.Mutex mu.Lock() defer mu.Unlock() ``` --- ### 三、内存管理 1. **GC三色标记法** 分阶段标记(黑白灰三色),通过**写屏障**保证并发标记正确性。 2. **逃逸分析** 编译器决定变量分配位置: ```go func foo() *int { x := 42 // x逃逸到堆 return &x } ``` --- ### 四、错误处理 1. **`error` vs `panic`** - 常规错误用`error` - 不可恢复错误用`panic`(如程序启动配置错误) 2. **自定义错误** 实现`Error() string`方法: ```go type MyError struct{ Msg string } func (e *MyError) Error() string { return e.Msg } ``` --- ### 五、高频陷阱题 1. **循环变量捕获** ```go for _, v := range []int{1,2,3} { go func() { fmt.Print(v) // 可能输出3,3,3 }() } // 修复:传递参数 for _, v := range values { go func(val int) { fmt.Print(val) }(v) } ``` 2. **`nil`接口判断** 接口值为`nil`需同时满足动态类型和动态值为`nil`: ```go var p *int = nil var i interface{} = p fmt.Println(i == nil) // false ``` --- ### 六、性能优化 1. **减少内存分配** - 复用对象(`sync.Pool`) - 预分配切片容量 ```go s := make([]int, 0, 100) // 预分配容量 ``` 2. **使用`pprof`分析** ```bash go tool pprof -http=:8080 cpu.prof ``` --- ### 七、标准库 1. **HTTP服务** ```go http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello")) }) http.ListenAndServe(":8080", nil) ``` --- ### 八、设计哲学 - 强调**简洁性**(如隐式接口实现) - **并发原生支持**(goroutine + channel) - **快速编译**(放弃部分运行时优化) --- 掌握以上核心知识点后,建议结合实际项目经验(如高并发服务、微服务架构)进行深入阐述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值