• 为什么包取名叫internal,因为go会对这个包名做禁止引用,保证代码的解耦

  • B站v1的httpServer运行

  • 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端没必要加日志