摘要:是一个灵活的系统负载控制框架,通过控制接口和方法的调用来保证系统负载不会过大,维持正常响应速度。创建一个项目首先创建一个空的项目,加上的依赖。编写控制规则将控制规则包装为类。超过这个阈值则会拒绝调用该方法。
Alibaba Sentinel 是一个灵活的系统负载控制框架,通过控制接口和方法的调用来保证系统负载不会过大,维持正常响应速度。
该项目的地址是 https://github.com/alibaba/Se... 。但是阿里的文档一贯看起来一头雾水,所以本文介绍如何用一个最简单的项目来上手。如果你熟悉 Spring Boot,那么几分钟就可以搞定。
1、创建一个 Maven 项目首先创建一个空的 Maven 项目,加上 Spring Boot 的依赖。pom.xml 看起来是下面的样子,你可以直接拿来用:
4.0.0 com.demo sentinel-test 1.0-SNAPSHOT 1.8 1.8 UTF-8 org.springframework.boot spring-boot-dependencies 2.1.3.RELEASE pom import
这里没有将 Spring Boot 作为 parent 项目,而是使用
在 pom.xml 中,首先添加 Spring Boot 依赖:
org.springframework.boot spring-boot-starter
然后添加 Sentinel。在这个例子当中,我们将用 注解 来实现负载控制,所以添加 sentinel-annotation-aspectj 依赖:
com.alibaba.csp sentinel-annotation-aspectj 1.5.1
添加了这两个依赖就 OK 了。
3、启动类Spring Boot 项目需要一个 main() 方法来启动,我们命名这个类为 com.demo.SentinelTestApplication,其内容如下:
@SpringBootApplication public class SentinelTestApplication { public static void main(String[] args) throws Exception { SpringApplication.run(SentinelTestApplication.class, args); } }
目前这个类还没有具体的内容,但我们应该先运行一下,确保前面做的事情没有出错,然后再添加内容。
4、需要进行访问控制的服务 DemoService我们在 com.demo 包下创建一个名为 DemoService 的类,这个类包含一个需要做访问控制的 call() 方法:
@Service public class DemoService { private int counter; @SentinelResource(value = "DemoService.call", blockHandler = "callBlocked") public void call() { System.out.println("Hello (" + ++counter + ")"); } public void callBlocked(BlockException ex) { System.err.println("Blocked (" + ++counter + ") : " + ex.toString()); } }
所谓访问控制就是当某个方法调用过于频繁时,拒绝掉一部分调用。什么才叫过于频繁,我们可以通过自定义控制规则的方式来告诉 Sentinel。定义控制规则的部分放在后面介绍,我们现在先关注业务本身,也就是 DemoService 类。
这个类包含两个方法,其中 call() 方法是主角,正常的业务会调用这个方法;而 callBlocked() 则会在 call() 方法被拒绝掉时调用。
call() 方法上面的 @SentinelResource 注解标明了该方法是需要进行访问控制的。Sentinel 将需要进行访问控制的方法都称作资源。这个注解有两个属性,value 属性表示该资源的名称,我们通过名称为不同的资源制定不同的控制规则。blockHandler 属性表示方法被拒绝时应该调用哪个替代方法,这个替代方法必须在同一个类当中,且参数列表要在原方法参数列表的基础上再添加一个 BlockException 类型的参数。
5、编写控制规则Sentinel 将控制规则包装为 com.alibaba.csp.sentinel.slots.block.flow.FlowRule 类。它包含下面几个属性:
resource : 该规则针对哪个资源;
grade : 从哪个方面进行度量,如该方法的每秒调用次数,或同时调用该方法的线程数等等。
count : 度量阈值。超过这个阈值则会拒绝调用该方法。
strategy : 多个规则之间的搭配策略,具体参考这里。
下面我们在 SentinelTestApplication 类里面添加一个创建规则的方法,同时在 main() 方法里面初始化它:
private static void initRules() throws Exception { FlowRule rule1 = new FlowRule(); rule1.setResource("DemoService.call"); rule1.setGrade(RuleConstant.FLOW_GRADE_QPS); rule1.setCount(5); // 每秒调用最大次数为 5 次 Listrules = new ArrayList<>(); rules.add(rule1); // 将控制规则载入到 Sentinel com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager.loadRules(rules); } public static void main(String[] args) throws Exception { initRules(); // Sentinel 载入规则不一定非要在 Spring 初始化之前,在这之后也可以。 SpringApplication.run(SentinelTestApplication.class, args); }
这样 Sentinel 的规则就设置完毕。
6、启用 Sentinel 注解的 AOP 拦截Spring 提供 AOP 机制来实现方法调用的拦截,这是 Sentinel 实现控制规则的原理。Sentinel 提供 com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect 类,我们要在 Spring 容器中加入这个 bean 才能让 @SentinelResource 注解起作用。我们需要在 SentinelTestApplication 类里面添加下面的代码:
@Bean public SentinelResourceAspect sentinelResourceAspect() { return new SentinelResourceAspect(); }
当然,在实际项目里面这一步可以放到自动配置当中。
7、测试控制规则最后我们写一个方法来测试控制规则是否起作用,同样是在 SentinelTestApplication 类里面:
@Autowired private DemoService demoService; @PostConstruct public void run() { for (int i = 0; i < 10; i++) { demoService.call(); } }
实际运行 main() 方法时,你将会看到这样的输出:
Hello (1) Hello (2) Hello (3) Hello (4) Hello (5) Blocked (6) : com.alibaba.csp.sentinel.slots.block.flow.FlowException Blocked (7) : com.alibaba.csp.sentinel.slots.block.flow.FlowException Blocked (8) : com.alibaba.csp.sentinel.slots.block.flow.FlowException Blocked (9) : com.alibaba.csp.sentinel.slots.block.flow.FlowException Blocked (10) : com.alibaba.csp.sentinel.slots.block.flow.FlowException
通过这个例子,你应该大概了解 Sentinel 运作的机制了。在这个基础上,Sentinel 还能实现控制规则的实时修改、远程配置、状态监控等等,它是个非常强大的框架。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77527.html
摘要:介绍随着微服务的流行,服务和服务之间的稳定性变得越来越重要。以流量为切入点,从流量控制熔断降级系统负载保护等多个维度保护服务的稳定性。完备的实时监控同时提供实时的监控功能。您只需要引入相应的依赖并进行简单的配置即可快速地接入。 Sentinel 介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度...
摘要:但是比较可惜的是已经宣布对停止更新。客户端整合每个微服务客户端都需要整合的客户端封装与配置,才能将监控信息上报给展示以及实时的更改限流或熔断规则等。下面我们就分两部分来看看,如何使用来实现接口限流。 最近管点闲事浪费了不少时间,感谢网友libinwalan的留言提醒。及时纠正路线,继续跟大家一起学习Spring Cloud Alibaba。 Nacos作为注册中心和配置中心的基础教程,...
摘要:要使用注解来保护资源需要引入下面的依赖引入之后我们需要配置切面让其生效,因为是通过切面来实现的,我这边以中使用进行配置示列然后在需要限制的方法上加注解即可错误发生在表示资源名,必填项处理的方法名,可选项。 在前面我们对Sentinel做了一个详细的介绍,可以手动的通过Sentinel提供的SphU类来保护资源。这种做法不好的地方在于每个需要限制的地方都得写代码,从 0.1.1 版本开始...
摘要:所以,在整合了做规则存储之后,需要知道在下面两个地方修改存在不同的效果控制台中修改规则仅存在于服务的内存中,不会修改中的配置值,重启后恢复原来的值。控制台中修改规则服务的内存中规则会更新,中持久化规则也会更新,重启后依然保持。 通过上一篇《使用Sentinel实现接口限流》的介绍,相信大家对Sentinel已经有了初步的认识。在Spring Cloud Alibaba的整合封装之下,接...
摘要:在之前的练习中,只要应用重启,就需要重新配置,这样在我们实际的项目是非常不实用的,那么有没有办法把我们配置的规则保存下来呢答案是,那么接下来,给大家来介绍如何将规则持久化。重新启动测试效果添加流控规则查看同步的配置 在之前的练习中,只要应用重启,就需要重新配置,这样在我们实际的项目是非常不实用的,那么有没有办法把我们配置的规则保存下来呢?答案是YES,那么接下来,给大家来介绍如何将Se...
阅读 3017·2021-10-27 14:16
阅读 2854·2021-09-24 10:33
阅读 2237·2021-09-23 11:21
阅读 3209·2021-09-22 15:14
阅读 747·2019-08-30 15:55
阅读 1644·2019-08-30 15:53
阅读 1694·2019-08-29 11:14
阅读 2174·2019-08-28 18:11