前言
上一篇我们讲了一些sentinel的基本概念和整和,触发流控后的统一返回处理和sentinel的持久化
首先我们先看看统一结果处理
创建一个配置类实现一下sentinel 提供的 callback 包下的 UrlBlockHandler
注意后面的版本换成了BlockExceptionHandler
只不过是重写的方法不一样。BlockExceptionHandler重写的是handle方法.
@Slf4j@Componentpublic class BugVipBlockExceptionHandler implements UrlBlockHandler { @Override
public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException ex) throws IOException {
log.info("sentinel handler:"+ex.getRule().toString()); String msg = null; if (ex instanceof FlowException) {
msg = "资源被限流了";
} else if (ex instanceof DegradeException) {
msg = "资源降级了";
} else if (ex instanceof ParamFlowException) {
msg = "热点参数限流";
} else if (ex instanceof SystemBlockException) {
msg = "系统规则(负载/...不满足要求)";
} else if (ex instanceof AuthorityException) {
msg = "授权规则不通过";
} // http状态码
httpServletResponse.setStatus(500);
httpServletResponse.setCharacterEncoding("utf-8");
httpServletResponse.setHeader("Content-Type", "application/json;charset=utf-8");
httpServletResponse.setContentType("application/json;charset=utf-8"); // spring mvc自带的json操作工具,叫jackson
new ObjectMapper().writeValue( httpServletResponse.getWriter(), R.error().message(msg));
}
}复制代码
这里的 FlowException 类型怎么查看呢
可以看到它的子类就是这五个类型
下面我们使用一下看看我们的统一配置有没有生效
当然你也可以使用 @SentinelResource
注解进行指定处理方法(这个优先统一配置)
下面我们持久化一下sentinel
DataSource
扩展常见的实现方式有:
-
拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;
-
推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。
Sentinel 目前支持以下数据源扩展:
-
Pull-based: 动态文件数据源、Consul, Eureka
-
Push-based: ZooKeeper, Redis, Nacos, Apollo, etcd
我们这里今天就配置一下 nacos 首先引入一下maven(这里要注意下版本冲突 踩了一下午的坑~~~~😇😇😇😇)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<!-- 这里的版本 2.2.3.RELEASE--></dependency><dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!-- 这里的版本是1.8.0 --></dependency>复制代码
配置一下yml文件
spring:
cloud:
sentinel:
enabled: true
eager: true #饿汉模式会直接链接
transport:
clientIp: 192.168.1.9 # 代码所在iP
dashboard: 192.168.1.7:8858 # 这是控制面板的地址
port: 9091
datasource:
ds: #这个值可以自定义
nacos:
server-addr: 192.168.1.7:8848
namespace: 120694d7-9815-4d3d-8150-d9c8bac82c11 # 这里是nacos 的命名空间
group-id: dev # 分组ID
data-id: ${spring.application.name}-flow-rules
data-type: json
rule-type: flow
复制代码
这样配置完成之后 我们的项目启动后回去nacos 先去加载配置的流控规则 去push到 sentinel dashboard中去 下面我们可以试试是否生效。
可以看到nacos中的流控规则被加载到了。(dashboard 的改造下一篇我们来修改)
实践是检验真理的唯一准则,感兴趣的可以去试试呀!