这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
前言
上一篇我们讲了一些sentinel的基本概念和整和,触发流控后的统一返回处理和sentinel的持久化
首先我们先看看统一结果处理
创建一个配置类实现一下sentinel 提供的 callback 包下的 UrlBlockHandler 注意后面的版本换成了BlockExceptionHandler 只不过是重写的方法不一样。 BlockExceptionHandler重写的是handle方法.
@Slf4j
@Component
public 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 目前支持以下数据源扩展:
我们这里今天就配置一下 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 的改造下一篇我们来修改)
实践是检验真理的唯一准则,感兴趣的可以去试试呀!明天见咯 😃😃😃😃