高并发系统微服务治理实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. 高并发系统微服务治理实践
万俊峰Kevin
2. 关于我
• go-zero 作者
• 阿里云 MVP
• 腾讯云 TVP
• ArchSummit 明星讲师
• GopherChina 主持人 & 金牌讲师
• QCon+ Go 语言出品人兼讲师
• 腾讯云开发者大会讲师
3. TOC
•
•
•
•
微服务项目如何设计
微服务拆分方法
微服务如何保障高并发高可用
go-zero工程化实践
4. 微服务系统如何设计
5.
6.
7. 大型微服务系统全览
8. 微服务系统请求链路
9. 重定向故障案例
10. Kubernetes or ECS?
• Kubernetes的本质
• 运维工具
• Kubernetes的好处
• 自动调度
• 服务自我恢复
• 分发的是最终状态
• 负载均衡,水平伸缩
• 资源更充分利用
• 系统更可靠
11. 持续集成
• 持续集成方案选择
• 自建gitlab
• GitHub
• 好处
• 代码规范检测
• 单元测试
• 集成测试
• 文档同步
• 所有能自动化的事情都应该集成到CI里
12. 微服务如何拆分
13. 微服务数据库拆分
• 数据不能乱,规则先确定
• 定义数据边界,避免数据冗余
• 数据库互相隔离,避免故障传递
•
No join, no pain!
用户
商品
订单
物流
14. 接口聚类收敛
• 按功能聚类接口
• 避免微服务过微
• 避免调用链路过深
15. 高内聚、低耦合
• 面向对象设计方法论
• 按业务领域拆分
• 按功能和能力拆分(中台)
• 按重要程度拆分(减少更新、保障稳定)
16. 正交拆分原则
• 易设计、测试、上线
• 提高开发效率,降低⻛险
17. 避免微服务过微
• 避免一个API一个微服务
• 服务粒度适中,渐进式拆分
• 定义好调用深度底限
• 团队足够轻量
18. 避免环形依赖
• 环形依赖升级、维护困难
• 重新思考如何设计解耦
• 消息中间件
19. 考虑接口幂等性
• 牵涉到库存、支付等
• 自动重试要谨慎
20. 数据结构独立性
• 每个API、RPC都有自己的数据结构
• 避免透传
• 避免传染
21. 拒绝联表查询
• 避免数据耦合
• 不易扩展、难独立部署
• 性能问题
• No join, no pain!
22. 微服务框架的设计与实现
23.
24. api gateway层
● 流控
● 请求鉴权
● 请求参数校验
● 业务聚合
● 支持自定义中间件
25. 请求鉴权
● Json Web Token
● 鉴权中间件
● 自动续期
26. 中间件设计
● 默认中间件
● 限流
● 熔断
● 降级
● 链路追踪
● 超时控制
● 日志
● 支持自定义中间件
● svr.Use(…)
27. RPC 服务层 - zRPC
● 协议选择 - gRPC
● 多种服务发现方式
● 负载均衡 - p2c ewma
● 支持自定义中间件
28. 服务注册与发现
service
registry
● 直连方式
● ETCD服务发现
watch发现
注册上报
● Kubernetes服务发现
● consul, nacos等扩展支持
service1
rpc call
service2
29. go-zero 服务发现示例
● API Gateway 发现 RPC
● RPC 发现 RPC
● ETCD
● Endpoints
30. ETCD服务发现
● 维护ETCD集群
● 不依赖Kubernetes
31. Kubernetes服务发现
● 本身也是ETCD
● 配置ServiceAccount
● 更易运维
● k8s://myns/mysvc:3456
32. 应对故障
33. 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/
34. 中间件设计
● 默认中间件
● 限流
● 熔断
● 降级
● 链路追踪
● 超时控制
● 日志
● 支持自定义中间件
● svr.Use(…)
35. 自适应熔断
● Google SRE算法
● 放弃了Net ix Hystrix算法
● 基于滑动窗口(10秒/40窗口)
● 支持自定义触发条件
● 支持自定义fallback
● http/rpc框架内建
● 自动触发,自动恢复
36. 自适应降载
● K8S的HPA 80%触发
● CPU>90%开始拒绝低优先级请求
● CPU>95%开始拒绝高优先级请求
● 基于滑动窗口,防止毛刺
● 有冷却时间,防止抖动
● 实践检验,配合K8S弹性伸缩
● http/rpc框架内建
37. 更多治理考虑
● 超时
● 级联调用
● 跟客户端超时配合
● 重试
● 指数退避
● 流量quota
● 超时相关性
38. 多重防护,保障高可用
并发控制
自适应降载
自适应熔断
Rpc Call
Requests
限流
K8S弹性伸缩
负载均衡
39. 微服务可观测性
● OpenTelemetry
● jaeger
● zipkin
40. 微服务可观测性
41. 微服务可观测性
42. goctl 效率工具
43. https://github.com/zeromicro/go-zero
https://go-zero.dev
欢迎 star, fork, issue, PR! ?
44. https://github.com/zeromicro/go-zero