前言
上一篇我们讲了一些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.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
- dependency><dependency>
- <groupId>com.alibaba.cspgroupId>
- <artifactId>sentinel-datasource-nacosartifactId>
- 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 的改造下一篇我们来修改)
实践是检验真理的唯一准则,感兴趣的可以去试试呀!