Spring Cloud(七)不使用starter的情況下使用Alibaba Sentinel
阿新 • • 發佈:2020-12-18
我們在使用Alibaba Sentinel時一般都是在pom檔案中引入spring-cloud-starter-alibaba-sentinel,這個工程會帶來非常多的jar包,這裡面有些是和視覺化監控有關的,有些是和webflux有關的,等等。如果我們並不需要視覺化監控,不涉及到webflux,那麼這個starter雖然給我們帶來方便,但同時也使得無用的依賴jar包數量增加不少。如何讓jar包儘可能少?本文嘗試通過只新增兩個和sentinel有關的包來實現一個流控規則。
1、配置pom.xml檔案
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.github.ralgond</groupId> <artifactId>sentinel-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.8.0</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-annotation-aspectj</artifactId> <version>1.8.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2、編寫主類
package com.github.ralgond.sentineldemo.e1; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicLong; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.alibaba.csp.sentinel.slots.block.RuleConstant; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; @SpringBootApplication @RestController public class FlowController { public AtomicLong pass = new AtomicLong(0); public AtomicLong block = new AtomicLong(0); @SentinelResource(value="get", blockHandler="blockHandler") @RequestMapping(method=RequestMethod.GET, value="/get") public String get() { pass.incrementAndGet(); return "success"; } public String blockHandler(BlockException ex) { block.incrementAndGet(); return "failed"; } @RequestMapping(method=RequestMethod.GET, value="/metric") public String metric() { return ""+pass.get()+"|"+block.get(); } public static void main(String args[]) { initFlowRules(); SpringApplication.run(FlowController.class, args); } private static void initFlowRules() { List<FlowRule> rules = new ArrayList<>(); FlowRule rule = new FlowRule(); rule.setResource("get"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setCount(1); rules.add(rule); FlowRuleManager.loadRules(rules); } }
3、配置和@SentinelResource有關的AOP類
@Configuration
public class SentinelE1Configuration {
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
}
4、執行
啟動主類,在瀏覽器輸入http://localhost:8080/get,快速點選,你會發現時而出現success,大部分時間出現failed,再在瀏覽器輸入http://localhost:8080/metric可以看到通過數和block數。