文章7 | 阅读 3183 | 点赞0
官方解释:很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的黑白名单控制的功能。黑白名单根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
黑白名单规则(AuthorityRule)非常简单,主要有以下配置项:
新建好springcloud项目,添加sentinel依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
修改application.yml文件
server:
port: 8601
spring:
application:
name: cloudalibaba-sentinel-service-8601
cloud:
sentinel:
transport: #dashboard地址
dashboard: localhost:8088
port: 8719 #默认端口,如果被占用则从8719依次+1扫描
添加limitapp限制配置
/**
* 根据httpServletRequest中的参数进行限制黑白名单
* 本文以ip来做限制
*/
public class IpRequestOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest httpServletRequest) {
return httpServletRequest.getRemoteAddr();
}
}
@Configuration
public class SentinelConfig {
@PostConstruct
public void init(){
//将自定义的阈值提示加载到应用中
// WebCallbackManager.setUrlBlockHandler(new DemoUrlBlockHandler());
//黑白名单
WebCallbackManager.setRequestOriginParser(new IpRequestOriginParser());
}
}
配置控制台参数
这里以本地的ip地址为限制资源。访问的时候就会出现被限制的情况。
Sentinel最主要的注解是@SentinelResource,Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException 等。
@SentinelResource 用于定义资源,和controller中的接口一样,用@SentinelResource注解标记的方法,会直接被Sentinel定义为资源,在控制台中可以看到。Sentinel同时提供可选的异常处理和 fallback 配置项。 @SentinelResource 注解包含以下属性:
public class TestService {
// 对应的 `handleException` 函数需要位于 `ExceptionUtil` 类中,并且必须为 static 函数.
@SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})
public void test() {
System.out.println("Test");
}
// 原函数
@SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")
public String hello(long s) {
return String.format("Hello at %d", s);
}
// Fallback 函数,函数签名与原函数一致或加一个 Throwable 类型的参数.
public String helloFallback(long s) {
return String.format("Halooooo %d", s);
}
// Block 异常处理函数,参数最后多一个 BlockException,其余与原函数一致.
public String exceptionHandler(long s, BlockException ex) {
// Do some log here.
ex.printStackTrace();
return "Oops, error occurred at " + s;
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chongbaozhong/article/details/106555142
内容来源于网络,如有侵权,请联系作者删除!