微服务——核心服务治理功能 | 青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天 ✌
2.1 服务发布
难点体现:
- 服务不可用:服务升级过程中(新代码覆盖),提供的服务不可用
- 服务抖动:部分流量短暂不可用
- 服务回滚:新代码有问题时回退到上一可用版本
蓝绿部署: 通过两个集群切换使用,切换完成更新。该方案简单、稳定,但需要两倍资源,单个集群使用时需要承受双倍的流量,考验大。
灰度发布(滚动发布): 逐步添加测试实例,确保每个实例可用,但需要针对实例操作流量,粒度较小,操作复杂,任何时候都可能回滚。
2.2 流量治理(流量的精细化控制)
基于地区、集群、实例、请求等维度,对端到端的路由路径选择,实现流量精细化控制。 比如: 对用户、机器量不同的地区赋予不同流量;对于正常请求集群、测试请求集群的流量进行控制,对于运行实例的机器新旧程度不同进行流量控制。
2.3 负载均衡
Load Banlance组件:负责分配请求在每个下游实例上的分布。 常见的LB策略:
- Round Robin:轮询策略,将请求按顺序轮流地分配到请求的服务器上,不关心实际的服务器连接数以及当前系统的负载问题。
- Random:随机策略
- Ring hash:一致性哈希
- Least request: 最小请求数策略
2.4 稳定性治理
“线上服务总是会出问题,且可能与程序的正确性无关。” 应对流量突增:限流策略(通过rate limit组件实现)、过载保护(dynamic overload检测、熔断(短暂拒绝流量)、降级(保证重要服务的正常工作)
在高并发场景下,限流是应对流量高峰的常用方法。其通过限制到达系统的并发请求数量来保证系统能够正常响应部分用户请求,对于超过限制的流量,则拒绝服务以保证整体系统的可用性。
【补充】常用的限流方式: 针对服务器限流:
- 计数器
- 滑动窗口
- 漏桶
- 令牌桶
- Redis + Lua分布式限流
针对容器限流:
- Tomcat:设置最大线程数(maxThreads),当并发超过最大线程数会排队等待执行
- Nginx:两种限流手段,一是控制速率,二是控制并发连接数
Go语言有特定的限流方法,如:channel实现并发控制限流、支持httpserver的第三方库限流。具体参见:《Go限流的常用方法》
其他可能情况:
- 网络攻击
- 机器故障
- 网络故障