设为首页 加入收藏

TOP

Sentinel入门到实操 (限流熔断降级)(二)
2023-07-26 08:16:09 】 浏览:141
Tags:Sentinel
ientFallbackFactory注册为一个Bean:

记得配置类需要@Component

@Bean
public UserClientFallbackFactory userClientFallbackFactory(){
    return new UserClientFallbackFactory();
}

步骤三:在feing-api项目中的UserClient接口中使用UserClientFallbackFactory:

import cn.itcast.feign.clients.fallback.UserClientFallbackFactory;
import cn.itcast.feign.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(value = "userservice", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

重启后,访问一次订单查询业务,然后查看sentinel控制台,可以看到新的簇点链路:

image

雪崩问题

白话:雪崩问题是微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。

服务A和其他服务需要服务D响应,但此时服务D故障了,服务A无法接收到结果。由于服务器支持的线程和并发数有限,请求一致阻塞会导致服务器资源耗尽,从而导致依赖于当前服务的其它服务随着时间的推移,最终也都会变的不可用,形成级联失败,雪崩就发生了

与服务D线程有关的服务雪崩:

服务D故障——> 服务A等有关服务阻塞

与服务D线程无关服务雪崩:

服务D故障——> 大量请求阻塞 ——> 服务器资源耗尽 ——>其他服务变得不可用 ——> 级联失败(雪崩)

如果服务提供者I发生了故障,当前的应用的部分业务因为依赖于服务I,因此也会被阻塞。此时,其它不依赖于服务I的业务似乎不受影响。但是,依赖服务I的业务请求被阻塞,用户不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞。服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,那么当前服务也就不可用了。那么,依赖于当前服务的其它服务随着时间的推移,最终也都会变的不可用,形成级联失败,雪崩就发生了

image

解决方案

限流是对服务的保护,避免因瞬间高并发流量而导致服务故障,进而避免雪崩。是一种预防措施。

超时处理、线程隔离、降级熔断是在部分服务故障时,将故障控制在一定范围,避免雪崩。是一种补救措施。

1. 预防措施

1.1 限流

流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。

image

2. 补救措施

2.1 超时处理

超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待

image

2.2 舱壁模式

舱壁模式来源于船舱的设计:船舱都会被隔板分离为多个独立空间,当船体破损时,只会导致部分空间进入,将故障控制在一定范围内,避免整个船体都被淹没。

image

我们可以限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。

image

2.3 断路器

断路器模式:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。

断路器会统计访问某个服务的请求数量,异常比例:

image

当发现访问服务D的请求异常比例过高时,认为服务D有导致雪崩的风险,会拦截访问服务D的一切请求,形成熔断:

image

限流:流量控制

1. 簇点链路

当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的一个调用链就叫做簇点链路。簇点链路中被监控的每一个接口就是一个资源

默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint,也就是controller中的方法),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。

例如,我们刚才访问的order-service中的OrderController中的端点:/order/{orderId}

image

流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:

  • 流控:流量控制
  • 降级:降级熔断
  • 热点:热点参数限流,是限流的一种
  • 授权:请求的权限控制

2. 流控模式

QPS是每秒请求数

流控模式有哪些?

?直接:对当前资源限流

?关联:高优先级资源触发阈值,对低优先级资源限流。

?链路:阈值统计时,只统计从指定资源进入当前资源的请求,是对请求来源的限流

2.1 直接模式

直接模式:请求访问接口在每秒内只能通过n个请求(n是单机阈值),其他请求会报错429:被限流

配置规则:

image

2.2 关联模式

需要对哪个接口限流就对哪个接口(端点)设置流控

使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。

满足以下条件可以使用关联模式:

  • 两个有竞争关系的资源
  • 一个优先级较高,一个优先级较低

关联模式:统计与当前资源相关的另一个资源(相不相关人为说了算),触发阈值时,对当前资源限流

配置规则

image

语法说明:当/write资源访问量触发阈值n时,就会对/read资源限流,避免影响/write资源。

举例:

需求说明

  • 在OrderController新建两个端点:/order/query和/order/update,无需实现业务

  • 配置流控规则,当/order/ update资源被访问的QPS超过5时,对/order/query请求限流

1)定义/order/query端点,模拟订单查询

@GetMapping("/query")
public String queryOrder() {
    return "查询订单成功";
}

2)定义/order/update端点,模拟订单更新

@GetMapping("/update")
public String updateOrder() {
    return "更新订单成功";
}

重启微服务并访问接口,查看sentinel控制台的簇点链路:

image

3)配置流控规则

对哪个端点限流,就点击哪个端点后面的按钮。我们是对订单查询/order/query限流,因此点击它后面的按钮:

image

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 2/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【Spring】Bean装配类注解 下一篇二维数组的定义方式有几种

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目