引入依赖

com.alibaba.cloud

spring-cloud-starter-alibaba-sentinel

手动编写限流规则,缺点是不够灵活,如果需要改变限流规则需要修改源码 @PostConstruct

private void initFlowQpsRule() {

List rules = new ArrayList<>();

FlowRule rule = new FlowRule();

//一定要与 @SentinelResource 里的值一致

rule.setResource("confirmOrder");

//定义限流规则,常见的有QPS和线程数

rule.setGrade(RuleConstant.FLOW_GRADE_QPS);

//最大QPS为20,如果请求超过了20,也只有20个请求会执行成功,如果没有定义降级的方法其余的请求会抛出 FlowException

rule.setCount(20);

rule.setLimitApp("default");

rules.add(rule);

FlowRuleManager.loadRules(rules);

}

//定义一个资源,value值不能少,并指定降级对应的方法

@SentinelResource(value = "confirmOrder",blockHandler = "exceptionHandler")

public void flowMethod(String abc) {

...

}

// blockHandler函数,原方法调用被限流/降级/系统保护的时候调用,编写的时候要注意降级方法内的参数除了BlockException之外要与资源方法参数一致

public void exceptionHandler(String abc,BlockException ex) {

//降级逻辑的编写

}

利用控制台编写限流规则,控制台是额外的Java项目,需要运行起来,优点是不需要修改源码,可以运行时修改限流规则,启动后访问 localhost:18080即可,需要注意的时,控制台一开始并不会显示限流的资源,需要请求一次限流资源才会显示 ,缺点是限流规则没有持久化,服务重启限流规则就消失了 spring:

application:

name: business

cloud:

sentinel:

transport: #启用sentinel控制台

port: 8719 #控制台监听的端口,固定的端口

dashboard: localhost:18080 #控制台项目启动的端口,启动控制台项目可以自己指定

实时监控 流控规则,可以定义修改限流规则 簇点链路 使用Nacos实现限流规则持久化

com.alibaba.csp

sentinel-datasource-nacos

spring:

application:

name: business

cloud:

sentinel:

datasource:

flow: # 这个可以随意取

nacos:

server-addr: #nacos服务的地址

namespace: train

group-id: DEFAULT_GROUP

data-id: sentinel-flow

rule-type: flow #限流

degrade: # 这个可以随意取

nacos:

server-addr: #nacos服务的地址

namespace: train

group-id: DEFAULT_GROUP

data-id: sentinel-degrade

rule-type: degrade #熔断

定义限流规则,里面是一个json数组,所以可以配置多条规则,其实nacos的这个配置相当于没有界面的Sentinel台端,实现的功能是一样的,只不过他定义的规则是持久化的,控制台定义的的规则是推送到我们的项目的,也就是保存在内存当中的,重启就没了,这些参数不知道可以使用控制台的时候 F12去查看对应的名称 Sentinel配置详解

资源名:对哪个方法进行限流针对来源:限流的资源可能被多个服务调用(例如远程调用),用来指定什么服务来调用需要限流,一般都是使用默认流控效果:

快速失败是指触发限流直接失败返回排队等待触发限流后等排队等待,可以设置超时时间,假设阀值是10,一下子来了20个请求,但一秒内只能接受10个请求,剩余的请求可以等待下一秒执行,如果等待的时间超过了设置的时间,还是会失败返回的,注意只有选择QPS才会有排队等待功能,适合会有流量突刺的系统,通过排队等待慢慢处理请求Warm Up 进行预热,可以设置预热时长.假设预热时长是两秒,设置的单机阀值是10,那么一开始的阀值就是 10 / 3 = 3,然后会慢慢增加,在两秒后 阀值才会变成10,预热是为了保护系统,如果系统设置了阀值很大,系统刚启动就来了超过阀值的请求,可能会出现很多问题,所以需要预热让系统的阀值慢慢增加,而不是一下子就达到设定的阀值,适合流量一直很大的系统 流控模式

关联:需要配置一个关联资源,只有当关联资源限流了,当前资源开启限流,例如支付资源关联了下单资源,只有当下单资源触发了限流,支付资源才会开启限流,否则无论多大的请求都不会触发限流链路:需要配置一个入口资源,例如A资源调用了C资源,B资源也调用了C资源,但入口资源是A,所以只有A调用C资源时时才会触发C资源的限流spring:

cloud:

sentinel:

web-context-unify: false #流控模式为链路时必须设置为false

Sentinel的熔断功能,一般是配合远程调用使用 熔断规则 spring:

cloud:

openfeign: #feign.sentinel.enabled改为true后不加会报错

lazy-attributes-resolution: true

feign:

sentinel:

enabled: true #sentinel默认不监控feign,需要sentinel配置 lazy-attributes-resolution: true不然会报错

注意的是feign接口是不能自己使用注解定义资源的,sentinel开启了监控feign会自动定义feign接口的资源,而且名称是固定的

资源名:需要远程调用服务的接口全路径熔断策略

慢调用比例:拿上面的参数举例,只有当1000毫秒内请求数超过6时,并且有 30% 的请求响应时间超过201ms,会进行熔断11秒,也就是说在11秒内都不会再远程调用对应的服务了,并且会抛出 DegradeException ,此时可以做相应的降级处理保证服务的可用性异常比例:拿上面的参数举例,只有当1000毫秒内请求数超过6时,并且有 30% 的请求出现异常,会进行熔断3秒异常数:拿上面的参数举例,只有当1000毫秒内请求数超过6时,并且出现3次异常,会进行熔断3秒

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。