前幾天ali開源了Sentinel項目,Sentinel中文意思是哨兵,做爲dubbo的配套項目,看字面意思是dubbo的一個監控系統,sentinel本身的官方文檔上是這樣說的:Sentinel 以流量爲切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。本文就是想簡單的配置一下sentinel。java
Sentinel的官方文檔是放在 Sentinel官方文檔地址,配合上一篇文章配置的dubbo項目,無需依賴其餘的外部資源。git
在provider端的 pom.xml
文件中加入如下依賴:github
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>0.1.1</version> </dependency>
在sayHello服務的中嵌入Sentinel的代碼:spring
public class SayHelloImpl implements SayHello { @Override public String sayHello(String name) { initFlowRules(); Entry entry = null; try { entry = SphU.entry("HelloWorld"); System.out.println("hello world"); return "Hello " + name; } catch (BlockException e1) { System.out.println("exception is " + BlockException.isBlockException(e1)); System.out.println("block!"); } finally { if (entry != null) { entry.exit(); } } return ""; } private void initFlowRules() { List<FlowRule> rules = new ArrayList<FlowRule>(); FlowRule rule = new FlowRule(); rule.setResource("HelloWorld"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // Set limit QPS to 20. rule.setCount(5); rules.add(rule); FlowRuleManager.loadRules(rules); } }
在上述代碼中,把限流的方式設置爲QPS = 5,而後改造下客戶端的代碼,進行20 次的調用:springboot
public class ConsumerApplication { public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); SayHello sayHello = (SayHello) ctx.getBean("sayHello"); for (int i = 0; i < 20; i++) { String s = sayHello.sayHello("張三"); System.out.println(i + ":" + s); } } }
啓動Provider端和Consumer端後,看到provider的後臺打印的是:app
hello world hello world hello world hello world hello world exception is true block! exception is true block! exception is true block! exception is true block! exception is true block! exception is true block! exception is true block! exception is true block! exception is true block! exception is true block! exception is true block! exception is true block! exception is true block! exception is true block! exception is true block!
只有前五次的調用成功了,其餘的都在報了BlockException。因此在限流的時候,能夠經過在BlockException 中進行限流那些請求的訪問邏輯處理。ide
Sentinel其實有提供一套註解,實現代碼零侵入,接下來把代碼改爲註解形式實現,增長Sentinel的註解依賴包:spa
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-annotation-aspectj</artifactId> <version>0.1.1</version> </dependency>
啓動類改爲springboot啓動,增長註解的啓動配置:code
@SpringBootApplication public class ProviderApplication { public static void main(String[] args) throws IOException { SpringApplication.run(ProviderApplication.class,args); System.in.read(); } @Bean public SentinelResourceAspect sentinelResourceAspect() { return new SentinelResourceAspect(); } @Bean public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setAddress("zookeeper://127.0.0.1:2181"); registryConfig.setClient("provider"); return registryConfig; } }