前言
在我们使用Sentinel做熔断限流等操作时,一些设置好的配置默认是存放在当前服的内存中的,那么也就意味着每次重启服务,这些配置好的配置就会消失。在我们搭建微服务架构做测试的时候不是很友好。大家都知道Sentinel提供了一些持久化方式,如持久化到Nacos、本地JSON文件。这种方式虽然能解决持久化的操作,但是不能自动同步更新,也就是持久化配置写成什么样就是什么样,在程序启动后,无法动态更新到持久化存储中!当然能做到持久化Nacos或者本地JSON已经很不错了!如果作用做到这一步那么请见Sentinel整合Nacos做持久化这篇文章就够了,如果想要更加灵活,想在运行过程中动态同步Nacos那么就请往下看!一键获取springcloud资料
Sentinel动态推拉数据持久化同步到Nacos
这个操作字面意思看似只要同步Nacos这一套逻辑,其实并不是,同步Nacos其实分为普通服务同步Nacos和Gateway同步Nacos。因为二者无论是在Sentinel
Datasource(Sentinel服务端)
还是我们自己的业务服(包括网关和其他服)通知拉取推送机制都是不一样的,所以针对这种情况需要做两手逻辑操作!
在写动态拉取数据持久化Nacos前,先保证普通服务整合Sentinel和Gateway整合Sentinel默认流程先能跑通!
Sentinel动态推拉数据持久化同步到Nacos(通用部分)
1.下载Sentinel源码
Sentinel-GitHub
我这里以1.7.1版本为基准,说到版本,这里我要多提一嘴,微服务架构搭建最恶心的我觉得倒不是代码有多难写,往往是代码没什么问题,总是各种版本对不上,这就比较头痛,不过我这里提供一套方案,这套版本适配的方案是比较准的,能帮我们确定一个版本的请款下适配Spring Boot、Spring Cloud、Spring Cloud Alibaba之间的版本版本说明,我整套微服务架构的版本使用的是Spring Boot 2.3.2.RELEASE、Spring Cloud Alibaba 2.2.5.RELEASE、Spring Cloud Hoxton.SR8
不扯远了,收回来接着本文继续搞重点!
这就是我们要二开的源码,idea打开一下
2.修改pom.xml
修改pom.xml中的sentinel-datasource-nacos的依赖,将test注释掉,这样才能在主程序中使用。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!--<scope>test</scope>-->
</dependency>
3.创建nacossync目录用来编写我们二开的代码
图中nacossync中这些类就是我们要编写的代码!
4.Naocs数据同步Properties映射类
这个类无论是Gateway二开同步还是普通服务二开都是公用的
/**
* @author TAO
* @description: Naocs数据同步Properties映射类
* @date 2021/5/1 22:36
*/
@Component
@ConfigurationProperties(prefix = "nacos.server")
public class NacosConfigProperties {
private String ip;
private String port;
private String namespace;
private String groupId;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public String getNamespace() {
return namespace;
}
public void setNamespace(String namespace) {
this.namespace = namespace;
}
public String getGroupId() {
return groupId;
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
public String getServerAddr() {
return this.getIp() + ":" + this.getPort();
}
@Override
public String toString() {
return "NacosConfigProperties [ip=" + ip + ", port=" + port + ", namespace="
+ namespace + ", groupId=" + groupId + "]";
}
}
5.Nacos同步常量类
这个类可有可无,就看要不要这么规范
/**
* @author TAO
* @description: Nacos同步常量类
* @date 2021/5/6 23:19
*/
public final class NacosConfigConstant {
public static final String FLOW_DATA_ID_POSTFIX = "-sentinel-flow";//统一sentinel持久化Nacos的文件后缀
}
6.Nacos同步配置类
这个