原本最近想要持续写 jvm 系列的执行引擎这一块,然而最近在钻研 sentinel,感觉还是先把它记录下来,所以这一篇就介绍一下 sentinel 的应用。
知识点
sentinel 应用
Sentinel 介绍
Sentinel 能够做的事件比拟多,大体是限流、降级、零碎爱护、认证四个方面,拉一张官网图
的具体介绍能够参考官网的介绍,https://github.com/alibaba/Se…
应用
这里我结合实际代码进行分享如何应用,在过程中也会顺便分享一下源码的内容。
示例
首先咱们须要在本人的程序中引入 sentinel 的外围包,即 sentinel-core,我这里用的是 1.6.0 版本的,如下:
首先我定义一个获取用户名的 web 资源,而后用最根本的 SphU.entry 进行资源拦挡。
@RequestMapping("user")
@RestController
public class UserController {@PostMapping("/getName")
public String getName(){try (Entry entry = SphU.entry("getName")){return "don";}
catch (BlockException ex){return block(ex);
}
}
public String block(BlockException ex){return "block";}
}
如果只是这样,sentinel 是不会做任何拦挡操作的,因为此时咱们还没有定义规定,entry 函数跟进去咱们会看到如下函数
这里就是 sentienl 应用了责任链模式对各个规定进行拦挡判断的逻辑。
咱们能够看到有这些实现,每个都是一个插槽,能够了解为 sentinel 是一个主板,各个规定是主板上的插件,比方限流规定是 cpu、零碎爱护规定是显卡等。这里拿限流性能来介绍,咱们看一下 FlowSlot
从下面图中能够看到会通过 FlowRuleManager.getFlowRuleMap()去取所有的限流规定,而后遍历管制。十分清晰地答复了下面的那个问题。上面咱们定义一个简略的限流规定:
@SpringBootApplication
public class SentineldemoApplication {public static void main(String[] args) {initSentinelRules();
SpringApplication.run(SentineldemoApplication.class, args);
}
private static void initSentinelRules(){List<FlowRule> flowRules = new ArrayList<>(1);
FlowRule flowRule = new FlowRule();
flowRule.setResource("getName");
flowRule.setCount(2);
flowRules.add(flowRule);
FlowRuleManager.loadRules(flowRules);
}
}
我这里的例子是在 springboot 启动前定义好规定,大家也能够应用 sentinel 的 spi 扩大,实现 InitFunc 来加载。
而后用 postman 间断发动几次申请,看一下后果:
正如预期的一样返回了 block。
注解应用
下面介绍了个别的应用形式,还有一种更简略的应用形式,注解应用。
sentinel 提供了注解 SentinelResource 来让咱们更不便的应用拦挡性能,先上代码
@RequestMapping("user")
@RestController
public class UserController {@SentinelResource(value = "getName", blockHandler = "block")
@PostMapping("/getName")
public String getName(){return "don";}
public String block(BlockException ex){return "block";}
}
和下面形式比,这里只加了一个注解,定义了资源名称(不定义的话默认取包名 + 类名: 办法名称)以及阻断解决。
如果只到这一步,咱们用下面的 postman 间断发申请会发现并没有呈现阻断。这里通过源码再给大家剖析下起因。
SentinelResource 注解尽管在 core 包里,然而 SentinelResourceAspect 却在 sentinel-annotation-aspectj 包里
通过下面代码能够看出 SentinelResource 这个注解自身是通过 AOP 的形式实现的拦挡,最终也是调的 SphU.entry 进行规定拦挡。因为在 sentinel-annotation-aspectj 包里定义的注解拦挡,所以咱们要用注解的话必须要引入 sentinel-annotation-aspectj 包
引完之后,咱们持续下面的 postman 申请,会发现还是没有拦挡。怎么回事?起因是 SentinelResourceAspect 只是定义了一个切面类,然而还没有成为 spring bean,咱们来注册一下
@Configuration
public class SentinelConfig {
@Bean
public SentinelResourceAspect sentinelResourceAspect() {return new SentinelResourceAspect();
}
}
好了,再间断发 postman 申请就会发现阻断失效了。
总结
通过下面的介绍,置信大家认真看完应该应用 sentinel 问题不大了,并且理解了 sentinel 的一些实现机制,原本是想要在这一篇一起写一下 sentinel dashboard 的内容,发现篇幅有点长,所以放到下一篇介绍。
参考资料
https://github.com/alibaba/Se…