授权规则是对调用方的来源来做控制,有白名单和黑名单两种方式
白名单:来源 在白名单的调用者允许访问
黑名单:来源在黑名单的调用者不允许访问
利用网关的过滤器添加名为gateway的请求头
default-filters:
- AddRequestHeader=origin,gateway;
添加判断条件
@Component
public class HeaderOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest httpServletRequest) {
String origin = httpServletRequest.getHeader("origin");
if (StringUtils.isEmpty(origin)){
origin="blank";
}
return origin;
}
}
给/order/{orderId}添加授权规则
自定义异常结果
默认情况下,发生限流、拦截、授权拦截时,都会抛出异常到调用方。如果要自定义异常返回结果,需要实现BlockExceptionHandler接口
@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
String msg = "未知异常";
int status = 429;
if (e instanceof FlowException) {
msg = "请求被限流了";
} else if (e instanceof ParamFlowException) {
msg = "请求被热点参数限流";
} else if (e instanceof DegradeException) {
msg = "请求被降级了";
} else if (e instanceof AuthorityException) {
msg = "没有权限访问";
status = 401;
}
response.setContentType("application/json;charset=utf-8");
response.setStatus(status);
response.getWriter().println("{\"msg\": " + msg + ", \"status\": " + status + "}");
}
}
原始模式:将规则保存在内存中,重启服务会丢失
pull模式:控制台将配置规则推送到Sentinel客户端,而客户端会将配置规则保存到本地文件或数据库中,以后会定时去本地文件或数据库中查询,更新本地规则
push模式:控制台将配置规则推送到远程配置中心,例如Nacos。Sentinel客户端监听、Nacos,获取配置变更的推送消息,完成本地配置更新
修改OrderService,让其监听Nacos中的sentinel规则配置。
具体步骤如下:
在order-service中引入sentinel监听nacos的依赖:
com.alibaba.csp
sentinel-datasource-nacos
在order-service中的application.yml文件配置nacos地址及监听的配置信息:
spring:
cloud:
sentinel:
datasource:
flow: #限流规则
nacos:
server-addr: localhost:8848 # nacos地址
dataId: orderservice-flow-rules
groupId: SENTINEL_GROUP
rule-type: flow # 还可以是:degrade、authority、param-flow
SentinelDashboard默认不支持nacos的持久化,需要修改源码。
然后并用IDEA打开这个项目,结构如下:
在sentinel-dashboard源码的pom文件中,nacos的依赖默认的scope是test,只能在测试时使用,这里要去除:
将sentinel-datasource-nacos依赖的scope去掉:
<dependency>
<groupId>com.alibaba.cspgroupId>
<artifactId>sentinel-datasource-nacosartifactId>
dependency>
在sentinel-dashboard的test包下,已经编写了对nacos的支持,我们需要将其拷贝到main下。
然后,还需要修改测试代码中的NacosConfig类:
修改其中的nacos地址,让其读取application.properties中的配置:
在sentinel-dashboard的application.properties中添加nacos地址配置:
nacos.addr=localhost:8848
另外,还需要修改com.alibaba.csp.sentinel.dashboard.controller.v2包下的FlowControllerV2类:
让我们添加的Nacos数据源生效:
接下来,还要修改前端页面,添加一个支持nacos的菜单。
修改src/main/webapp/resources/app/scripts/directives/sidebar/目录下的sidebar.html文件:
将其中的这部分注释打开:
修改其中的文本:
运行IDEA中的maven插件,编译和打包修改好的Sentinel-Dashboard:
启动方式跟官方一样:
java -jar sentinel-dashboard.jar
如果要修改nacos地址,需要添加参数:
java -jar -Dnacos.addr=localhost:8848 sentinel-dashboard.jar