ribbon和sentinel整合的方式很简单,也完全不需要添加多余的依赖,因为ribbon的依赖已经包含在了spring cloud的web启动依赖中了。
两者的使用也不需要多余的配置,ribbon的使用方式方式和单独使用一样。
feign的使用还是需要引入feign的依赖,其次就是需要注意一个地方,就是fegin本身默认是支持hystrix做服务降级,但是我们和sentinel整合后一般就是通过sentinel做服务降级等操作。
首先就是配置文件,我们需要在feign中开启sentinel
feign:
sentinel:
enabled: true
# hystrix:
# enabled: true
feign的启动注解@EnableFeignClients自然也要加上,下面就是一个简单的使用示例 fe
官方文档
https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel
https://github.com/alibaba/Sentinel/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%99%E6%89%A9%E5%B1%95
sentinel持久化配置的原理如下,前面已经说了,sentinel控制台只是用来推送我们配置的规则到客户端,由客户端执行,这些规则信息也存储在客户端中。而且这些规则一般是存储在客户端的内存中的,所以一旦客户端重启,那么配置的规则就不存在了。
所以为了能够每次启动都能保存上一次的配置,一般sentinel都会做持久化处理。下面是sentinel的推送模式,一共有三种,其中第一种就是不做任何持久化处理。后两种就是做了持久化处理,第二种简单来说就是将配置的规则存储在文件系统中,第三种就是将配置的规则存储在第三方的配置中心中。而第三种也是性能和效果最好的一种,一般也都采用第三种。
首先介绍两个概念,分别是ReadableDataSource和WritableDataSource,这两个对象前者是读数据源,后者是写数据源。sentinel正是通过这两个对象实现了对规则的持久化,其中ReadableDataSource实现了将配置的规则从Sentinel读到文件或配置中心中,WritableDataSource实现了将文件或配置中心存储的规则写到Sentinel中去。
在sentinel的官网中,原始模式和Pull模式都做了详细的介绍,但是对于Push模式,如何将配置的规则从配置中心写到sentinel中没有做细致的介绍。
对于push模式,sentinel只提供了如何从nacos、zookeeper等配置中心中读取配置到sentinel中,但是没有提供如何将配置从sentinel写到配置中心中,如下,我们以nacos配置中心为例。
https://github.com/alibaba/Sentinel/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%99%E6%89%A9%E5%B1%95#%E6%8E%A8%E6%A8%A1%E5%BC%8F%E4%BD%BF%E7%94%A8-nacos-%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99
其实我们可以观察一下上面提到的两个重要的接口,ReadableDataSource和WritableDataSource接口,下面是WritableDataSource的所有实现类,可以发现只有一个FileWritableDataSource,而这个实现类只是处理Pull模式的写操作的。
下面是ReadableDataSource的实现类,可以发现确实有处理Push模式的读操作的实现。
所以我们如果想要真正实现Push模式的持久化,必须自己实现写的操作,下面以nacos为例,实现sentinel与nacos整合实现的持久化。
首先必须加入持久化的依赖,注意nacos和sentinel的依赖也已经引入了
<dependency>
<groupId>com.alibaba.cspgroupId>
<artifactId>sentinel-datasource-nacosartifactId>
<version>1.7.1version>
dependency>
为了实现写操作,我们必须实现WritableDataSource,下面就是自定义的WritableDataSource实现类,这里使用了nacos的一些api,实现了将配置的规则写到nacos中,这里write方法的参数就是从sentinel中读取到的配置规则。
public class NacosWritableDataSource<T> implements WritableDataSource<T> {
@Override
public void write(T o) throws Exception {
String remoteAddress = "localhost:8848"; //nacos的地址
String groupId = "DEFAULT_GROUP";
String dataId = "nacos-1"; //最终数据从哪里读取 && 写道哪里去
String jsonConfigInfo = encodeJson(o);
ConfigService configService = NacosFactory.createConfigService(remoteAddress);
configService.publishConfig(dataId, groupId, jsonConfigInfo);
// System.out.println(isPublishOk);
}
private <T> String encodeJson(T t) {
return JSON.toJSONString(t);
}
@Override
public void close() throws Exception {
}
}
下面就是nacos发布配置的java的API
再就是在项目初始化的时候将读数据源和写数据源注册到sentinel中,这里因为是spring项目,所以借助了@PostConstruct注解实现方法在初始化时被调用。
@Component
public class DataSourceInitFunc {
@PostConstruct
public void init() throws Exception {
String remoteAddress = "localhost:8848"; //nacos的地址
String groupId = "DEFAULT_GROUP";
String dataId = "nacos-1"; //最终数据从哪里读取 && 写道哪里去
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(remoteAddress, groupId, dataId,
source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
WritableDataSource<List<FlowRule>> wds = new NacosWritableDataSource<>();
// 将可写数据源注册至 transport 模块的 WritableDataSourceRegistry 中.
// 这样收到控制台推送的规则时,Sentinel 会先更新到内存,然后将规则写入到文件中.
WritableDataSourceRegistry.registerFlowDataSource(wds);
}
}