一、sentinel控制台安装
1.下载控制台jar包: wget https://github.com/alibaba/Sentinel/releases/download/1.8.3/sentinel-dashboard-1.8.3.jar
2.启动sentinel控制台Dashboard
注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
启动命令:nohup java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.3.jar 2>&1 &
3.访问sentinel dashboard
浏览器访问:http://192.168.0.124:8080/#/login
默认用户密码为:sentinel
image.png
二、客户端接入控制台
1.springboot项目pom.xml文件中加入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
<!--springcloud gateway添加次依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
<version>1.8.1</version>
</dependency>
<!--dubbo服务添加次依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-apache-dubbo-adapter</artifactId>
<version>1.8.1</version>
</dependency>
2.application.yml配置文件中添加sentinel配置
spring:
cloud:
sentinel:
transport:
dashboard: 192.168.0.124:8080
3.查看控制台
image.png
三.规则设置
sentinel规则配置方式有两种:
1.通过 API 直接修改 (loadRules)
FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控规则
DegradeRuleManager.loadRules(List<DegradeRule> rules); // 修改降级规则
手动修改规则(硬编码方式)一般仅用于测试和演示,生产上一般通过动态规则源的方式来动态管理规则。
2.通过 DataSource 适配不同数据源修改
根据官方说明:
上述 loadRules() 方法只接受内存态的规则对象,但更多时候规则存储在文件、数据库或者配置中心当中。DataSource 接口给我们提供了对接任意配置源的能力。相比直接通过 API 修改规则,实现 DataSource 接口是更加可靠的做法。
我们推荐通过控制台设置规则后将规则推送到统一的规则中心,客户端实现 ReadableDataSource 接口端监听规则中心实时获取变更,流程如下:
image.png
DataSource
扩展常见的实现方式有:
- 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;
- 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。
Sentinel 目前支持以下数据源扩展:
生产环境需使用push模式
pom添加依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-zookeeper</artifactId>
</dependency>
客户端添加配置
@Configuration
public class ZookeeperSentinelConfiguration {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Value("${spring.application.name:wcyq-payment-manager-web}")
private String appName;
@Value("${spring.cloud.zookeeper.connect-string}")
private String connectString;
private final String RULE_ROOT_PATH = "/sentinel_rule_config";
/**
* 加载sentinel规则
*/
@PostConstruct
public void loadRules() {
logger.info("加载sentinel流控规则数据加载");
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new ZookeeperDataSource<>(connectString,
RULE_ROOT_PATH + "/" +appName + "/flow", rules -> JSON.parseObject(rules, new TypeReference<List<FlowRule>>(){}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
logger.info("加载sentinel降级规则数据加载");
ReadableDataSource<String, List<DegradeRule>> deGradeRuleDataSource = new ZookeeperDataSource<>(connectString,
RULE_ROOT_PATH + "/" + appName + "/degrade", rules -> JSON.parseObject(rules, new TypeReference<List<DegradeRule>>(){}));
DegradeRuleManager.register2Property(deGradeRuleDataSource.getProperty());
logger.info("加载sentinel访问控制规则数据加载");
ReadableDataSource<String, List<AuthorityRule>> authorityRuleDataSource = new ZookeeperDataSource<>(connectString,
RULE_ROOT_PATH + "/" + appName + "/authority", rules -> JSON.parseObject(rules, new TypeReference<List<AuthorityRule>>(){}));
AuthorityRuleManager.register2Property(authorityRuleDataSource.getProperty());
logger.info("加载sentinel热点参数限流规则数据加载");
ReadableDataSource<String, List<ParamFlowRule>> paramFlowRuleDataSource = new ZookeeperDataSource<>(connectString,
RULE_ROOT_PATH + "/" + appName + "/param", rules -> JSON.parseObject(rules, new TypeReference<List<ParamFlowRule>>(){}));
ParamFlowRuleManager.register2Property(paramFlowRuleDataSource.getProperty());
logger.info("加载sentinel系统保护限流规则数据加载");
ReadableDataSource<String, List<SystemRule>> systemRuleDataSource = new ZookeeperDataSource<>(connectString,
RULE_ROOT_PATH + "/" + appName + "/system", rules -> JSON.parseObject(rules, new TypeReference<List<SystemRule>>(){}));
SystemRuleManager.register2Property(systemRuleDataSource.getProperty());
}
#dubbo服务添加统一降级
/**
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(ManagerWebApplication.class, args);
// 定义dubbo全局fallback
DubboAdapterGlobalConfig.setConsumerFallback((invoker, invocation, e) -> {
logger.error("dubbo服务调用触发降级,参数:{}, 服务名:{}, 方法:{}", invocation.getArguments(), invocation.getServiceName(), invocation.getMethodName());
return AsyncRpcResult.newDefaultAsyncResult(Result.builder()
.setCode(StatusCodeEnum.CODE_00100031.getCode())
.setMsg("当前系统服务繁忙,请稍后再试!"), invocation);
});
}