2020.4.2笔记——Sentinel应用③

ribbon和sentinel整合

ribbon和sentinel整合的方式很简单,也完全不需要添加多余的依赖,因为ribbon的依赖已经包含在了spring cloud的web启动依赖中了。

两者的使用也不需要多余的配置,ribbon的使用方式方式和单独使用一样。

feign和sentinel整合

feign的使用还是需要引入feign的依赖,其次就是需要注意一个地方,就是fegin本身默认是支持hystrix做服务降级,但是我们和sentinel整合后一般就是通过sentinel做服务降级等操作。

首先就是配置文件,我们需要在feign中开启sentinel

feign:
  sentinel:
    enabled: true
#  hystrix:
#    enabled: true

feign的启动注解@EnableFeignClients自然也要加上,下面就是一个简单的使用示例 fe
2020.4.2笔记——Sentinel应用③_第1张图片

sentinel持久化

官方文档
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控制台只是用来推送我们配置的规则到客户端,由客户端执行,这些规则信息也存储在客户端中。而且这些规则一般是存储在客户端的内存中的,所以一旦客户端重启,那么配置的规则就不存在了。
2020.4.2笔记——Sentinel应用③_第2张图片
所以为了能够每次启动都能保存上一次的配置,一般sentinel都会做持久化处理。下面是sentinel的推送模式,一共有三种,其中第一种就是不做任何持久化处理。后两种就是做了持久化处理,第二种简单来说就是将配置的规则存储在文件系统中,第三种就是将配置的规则存储在第三方的配置中心中。而第三种也是性能和效果最好的一种,一般也都采用第三种。
2020.4.2笔记——Sentinel应用③_第3张图片
首先介绍两个概念,分别是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
2020.4.2笔记——Sentinel应用③_第4张图片

其实我们可以观察一下上面提到的两个重要的接口,ReadableDataSource和WritableDataSource接口,下面是WritableDataSource的所有实现类,可以发现只有一个FileWritableDataSource,而这个实现类只是处理Pull模式的写操作的。
2020.4.2笔记——Sentinel应用③_第5张图片
下面是ReadableDataSource的实现类,可以发现确实有处理Push模式的读操作的实现。
2020.4.2笔记——Sentinel应用③_第6张图片
所以我们如果想要真正实现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

https://nacos.io/zh-cn/docs/sdk.html
2020.4.2笔记——Sentinel应用③_第7张图片
2020.4.2笔记——Sentinel应用③_第8张图片

再就是在项目初始化的时候将读数据源和写数据源注册到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);
    }
}

你可能感兴趣的:(微服务笔记)