本章要点
- 服务降级设计
- 服务限流/熔断设计
- 服务灰度发布设计
1.服务降级设计
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
目的:保证核心服务可用,非核心服务弱可用或甚至不可用
手段: 1)拒绝部分请求; 2)关闭部分服务
![](https://img.haomeiwen.com/i11017946/6f26a254b3c4fb94.png)
服务层面进行分级别,按照服务的重要性进行降级。
2.服务限流设计
限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源
常用的限流算法有两种:令牌桶算法和漏桶算法
2.1 令牌桶算法
- 按照固定速率往桶中添加令牌;
- 当桶满时,新添加的令牌被丢弃或拒绝;
- 当请求来时,如果能够成功从桶里获取到令牌,则处理请求,否则拒绝处理请求
- 当桶里没令牌时,不能再继续处理请求
image.png
Guava是google提供的java扩展类库,其中的限流工具类com.google.common.util.concurrent.RateLimiter采用的就是令牌桶算法
2.2 漏桶算法
- 桶的容量是固定的
- 按照常量固定速率流出水滴;
- 以任意速率流入水滴到漏桶;
-
如果桶满了,则直接丢弃
image.png
2.3 限流应用
2.3.1 网关层限流
- nginx+lua脚本
2.3.1 业务层限流
- redis+lua
- guava的RateLimiter
- 业务网关(gateway)限流
- sentinel限流
3.服务熔断设计
在分布式的环境或者微服务中,不可避免的会出现一些错误,一个服务的失败或许会导致整个项目的失败。熔断就是通过添加容错逻辑来保护或者控制你的分布式服务之间的交互,通过隔离服务之间的访问点,阻止它们之间的级联故障以及提供后备选项来实现这一目标,所有这些都可以提高系统的整体弹性。
限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源
熔断框架:Hystrix,Sentinel,Resilience4j等
4.服务发布
4.1 服务发布策略
发布策略:蓝绿发布、滚动发布、灰度发布
蓝绿发布
蓝绿发布:同时运行新旧两个版本的应用,当新版本服务出现问题时,切换到老版本服务。
- 优点:升级切换和回退比发布回滚迅速。
- 缺点:成本较高,需要部署两套环境。切换是全量切换,如果新版本中服务出现问题,会瞬间影响全网用户
滚动发布( Rolling Release )
滚动发布:在升级过程中,并不一下子启动所有新版本;而是分批次部署新版本应用,直到集群升级完成
- 优点:出现问题不会影响全网用户,适合大规模应用发布
- 缺点:发布和回滚周期较长
灰度发布(金丝雀发布)
灰度发布:是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用旧系统,一部分用户开始用新系统,如果用户对新系统没有什么反对意见,那么逐步扩大范围,流量逐渐迁移到新系统上来,把所有用户都迁移到新系统上来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
- 优点:灵活,策略自定义,可以按照流量或具体的内容进行灰度(比如不同账号,不同参数),出现问题不会影响全网用户
- 缺点:没有覆盖到所有的用户导致出现问题不好排查
4.2 灰度发布设计
![](https://img.haomeiwen.com/i11017946/2a703288831698a5.png)
![](https://img.haomeiwen.com/i11017946/196c1234223e0f46.png)
网友评论