公网 demo 接入体验
开通阿里云 AHAS https://www.aliyun.com/product/ahas?spm=5176.19720258.J_8058803260.410.474b2c4a3AUYtx
Sentinel控制台搭建与应用接入
新建一个测试项目
引入依赖:
<!--Sentinel 核心依赖--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.8.0</version> </dependency>
定义限流规则(硬编码方式设置限流规则):
@Configuration public class FLowRulesConfig { /** * 定义限流规则 */ @PostConstruct public void initFLowRules() { //1.创建限流规则 List<FlowRule> rules = new ArrayList<>(); FlowRule rule = new FlowRule(); // 定义资源,表示Sentinel会对哪个资源生效 rule.setResource("hello"); // 定义限流规则类型,QPS限流类型 rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 定义QPS每秒能通过的请求个数 rule.setCount(2); rules.add(rule); // 2、加载限流规则 FlowRuleManager.loadRules(rules); } }
编写Controller 测试
@RestController @RequestMapping(value = "/test") public class TestController { @GetMapping(value = "/hello") public String hello() { // 进行限流 try (Entry entry = SphU.entry("hello")) { // 加载限流规则,若果存在才会往下执行 // 被保护的资源 return "hello Sentinel"; } catch (BlockException e) { e.printStackTrace(); // 被限流或者被降级的操作 return "系统繁忙"; } } }
Sentinel 控制台的搭建
1、下载 官方提供的 Sentinel Jar包 :https://gitee.com/rmlb/Sentinel ,或者 https://github.com/alibaba/Sentinel
2、启动控制台
执行:
java -Dserver.port=9000 -jar sentinel-dashboard-1.8.0.jar
指定启动端口号 为 9000
登录: 账号密码均为 sentinel
本地应用接入到 本地的 Sentinel 控制台
1、本地应用引入依赖:
<!--Sentinel 控制台接入的依赖--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.8.0</version> </dependency>
2、启动时加入JVM参数: -Dcsp.sentinel.dashboard.server=localhost:9000 -Dproject.name=Sentinel-Demo
参数解释:
-Dcsp.sentinel.dashboard.server=consoleIp:port |
指定控制台地址和端口 |
-Dproject.name=Sentinel-Demo |
设置本地应用在Sentinel控制台中的名称 |
控制台定义限流规则
1、以上的 TestController 中保持不变,将 FLowRulesConfig 中定义的限流格则清除
2、通过控制台设置限流规则
Sentinel 中定义资源的方式
Sentinel 除了基本的定义资源方式外,还有其他定义资源的方式:
1、抛出异常的方式定义资源
2、返回 Boolean 的方式定义资源
3、异步调用支持
4、注解方式定义资源
5、主流框架的默认适配
1、抛出异常的方式定义资源:
Sentinel 中的 SphO 包含了 try - catch 风格的 API 。这种方式,当资源发生限流之后抛出 BlockException,这个时候可以捕获异常。进行限流之后的逻辑处理,如下
// 进行限流 try (Entry entry = SphU.entry("hello")) { // 加载限流规则,若果存在才会往下执行 // 被保护的资源 return "hello Sentinel"; } catch (BlockException e) { e.printStackTrace(); // 被限流或者被降级的操作 return "系统繁忙"; }
2、返回 Boolean 类型定义资源:
Sentinel 中的 SphO 提供了 if - else 风格的 API,用这种方式,当资源发生限流之后返回 false,这时可以根据返回值进行限流之后的逻辑处理
控制台中添加资源 Sentinel_Boolean 限流规则,然后进行测试
@GetMapping(value = "/booleanHello") public String booleanHello() { // 1、进行限流控制 if (SphO.entry("Sentinel_Boolean")) { try { return "Sentinel_Boolean,成功访问"; } finally { // 限流出口 SphO.exit(); } } else { return "Sentinel_Boolean,系统繁忙,请稍后"; } }
注意: SphO.entry(xxx) 需要与SphO.exit() 承兑出现,否则会调至调用练记录异常,抛出 ErrorEntryException 异常
3、异步调用支持
Sentinel 支持异步调用链路的统计,在异步调用中,需要通过 SphU.asyncEntry(xxx) 方式定义资源,并需要在有异步的回调函数中 调用 exit() 方法
主启动类需要开启 起步调用的支持 @EnableAsync
创建AsyncService编写异步调用的方法
@Service public class AsyncService { // Async表示方法为异步调用 @Async public void hello() { System.out.println("异步调用开始======"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("异步调用结束====="); } }
编写Controller, Sentinel 控制台新增 资源 Sentinel_Async 限流规则 ,进行测试
@GetMapping(value = "/asyncHello") public String asyncHello(){ //1.进行限流控制 AsyncEntry asyncEntry = null; try { asyncEntry = SphU.asyncEntry("Sentinel_Async"); // 限流入口 asyncService.hello(); // 异步调用方法 return "Sentinel_Async,调用成功"; } catch (BlockException e) { e.printStackTrace(); return "Sentinel_Async,繁忙,请稍后"; } finally { if (asyncEntry != null){ asyncEntry.exit(); //限流出口 } } }
4、注解方式定义资源:
Sentinel支持通过@SentinelResource定义资源并配置blockHandler函数来进行限流之后的处理。
因为 Sentinel 中使用 AspectJ 的扩展用于自动定义资源,处理 BlockExeption 所以项目中需要引入 依赖 sentinel-annotation-aspectj
<!--Sentinel 注解定义资源的支持--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-annotation-aspectj</artifactId> <version>1.8.0</version> </dependency>
配置 AspectJ
@Configuration public class SentinelAspectConfig { @Bean public SentinelResourceAspect resourceAspect() { return new SentinelResourceAspect(); } }
Controller
/** * value = "Sentinel_Annotation" 定义的资源名为:Sentinel_Annotation * blockHandler = "exceptionHandler",当抛出 BlockException 异常时调用哪个处理方法 * * @return */ @SentinelResource(value = "Sentinel_Annotation", blockHandler = "exceptionHandler") @GetMapping(value = "/annotationHello") public String annotationHello() { // 使用限流规则 return "Sentinel_Annotation,访问成功"; }
.
/** * 定义降级 / 限流 的处理函数 * * @param exception * @return */ public String exceptionHandler(BlockException exception) { exception.printStackTrace(); return "Sentinel_Annotation,访问失败"; }
5、主流框架的默认适配
为了减少开发的复杂度,我们大部分的主流框架,如 Web 、ServeLet、Dubbo、SpringCloud、gRPC、Spring WebFlux、Reactor 等都做了适配,只需要引入相对应的依赖即可方便的整合 Sentinel,可以通过引入 Spring Cloud Alibaba Sentinel 来方便的整合 Sentinel
>>>>>>>>>>> 接下一篇学习: https://www.cnblogs.com/Alay/p/15488116.html <<<<<<<<<<<