-
为什么包取名叫internal,因为go会对这个包名做禁止引用,保证代码的解耦
-
B站v1的httpServer运行
- log
- maxbyte
- maxconn
- 注意limiter初始化的位置
- recover
- timeout(http层次未作拦截,即无传入timeoutHander,但是传入了Context供其他层判断)
- trace(jaeger)
- limit(根据cpu自适应限流,https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81)
- 压测
- promethues监控
- 新增break中间件(接口级别熔断)
- restful路由支持(:id,path参数支持重复)
- default标签改写,之前json格式时不生效
-
grpc功能实现
- etcd注册
- p2c负载均衡
- break
- log
- grpcerror
- metadata
- 级联timeout
- trace
-
demo
-
admin+gorm(share db架构,运营平台微服务共享db和redis,只是权限不同)
-
canal,异步删除缓存
-
service+mysql
-
job+kafka
-
Beanstalkd?
-
数据库delete_time 为null的时间处理,自定义时间
-
errgroup
-
runsafe
-
获取天气的等api的demo,client以及分层设计
-
mysql慢日志,熔断
-
redis慢日志,无熔断(不支持集群)
-
redis的demo,读失败后的写缓存策略(降级后一般读失败不触发回写缓存),空缓存保护策略。
-
redis分布式锁(架构上尽量规避,性能不高,case多,容易出bug)
-
redis令牌桶限流
-
redis漏桶限流
-
基于B站的mysql和go-zero的redis封装cache
-
metadata
-
grpcerror
-
validate
-
贫血模型
-
csv导出
-
breaker(google sre 熔断器)
-
多租户 (流量染色)
-
kafka
-
chan-singleFlight
-
chan-fanout
-
chan-pipeline
-
hash-id封装
-
-
pkg/errors处理指南
- 底层包不需要Wrap,直接返回,或者定义sentinel error
- dao层Wrap,或者其他层第一次定义错误码,也要Wrap
- 已经wrap的err,避免堆栈信息重复,可使用WtihMessage带信息,不处理可直接return
- 在最外层 %+v 打印堆栈信息
- 个人感觉在grpc的client端没必要加日志