一、引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
二、在nacos中创建限流配置,Data ID和Group都可以自己随便写,配置格式我使用json
各配置项含义如下:https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,资源名是限流规则的作用对象 | |
count | 限流阈值 | |
grade | 限流阈值类型,QPS 模式(1)或并发线程数模式(0) | QPS 模式 |
limitApp | 流控针对的调用来源 | default ,代表不区分调用来源 |
strategy | 调用关系限流策略:直接、链路、关联 | 根据资源本身(直接) |
controlBehavior | 流控效果(直接拒绝/WarmUp/匀速+排队等待),不支持按调用关系限流 | 直接拒绝 |
clusterMode | 是否集群限流 | 否 |
三、在nacos中创建熔断降级配置,和限流的一样Data ID和Group都可以自己随便写,配置格式使用json
但是配置参数是不一样的,具体含义如下:
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,即规则的作用对象 | |
grade | 熔断策略,支持慢调用比例/异常比例/异常数策略 | 慢调用比例 |
count | 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值 | |
timeWindow | 熔断时长,单位为 s | |
minRequestAmount | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) | 5 |
statIntervalMs | 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) | 1000 ms |
slowRatioThreshold | 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) |
四、在application.yml中配置读取nacos信息,配置详细可以看注释
server:
port: 8083 #服务端口
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #nacos服务地址
sentinel:
transport:
dashboard: 127.0.0.1:8949 #sentinel dashboard地址
datasource:
flowDB: #名称随意取
nacos:
server-addr: 127.0.0.1:8848 #nacos地址
data-id : sentinel #nacos配置中设置的data-id
group-id: DEFAULT_GROUP #nacos配置中设置的group-id
data-type: json #nacos配置中设置的数据类型
rule-type: flow #指定为限流规则
degradeDB:
nacos:
server-addr: 127.0.0.1:8848
data-id: sentinel-degrade
group-id: DEFAULT_GROUP
data-type: json
rule-type: degrade #指定为熔断降级规则
application:
name: stock-server #服务命称
五、全局流控异常返回处理
@Component
public class SentinelConfig implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
Map map = new HashMap();
if(e instanceof FlowException){
map.put("code","900");
map.put("msg","你被流控了!");
}else if(e instanceof DegradeException){
map.put("code","901");
map.put("msg","你被降级了!");
}else{
map.put("code","902");
map.put("msg",e.getMessage());
}
httpServletResponse.setHeader("content-type","application/json;charset=UTF-8");
PrintWriter writer = httpServletResponse.getWriter();
writer.print(map);
writer.flush();
writer.close();
}
}
六、逻辑代码
@RequestMapping("reduce")
public String reduce(){
return "库存减一 "+dateFormat.format(new Date());
}
@RequestMapping("reduce1")
public String reduce1(@RequestParam("orderId")String orderId){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "orderId="+orderId+",库存减一 "+dateFormat.format(new Date());
}
七、访问访问后,可以在sentinel控制台看到我们在nacos中配置的流控、熔断规则已经配置好了,但是存在的一个问题就是,在sentinel控制台修改规则后,nacos不会更新,即下次启动sentinel还是读取nacos中的配置,而不是修改后的。要解决这个问题,就需要修改源码了。