Alibaba Sentinel

Sentinel概述:

  随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

  Sentinel 具有以下特征:
    丰富的应用场景 :Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
    完备的实时监控 :Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
    广泛的开源生态 :Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 SpringCloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
    完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

  Sentinel 的主要特性:

    

  Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合Dashboard 可以取得最好的效果。

  使用 Sentinel 来进行熔断保护,主要分为几个步骤:

    1. 定义资源
    2. 定义规则
    3. 检验规则是否生效

    资源:可以是任何东西,一个服务,服务里的方法,甚至是一段代码。
    规则:Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则和热点参数规则。
         Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效
    先把可能需要保护的资源定义好,之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。

Sentinel组件:

  管理控制台:
    获取 Sentinel 控制台 https://github.com/alibaba/Sentinel

    在存放jar包的目录,使用如下命令启动控制台:

      java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-x.x.x.jar
      其中 - Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080 。

      在浏览器中访问 http://localhost:8080/ 输入账号密码即可登录

      从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel

      启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。

  将所有的服务交给控制台管理:

    客户端接入控制台:

      在客户端(需要管理的微服务)引入坐标

        客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。可以通过 pom.xml 引入 JAR 包:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
</dependency>

      在客户端配置启动参数

spring:
  #配置控制台的请求路径。
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080

    查看机器列表以及健康情况:访问 http://localhost:8080/ 可看到刚才接入的客户端

      

      默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。也可以配置sentinel.eager=true ,取消Sentinel控制台懒加载。

基于Sentinel的服务保护:

  通用资源保护:

    1.引入依赖

      需要注意SpringCloud-Alibaba与SpringCloud的版本关系

      

      父工程引入 alibaba实现的SpringCloud

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.1.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

      子工程(服务消费者)中引入 sentinel

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

    2.配置熔断降级方法

/**
 * 订单控制层
 */
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 通过订单系统,调用商品服务根据id查询商品信息
     * @param id
     * @return
     */
    @GetMapping("/buy/{id}")
    @SentinelResource(value="order",blockHandler = "orderBlockHandler",fallback = "orderFallback")
    public Product findById(@PathVariable("id") Long id) {
        return restTemplate.getForObject("http://service-product/product/" + id, Product.class);
    }

    // 熔断降级方法
    public Product orderBlockHandler(Long id) {
        Product product = new Product();
        product.setId(-2l);
        product.setProductName("触发熔断降级方法");
        return product;
    }
    // 抛出异常降级方法
    public Product orderFallback(Long id) {
        Product product = new Product();
        product.setId(-1l);
        product.setProductName("触发抛出异常降级方法");
        return product;
    }
}

      在需要被保护的方法上使用 @SentinelResource 注解进行熔断配置。与Hystrix不同的是,Sentinel对抛出异常和熔断降级做了更加细致的区分,通过 blockHandler 指定熔断降级方法,通过 fallback 指定触发异常执行的降级方法。
      对于@SentinelResource的其他配置如下表:

      

      注:1.6.0 之前的版本 fallback 函数只针对降级异常( DegradeException )进行处理,不能针对业务异常进行处理

      特别地,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。
      若未配置 blockHandler 、 fallback 和 defaultFallback ,则被限流降级时会将 BlockException 直接抛出。

  Feign实现熔断:

    Sentinel 适配了 Feign 组件。如果想使用,除了引入 sentinel -starter 的依赖外还需要 2 个步骤:

      配置文件打开 sentinel 对 feign 的支持: feign.sentinel.enabled=true
      加入 openfeign starter 依赖使 sentinel starter 中的自动化配置类生效

    1.引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

    2.开启sentinel 支持

#配置feign
feign:
  sentinel:
    enabled: true

    3.配置FeignClient

      编写FeignClient接口的实现类

      基于Feign实现熔断降级,需要实现自定义的ProductFeginClient接口,且实现类需要扫描到容器中(@Component),降级方法就是实现接口的方法

@Component
public class ProductFeignClientImpl implements ProductFeignClient {

    /**
     * 熔断降级的方法
     * @param id
     * @return
     */
    @Override
    public Product findById(Long id) {
        Product product = new Product();
        product.setId(-1L);
        product.setProductName("熔断,触发降级方法");
        return product;
    }
}

      修改FeignClient添加hystrix熔断

/**
 * 声明需要调用的服务名称
 * @FeignClient
 *      name:服务提供者的服务名称
 *      fallback:配置熔断发生的降级方法实现类
 */
@FeignClient(name = "service-product", fallback = ProductFeignClientImpl.class)
public interface ProductFeignClient {

    /**
     * 配置需要调用的微服务接口
     */
    @GetMapping(value = "/product/{id}")
    public Product findById(@PathVariable("id") Long id);
}

    Feign 对应的接口中的资源名策略定义:httpmethod:protocol://requesturl。 @FeignClient 注解中的所有属性,Sentinel 都做了兼容。

      ProductFeginClient 接口中方法 findById 对应的资源名为 GET:http://service-product/product/{id}
    4.启动测试 .........

原文地址:https://www.cnblogs.com/roadlandscape/p/12501576.html

时间: 2024-10-11 20:42:20

Alibaba Sentinel的相关文章

Spring Cloud Alibaba | Sentinel: 服务限流基础篇

目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定义资源 2.4 注解方式定义资源 2.5 异步调用支持 3. 规则的种类 3.1 流量控制规则 (FlowRule) 3.2 熔断降级规则 (DegradeRule) 3.3 系统保护规则 (SystemRule) 3.4 访问控制规则 (AuthorityRule) Spring Cloud Al

Spring Cloud Alibaba | Sentinel: 服务限流高级篇

目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限流 3.1 背景 3.2 系统规则 3.3 原理 3.4 示例 4. 黑白名单控制 4.1 规则配置 4.2 示例 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR

Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战

Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战 Springboot: 2.1.8.RELEASE SpringCloud: Greenwich.SR2 1. Sentinel控制台概述 在介绍入门实战之前,先来介绍一下Sentinel.Sentinel控制台提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理.监控(单机和集群),规则管理和推送的功能. Sentinel控制台主要功能: 查看机器列表以及健康情况:收集 Sentinel 客户

Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战

Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战 在阅读本文前,建议先阅读<Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战>. 1. Sentinel整合Feign和RestTemplate Sentinel目前已经同时支持Feign和RestTemplate,需要我们引入对应的依赖,在使用Feign的时候需要在配置文件中打开Sentinel对Feign的支持:feign.sentinel.enabl

SpringCloud Alibaba Sentinel实现熔断与限流

 官网:https://github.com/alibaba/Sentinel 中文:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D 下载:https://github.com/alibaba/Sentinel/releases                                  运行: 1  初始化演示工程 1.1 大纲: 1.2  创建cloudalibaba-sentinel-service8401 po

alibaba/Sentinel 分布式 系统流量防卫兵

Sentinel: 分布式系统的流量防卫兵 Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性. Sentinel 具有以下特征: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围).消息削峰填谷.集群流量控制.实时熔断下游不可用应用等. 完备的实时监控:Sentinel 同时提供实

替代 Hystrix,Spring Cloud Alibaba Sentinel 快速入门

提起 Spring Cloud 的限流降级组件,一般首先想到的是 Netflix 的 Hystrix. 不过就在2018年底,Netflix 宣布不再积极开发 Hystrix,该项目将处于维护模式.官方表示 1.5.18 版本的 Hystrix 已经足够稳定,可以满足 Netflix 现有应用的需求,所以接下来其会把焦点转向对于自适应的实现,更多关注对应用程序的实时性能做出响应.对于新应用的熔断需求,将采用其它项目实现,Netflix 推荐了 Resilience4j. 作为 Spring Cl

Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则

上一篇我们介绍了如何通过Nacos的配置功能来存储限流规则.Apollo是国内用户非常多的配置中心,所以,今天我们继续说说Spring Cloud Alibaba Sentinel中如何将流控规则存储在Apollo中. 使用Apollo存储限流规则 Sentinel自身就支持了多种不同的数据源来持久化规则配置,目前包括以下几种方式: 文件配置 Nacos配置 ZooKeeper配置 Apollo配置 本文我们就来一起动手尝试一下,如何使用Apollo来存储限流规则. 准备工作 下面我们将同时使用

Spring Cloud Alibaba之服务容错组件 - Sentinel [规则持久化篇]

规则持久化 - 拉模式 在Sentinel控制台对某个微服务的接口资源配置了流控.降级等规则后,若重启了该微服务,那么配置的相关规则就会丢失,因为Sentinel默认将规则存放在内存中.每次重启微服务都得重新配置规则显然是不合理的,所以我们需要将配置好的规则进行持久化存储,而Sentinel提供了两种规则持久化模式: 拉模式(pull) 推模式(push) 本小节先介绍一下拉模式(pull),该模式的架构图如下: Tips:规则在代码中实际上是一个对象,所以通常是转换成json字符串后再存储至本