1.Sentinel是什么?能做什么?
Sentinel:
Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。官网地址:https://sentinelguard.io/zh-cn/index.html
作用:
1.1、丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
1.2、完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
1.3、广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
1.4、完善的SPI扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
2.描述雪崩问题?解决方案有哪些?
一、雪崩问题:
微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。
如果服务提供者I发生了故障,当前的应用的部分业务因为依赖于服务I,因此也会被阻塞。此时,其它不依赖于服务I的业务似乎不受影响。
但是,依赖服务I的业务请求被阻塞,用户不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞。
服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,那么当前服务也就不可用了。
那么,依赖于当前服务的其它服务随着时间的推移,最终也都会变的不可用,形成级联失败,雪崩就发生了。
二、解决方案:
1)超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待
2)仓壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。
3)断路器模式:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。
4)流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。
3.什么是Sentinel的资源?
资源:
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
规则:
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
4.流控模式有哪些?
1)直接: 当前资源请求数量达到阈值时,对当前资源做限流
2)关联: 统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
3)链路: 只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。
5.流控效果有哪些?
流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
1)快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
2)warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。
3)排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长
6.Feign整合Sentinel步骤?
1)修改配置,开启sentinel功能修改OrderService的application.yml文件,开启Feign的Sentinel功能:feign:sentinel:enabled: true # 开启feign对sentinel的支持2)编写失败降级逻辑1.在feing-api项目中定义类,实现FallbackFactory:代码:@Slf4jpublic class UserClientFallbackFactory implements FallbackFactory<UserClient> {@Overridepublic UserClient create(Throwable throwable) {return new UserClient() {@Overridepublic User findById(Long id) {log.error("查询用户异常", throwable);return new User();}};}}2.在feing-api项目中的DefaultFeignConfiguration类中将UserClientFallbackFactory注册为一个Bean:@Beanpublic UserClientFallbackFactory userClientFallbackFactory(){return new UserClientFallbackFactory();}3.在feing-api项目中的UserClient接口中使用UserClientFallbackFactory:@FeignClient(value = "userservice", fallbackFactory = UserClientFallbackFactory.class)public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);}4.重启后,访问一次订单查询业务,然后查看sentinel控制台,可以看到新的簇点链路:
7.线程隔离的两种方案?
1、信号量隔离
优点:轻量级,无额外开销
缺点:不支持主动超时,不支持异步调用
场景:高频调用,高扇出
2、线程池隔离
优点:支持主动超时,支持异步调用
缺点:线程的额外开销比较大
场景:低扇出
8.熔断器的三种状态?
1)closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态
2)open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态5秒后会进入half-open状态
3)half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。
请求成功:则切换到closed状态
请求失败:则切换到open状态
9.Sentinel支持的熔断规则有哪些?
1.慢调用:业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。
2.异常比例或异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断。
10.授权规则是什么?如何设置授权规则?
一、授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。
1.白名单:来源(origin)在白名单内的调用者允许访问
2.黑名单:来源(origin)在黑名单内的调用者不允许访问
二、配置授权规则
1.从request对象中,获取请求者的origin值并返回。
2.给网关添加请求头
11.自定义异常结果格式?
@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
String msg = "未知异常";
int status = 429;
if (e instanceof FlowException) {
msg = "请求被限流了";
} else if (e instanceof ParamFlowException) {
msg = "请求被热点参数限流";
} else if (e instanceof DegradeException) {
msg = "请求被降级了";
} else if (e instanceof AuthorityException) {
msg = "没有权限访问";
status = 401;
}
response.setContentType("application/json;charset=utf-8");
response.setStatus(status);
response.getWriter().println("{\"msg\": " + msg + ", \"status\": " + status + "}");
}
}
12.Sentinel规则管理模式有哪些?
1、原始模式:Sentinel的默认模式,将规则保存在内存,重启服务会丢失。
2、pull模式:控制台将配置的规则推送到Sentinel客户端,而客户端会将配置规则保存在本地文件或数据库中。以后会定时去本地文件或数据库中查询,更新本地规则。
3、push模式:控制台将配置规则推送到远程配置中心,例如Nacos。Sentinel客户端监听Nacos,获取配置变更的推送消息,完成本地配置更新。
若有收获,就点个赞吧
