Sentinel:
是面向分布式服务架构的轻量级流量控制组件。可视化,集中化,动态化管理分布式服务架构下微服务的限流,熔断,降级规则。
限流代码:
pom.xml:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.6.3</version>
</dependency>
//可视化插件
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.6.3</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
配置文件 applicatoin.yml:
spring:
application:
name: orderApi
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8080
微服务系统:
@RestController
@RequestMapping("/orders")
@Slf4j
@SentinelResource("createOrder",blockHandler= "doOnBlock" /*降级方法*/) //需要限流
public class OrderController {
//降级
public OrderInfo doOnBlock(@RequestBody OrderInfo info,@AuthenticationProncipal String username,BlockException exception){
log.info("blocked by " + exception.getClass().getSimpleName());
return info;
}
@PostMapping
public OrderInfo create(@RequestBody OrderInfo info, @AuthenticationPrincipal String username) throws BlockException {
log.info("user is" + username);
Thread.sleep(50);
return info;
}
}
限流声明:
@Component
public class SentinelConfig implements ApplicationListener<ContextRefreshedEvent> {
//声明规则
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
FlowRule rule = new FlowRule();
rule.setResource("createOrder");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); //每秒请求的数量
rule.setCount(10); //每秒只允许1个请求
ArrayList<FlowRule> rules = new ArrayList<FlowRule>();
rules.add(rule);
FlowRuleManager.loadRules(rules); //加入Manager
//熔断降级
DegradeRule degradeRule = new DegradeRule(); //降级规则
degradeRule.setResource("createOrder"); //只针对createOrder起作用
degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_RT); //降级策略
degradeRule.setCount(10); //阈值:响应时间超过10ms就记一次超时数
degradeRule.setTimeWindow(10); //10s内熔断打开,之后进入半打开
degradeRule.setLimitApp("app"); //限流只针对某个app
List<DegradeRule> degradeRules = new ArrayList<DegradeRule>();
degradeRules.add(degradeRule);
DegradeRuleManager.loadRules(degradeRules);
}
}
熔断器原理:
热点和系统规则:
同一个资源,针对不同的参数,设置不同的流量规则。
sentinel持久化:
利用zookeeper,applo,Nacos配置中心实现。以zookeeper为例:
1.下载zookeeper
zookeeper.apache.org/releases.html --> download -> stable
2.运行zookeeper
./zkServer.sh start
3.下载sentinel源码,切换到1.6对应版本分支,导入sentinel-dashboard文件到项目
4.去掉pom.xml中for Zookeeper rule publisher sample的<scope>test</scope>
5.把test/java中的zookeeper包中的文件拷贝到src/main/java/dashboard/rule/zookeeper下
6.把controller/v2中的@Qualifier("flowRuleDefaultPublisher") 替换为 @Qualifier("flowRuleZookeeperProvider")
7.修改配置文件启动端口:server.port = 8082
8.修改前端页面sidebar.html中的dashboard.flowV1去掉V1
pom.xml:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-zookeeper</artifactId>
<version>1.5.2</version>
</dependency>
application.tml:
sentinel:
zookeeper:
address: 127.0.0.1:2181
path: /sentinel_rule_config
SentinelConfig:
@Component
public class SentinelConfig{
@Value("${sentinel.zookerper.address}")
private String zkServer;
@Value("${sentinel.zookerper.path}")
private String zkPath;
@Value("${sentinel.application.name}")
private String appName;
@PostConstruct //类加载出来就去读取规则
public void loadRules(){
//规则zookeeper数据读取存入数据源
ReadableDataSource<String,List<FlowRole>> flowRuleDataSource = new ZookeeperDataSource<>(zkServer,zkPath+"/"+appName,source -> JSON.parseArray(source,FlowRule.class));
//从数据源拿到相应的properties
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
}
}