sentinel使用篇

爱炒股的程序猿

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

Sentinel介绍

Sentinel可以做的事情比较多,大体是限流、降级、系统保护、认证四个方面,拉一张官方图
image.png
的详细介绍可以参考官方的介绍,https://github.com/alibaba/Se...

使用

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

示例

首先我们需要在自己的程序中引入sentinel的核心包,即sentinel-core,我这里用的是1.6.0版本的,如下:
image.png
首先我定义一个获取用户名的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函数跟进去我们会看到如下函数
image.png
这里就是sentienl使用了责任链模式对各个规则进行拦截判断的逻辑。
image.png
我们可以看到有这些实现,每个都是一个插槽,可以理解为sentinel是一个主板,各个规则是主板上的插件,比如限流规则是cpu、系统保护规则是显卡等。这里拿限流功能来介绍,我们看一下FlowSlot
image.png
从上面图中可以看到会通过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连续发起几次请求,看一下结果:
image.png
正如预期的一样返回了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连续发请求会发现并没有出现阻断。这里通过源码再给大家分析下原因。
image.png
SentinelResource注解虽然在core包里,但是SentinelResourceAspect却在sentinel-annotation-aspectj包里
image.png
通过上面代码可以看出SentinelResource这个注解本身是通过AOP的方式实现的拦截,最终也是调的SphU.entry进行规则拦截。因为在sentinel-annotation-aspectj包里定义的注解拦截,所以我们要用注解的话必须要引入sentinel-annotation-aspectj包
image.png
引完之后,我们继续上面的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...

阅读 1.8k

每天进步一点点

39 声望
3 粉丝
0 条评论

每天进步一点点

39 声望
3 粉丝
文章目录
宣传栏