sentienl控制台、客户端持久化到Apollo

sentinel 学习笔记

前段时间大致用了一下sentinel。但是阿里云的sentinel开源并没有实现持久化,针对这个问题我采用了apollo去实现sentinel的持久化。下面就记录一下实现sentinel持久化的过程。

Sentinel 是什么?

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。

github项目地址

如何使用sentinel?

对于初学者来说,使用sentinel只需要限流功能就可以了,所以在本篇文章中,仅针对SpringCloud项目的限流功能进行阐述。

开启sentinel控制台

可以先去官网下载源代码,然后在本地打开sentinel控制台,账号密码都是sentinel,端口是8001(都可以在application配置里面改)

在这里插入图片描述

打开后如图所示,因为没有任何服务连接sentinel控制台,所以现在是一片空白。

开启一个项目连接sentinel控制台

开启一个SpringCloud项目,写一个最简单的controller

在这里插入图片描述

添加sentinel依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>0.9.0.RELEASE</version>
        </dependency>

添加application配置

# port settings
server:
  port: 8081
spring:
  application:
    name: sentinel-web-demo
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8001 # sentinel客户端服务的地址
      eager: true

这时候再登录sentinel就可以看到名为sentinel-web-demo的服务注册上去了

在这里插入图片描述

sentinel实现限流

在这里插入图片描述

如图所示,在流控规则下新增一个流控规则,资源名中填写请求路径,然后设置阈值就可以了。

在这里插入图片描述

在这里插入图片描述

成功时正常显示,失败时则会输出提示信息。

是的,完成了这步我们就实现了最简单的sentinel控流。

sentinel的持久化

很快我们就能发现存在这样的问题,一旦服务器或者客户端重启了,sentinel的控流规则就失效了。这对于一个上线的项目来说无疑是致命的,万一机器出现故障,那么我们大量的sentinel控流规则都会消失。这是因为开源的sentinel控流规则是存储在内存中的,我们需要通过一些方法来实现sentinel的持久化,在这里就只简单说一下使用apollo实现sentinel持久化。

感兴趣的同学可以看一下官方的文档

推送模式 说明 优点 缺点
原始模式 API 将规则推送至客户端并直接更新到内存中,扩展写数据源(WritableDataSource 简单,无任何依赖 不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境
Pull 模式 扩展写数据源(WritableDataSource), 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等 简单,无任何依赖;规则持久化 不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。
Push 模式 扩展读数据源(ReadableDataSource),规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。 规则持久化;一致性;快速 引入第三方依赖

sentinel 控制台代码改造

pom.xml文件先把Apollo包的test作用域去掉,顺便log4j更新成 2.15(防止恶意代码注入)

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.15</version>
        </dependency>

		<dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-openapi</artifactId>
            <version>1.2.0</version>
<!--            <scope>test</scope>-->
        </dependency>

写一个Apollo的config,Converter<T,S>指的是将S转换为T类型,portalUrl是Apollo的地址,token是Apollo生成的token

public class ApolloConfig {
   

    @Value("${apollo.meta}")
    private String portalUrl;
    @Value("${apollo.token}")
    private String token;

    /**
     * 流控规则编码
     *
     * @return
     */
    @Bean
    public Converter<List<FlowRuleEntity>, String> flowRuleEntityEncoder() {
   
        return JSON::toJSONString;
    }

    /**
     * 流控规则解码
     *
     * @return
     */
    @Bean
    public Converter<String, List<FlowRuleEntity>> flowRuleEntityDecoder() {
   
        return s -> JSON.parseArray(s, FlowRuleEntity.class);
    }

    /**
     * 降级规则编码
     *
     * @return
     */
    @Bean
    public Converter<List<DegradeRuleEntity>, String> degradeRuleEntityEncoder() {
   
        return JSON::toJSONString;
    }

    /**
     * 降级规则解码
     *
     * @return
     */
    @Bean
    public Converter<String, List<DegradeRuleEntity>> degradeRuleEntityDecoder() {
   
        return s -> JSON.parseArray(s, DegradeRuleEntity.class);
    }

    /**
     * 授权规则编码
     *
     * @return
     */
    @Bean
    public Converter<List<AuthorityRuleEntity>, String> authorityRuleEntityEncoder() {
   
        return JSON::toJSONString;
    }

    /**
     * 授权规则解码
     *
     * @return
     */
    @Bean
    public Converter<String, List<AuthorityRuleEntity>> authorityRuleEntityDecoder() {
   
        return s -> JSON.parseArray(s, AuthorityRuleEntity.class);
    }

    /**
     * 系统规则编码
     *
     * @return
     */
    @Bean
    public Converter<List<SystemRuleEntity>, String> systemRuleEntityEncoder
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apollo是一个开源的自动驾驶平台,提供了多种语言的接口供开发者使用。其中,Apollo Python接口是用于实现客户的一种方式。 通过Apollo Python接口,开发者可以使用Python语言来与Apollo平台进行交互,实现自动驾驶相关的功能。Python接口提供了一系列的类和方法,用于获取传感器数据、发送控制指令、进行路径规划等操作。 具体来说,Apollo Python接口实现了以下功能: 1. 获取传感器数据:通过接口可以获取车辆的激光雷达、摄像头、GPS等传感器数据,用于感知周围环境。 2. 发送控制指令:可以通过接口发送控制指令,如加速、刹车、转向等,控制车辆的行驶。 3. 路径规划:可以使用接口进行路径规划,根据当前位置和目标位置计算出最优路径。 4. 地图数据查询:可以查询地图数据,包括道路信息、交通标志等,用于辅助决策和规划路径。 使用Apollo Python接口实现客户需要按照以下步骤进行: 1. 安装Apollo开发环境:首先需要安装Apollo开发环境,并配置好相关依赖。 2. 导入Python接口库:在Python代码中导入Apollo Python接口库,以便使用其中的类和方法。 3. 初始接口:在代码中初始Apollo Python接口,连接到Apollo平台。 4. 使用接口功能:根据需求使用接口提供的功能,如获取传感器数据、发送控制指令等。 5. 关闭接口:在程序结束时关闭Apollo Python接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值