云原生go-zero微服务框架设计思考

  • go-zero之前世今生
  • go-zero是如何设计的
  • go-zero如何高效解决问题
展开查看详情

1.云原生go-zero微服务框架设计思考 万俊峰Kevin@好未来

2. ● go-zero作者 ● 好未来资深专家 关于我 ● 晓黑板研发负责人 万俊峰Kevin ● 十多年研发团队管理经验 ● 近20年开发和架构经验

3. ● go-zero之前世今生 Agenda ● go-zero是如何设计的 ● go-zero如何高效解决问题

4.go-zero之前世今生

5. ● 单体服务的困局 ● 架构的选型 ● 如何无痛切换 go-zero的由来

6. ● Web & RPC微服务框架 ● 微服务代码生成工具goctl ● 通用API定义规范 go-zero是什么?

7.go-zero的设计原则 ● 保持简单,第一原则 ● 弹性设计,面向故障编程 ● 工具大于约定和文档 ● 尽可能约束做一件事只有一种方式 ● 对业务开发友好,封装复杂度

8.go-zero是如何设计的

9. 客户端 iOS 安卓 web PC HTTP协议 鉴权&防重放 加解密 日志记录 API端 异常捕获 监控报警 数据统计 并发控制 链路跟踪 超时控制 自动熔断 自动降载 服务发现 ETCD集群 gRPC协议 调用鉴权 缓存控制 日志记录 Service端 异常捕获 监控报警 数据统计 并发控制 链路跟踪 超时控制 自动熔断 自动降载 缓存层 Redis集群 Redis集群 Redis集群 数据库 MySQL集群 MongoDB集群 ClickHouse集群

10. 代码未动,数据先行 ● 定义数据边界 ● 数据库互相隔离,通过RPC访问 ● No join, no pain! 用户 商品 订单 物流

11. service 如何设计缓存 ● 缓存穿透,不存在的数据 ● 缓存一分钟 ● 缓存击穿,热点key过期 redis1 ● 只拿一次数据,共享结果 ● 缓存雪崩,大量缓存同时过期 redis2 mysql/mongo clusters ● 过期时间设置随机偏差 redis3

12.类似DB的缓存索引方式

13.缓存的最佳实践 ● 不允许不过期的缓存 ● 分布式缓存,易伸缩 ● 自动生成,自带统计

14. rpc服务层 - zRPC ● 协议选择 - gRPC ● 服务发现方式 - etcd etcd ● 负载均衡 - p2c ewma watch发现 注册上报 ● 支持自定义中间件 service1 service2 rpc call

15.Power of Two Choices ● 默认算法 ● 当前请求数 ● 处理时长 ● 指数加权移动平均 参考自Nginx & Envoy & Finagle & Linkerd: ● https://www.nginx.com/blog/nginx-power- of-two-choices-load-balancing-algorithm/ ● https://linkerd.io/2016/03/16/beyond-round- robin-load-balancing-for-latency/

16. api gateway层 ● 流控 ● 请求鉴权 ● 请求参数校验 ● 业务聚合 ● 支持自定义中间件

17.自适应熔断 ● Google SRE算法 ● 放弃了Netflix Hystrix算法 ● 基于滑动窗口(10秒/40窗口) ● 支持自定义触发条件 ● 支持自定义fallback ● http/rpc框架内建 ● 自动触发,自动恢复

18.自适应降载 ● K8S的HPA 80%触发 ● CPU>90%开始拒绝低优先级请求 ● CPU>95%开始拒绝高优先级请求 ● 基于滑动窗口,防止毛刺 ● 有冷却时间,防止抖动 ● 实践检验,配合K8S弹性伸缩 ● http/rpc框架内建

19. 更多组件 ● 超时 ● 级联调用 ● 跟客户端超时配合 ● 重试 ● 指数退避 ● 流量quota ● 超时相关性

20. 多重防护,保障高可用 并发控制 自适应降载 自适应熔断 Requests Rpc Call 限流 K8S弹性伸缩 负载均衡

21. 可观测性 ● 链路跟踪 ● Logging ● Metrics ● 监控报警

22.没有度量,就没有优化! ● 数据上报到控制台服务 ● 数据上报到prometheus

23.go-zero如何高效解决问题

24.

25.

26.http请求自动解析校验 支持的特性 ● tag支持:path, form, json ● default, optional, options, range 解析校验 ● httpx.Parse(...) ● 参数错误自动返回400 ● 支持自定义错误返回方式

27.

28.https://github.com/tal-tech/go-zero https://zero.gocn.vip 欢迎 star, fork, issue, PR! 👏

29. 谢谢! 简单,是终极的复杂!