乐趣区

关于sentinel:sentinel使用篇

原本最近想要持续写 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…

退出移动版