原本最近想要持续写jvm系列的执行引擎这一块,然而最近在钻研sentinel,感觉还是先把它记录下来,所以这一篇就介绍一下sentinel的应用。
知识点
sentinel应用

Sentinel介绍

Sentinel能够做的事件比拟多,大体是限流、降级、零碎爱护、认证四个方面,拉一张官网图

的具体介绍能够参考官网的介绍,https://github.com/alibaba/Se...

应用

这里我结合实际代码进行分享如何应用,在过程中也会顺便分享一下源码的内容。

示例

首先咱们须要在本人的程序中引入sentinel的外围包,即sentinel-core,我这里用的是1.6.0版本的,如下:

首先我定义一个获取用户名的web资源,而后用最根本的SphU.entry进行资源拦挡。

@RequestMapping("user")@RestControllerpublic 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()去取所有的限流规定,而后遍历管制。十分清晰地答复了下面的那个问题。上面咱们定义一个简略的限流规定:

@SpringBootApplicationpublic 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")@RestControllerpublic 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,咱们来注册一下

@Configurationpublic class SentinelConfig {    @Bean public SentinelResourceAspect sentinelResourceAspect() {        return new SentinelResourceAspect(); }}

好了,再间断发postman申请就会发现阻断失效了。

总结

通过下面的介绍,置信大家认真看完应该应用sentinel问题不大了,并且理解了sentinel的一些实现机制,原本是想要在这一篇一起写一下sentinel dashboard的内容,发现篇幅有点长,所以放到下一篇介绍。

参考资料

https://github.com/alibaba/Se...