赞
踩
<dependencies>
<<!--sentinel限流熔断 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--sentinel限流规则持久化 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
</dependencies>
package com.yoostar.gateway.config;
import com.alibaba.cloud.sentinel.SentinelProperties;
import com.alibaba.cloud.sentinel.datasource.config.NacosDataSourceProperties;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import java.util.Set;
/**
* @Description: 限流规则持久化
* @author: bright
* @Date: 2020/9/25 13:46
*/
@Configuration
@Order(2)
public class SentinelPersistenceConfig {
@Autowired
private SentinelProperties sentinelProperties;
@Bean
public SentinelPersistenceConfig init() throws Exception {
loadGWFlowRule();
return new SentinelPersistenceConfig();
}
private void loadGWFlowRule() {
sentinelProperties.getDatasource().entrySet().stream().filter(map -> {
return map.getValue().getNacos() != null;
}).forEach(map -> {
NacosDataSourceProperties nacos = map.getValue().getNacos();
ReadableDataSource<String, Set<GatewayFlowRule>> gwFlowRuleDataSource = new NacosDataSource<>(
nacos.getServerAddr(), nacos.getGroupId(), nacos.getDataId(),
source -> JSON.parseObject(source, new TypeReference<Set<GatewayFlowRule>>() {
}));
GatewayRuleManager.register2Property(gwFlowRuleDataSource.getProperty());
});
}
}
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8888
datasource:
gate-way-flow:
nacos:
namespace: ecc786d0-1555-4517-a5df-a65b9ac02590
server-addr: 127.0.0.1:8848
data-id: ${spring.application.name}-rules
group-id: DEFAULT_GROUP
rule-type: gw_flow
# 限流返回的响应
scg:
fallback:
mode: response
response-status: 455
response-body: error!
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: ecc786d0-1555-4517-a5df-a65b9ac02590
[
{
"resource": "service-1",
"grade": 1,
"count": 5,
"intervalSec": 1
}
]
1.5启动服务后查询sentinel控制台
注:如果你的Nacos配置了不同的隔离环境 namespace,则需要指定具体哪一个namespace,否则会加载不到规则配置,报错如下:
[c.a.c.s.datasource.converter.SentinelConverter ] line 80 : converter can not convert rules because source is empty
naocs 如下:
1、流控推送规则
要通过 Sentinel 控制台配置集群流控规则,需要对控制台进行改造。主要改造规则可以参考:
https://github.com/alibaba/Sentinel/wiki/Sentinel-控制台(集群流控管理)#规则配置
其控制台推送规则:
将规则推送到Nacos或其他远程配置中心
Sentinel客户端链接Nacos,获取规则配置;并监听Nacos配置变化,如发生变化,就更新本地缓存。
控制台监听Nacos配置变化,如发生变化就更新本地缓存。从而让控制台本地缓存总是和Nacos一致。
2、改造sentinel-dashboard
https://github.com/alibaba/Sentinel/archive/1.7.2.zip
下载后解压,使用IDEA打开如下:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!--<scope>test</scope>-->
</dependency>
sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar.html
并找到如下代码段后,并把注释打开,名称也稍作修改。
修改前:
修改后:
找到如下目录(位于test目录)
sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos
将整个目录拷贝到
sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos
修改com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2.java
修改如下:
其中,注入的两个bean:
flowRuleNacosProvider,就是实现Nacos的限流规则配置拉取。
flowRuleNacosPublisher,实现Nacos的配置推送。
FlowRuleNacosProvider.java 如下,无需修改
getRules方法中的appName参数是Sentinel中的服务名称。
configService.getConfig方法是从Nacos中获取配置信息的具体操作。其中,DataId和GroupId分别对应客户端使用时候的对应配置。如下:
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=192.168.100.80:8848
spring.cloud.sentinel.datasource.ds1.nacos.dataId=${spring.application.name}-flow-rules
FlowRuleNacosPublisher.java如下,无需修改:
打开 NacosConfigUtil.java ,如下两个地方,需要和上面使用nacos存储时的配置一致。注意:两边的DataId和GroupId必须对应上。
打开 NacosConfig.java,修改如下,主要是nacos配置中心的地址与namespace隔离环境的配置修改,如果没有设置namespace,就可以不设置 PropertyKeyConst.NAMESPACE 。
经过以上步骤就已经把流控规则改造成推模式持久化了。
执行命令
mvn clean package -DskipTests
编译成功后,在项目的 target 目录可以找到sentinel-dashboard.jar ,执行以下命令可以启动控制台:
java -jar sentinel-dashboard.jar
打开Sentinel控制台,可以看到上面通过nacos新建的限流规则
我们可以尝试在Sentinel控制台修改该规则,看是否能同步推送到Nacos,这里我们修改阈值为15,打开Nacos配置中心,可以看到已经更新过来了。
下面我们通过修改Nacos将阈值再修改为20,刷新Sentinel,也能同步过来,如下:
通过测试发现,在Sentinel控制台修改规则可以同步到Nacos,或者在Nacos上修改规则也可以同步到Sentinel控制台。
这个springcloud版本如果是2.2.2就会启动报数据源找不到,注意
更换其它版本启动没有任何问题
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<swagger.version>3.0.0</swagger.version>
<logstash.version>6.4</logstash.version>
<fastjson.version>1.2.73</fastjson.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。