基于 Sentinel 作熔断 | 文末赠资料

点击上方蓝色“程序猿Damon”,选择“设为星标”

回复“yeah”获取整理的学习资料

我们都知道Spring cloud 作熔断降级的组件 Hystrix,Spring cloud 之熔断机制(实战)一文中,也讲述了如何使用 Hystrix,这是大家一直耳熟能详的。其实阿里的一款神器 Sentinel,也可以提供熔断降级的功能。

Sentinel简介

随着微服务的发展,服务们之间的稳定性变得越来越重要。Sentinel 以流量作为切入点,从流量控制、熔灾降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel 具有以下特征:完备的实时监控、广泛的开源生态、完善的 SPI 扩展点、积累丰富的场景。

首先,我们先简单看看 Sentinel 与 Hystrix 的区别:

功能SentinelHystrix
隔离策略信号量隔离策略线程池/信号量隔离策略
熔断降级基于响应时间、异常次数或异常比例基于异常比例
动态规则配置支持多数据源支持多数据源
限流基于QPS有限的支持
系统自适应保护支持不支持
控制台管理可配置规则、查看监控、服务发现等简单的链路监控查看
基于注解的支持支持支持
处理规则支持预热、匀速器、排队模式不支持
扩展性多个扩展插件形式

上面看到 Sentinel 能实现的功能也很多的,而且在熔断方面跟 Hystrix 差不多,甚至更好,所以接下来我们看看利用 Sentinel 来实现熔断的逻辑。

首先,服务生产者还是按照 Spring Cloud Kubernetes之实战二服务注册与发现 一文来进行,这里利用了简单的k8s作为服务的注册与发现功能。跟 

eureka、zk、nacos 等配置都基本类似。只不过这里不用那些了,只用k8s来处理即可。

对于服务消费者,首先配置依赖:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/>
    </parent>


  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <swagger.version>2.6.1</swagger.version>
    <xstream.version>1.4.7</xstream.version>
    <pageHelper.version>4.1.6</pageHelper.version>
    <fastjson.version>1.2.51</fastjson.version>
    <springcloud.version>Greenwich.SR4</springcloud.version>
    <!-- <springcloud.version>2.1.8.RELEASE</springcloud.version> -->
    <springcloud.kubernetes.version>1.1.1.RELEASE</springcloud.kubernetes.version>
    <mysql.version>5.1.46</mysql.version>
    <springcloud.alibaba.version>0.2.2.RELEASE</springcloud.alibaba.version>
  </properties>


  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${springcloud.alibaba.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>


      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${springcloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>


  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-undertow</artifactId>
    </dependency>


        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-oauth2</artifactId>
        </dependency>
        <!-- spring-cloud-starter-oauth2包含了 spring-cloud-starter-security -->
        <!-- <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-security</artifactId>
        </dependency> -->


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator-autoconfigure</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
            </dependency>


    <!-- springcloud-k8s-discovery -->


    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
        </dependency>


    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-kubernetes-core</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-kubernetes-discovery</artifactId>
        </dependency>


    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-ribbon</artifactId>
        </dependency>


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

接下来就需要配置 Sentinel 的监听:

spring:
  application:
    name: operate-git-service
  cloud:
    sentinel:
      enabled: true #Sentinel自动化配置是否生效
      eager: true #取消Sentinel控制台懒加载
      log:
        dir: /data/sentinel/logs #Sentinel日志文件所在的目录
      transport:
        dashboard: localhost:8080 #sentinel的Dashboard地址
        heartbeatIntervalMs: 500 #应用与Sentinel控制台的心跳间隔时间 or heartbeat-interval-ms
        port: 8719

以上配置完成后,我们写一个测试类 TestController:

@GetMapping(value = "/getUser")
//@SentinelResource(value = "hello",blockHandler = "apiBlockHandlerException", blockHandlerClass = MyExceptionUtil.class) //fallback = "testFallBack"
public Response<Object> getUser() {
  return gitClientService.getUser();
}

接着写一个Service:

@SentinelResource(value = "hello",blockHandler = "apiBlockHandlerException", blockHandlerClass = MyExceptionUtil.class, fallback = "testFallBack")
@Override
public Response<Object> getUser() {
  return Response.ok(200, 0, "success", "data");
}


public Response<Object> testFallBack() {
  return Response.ok(200, -5, "testFallBack ...", null);
}


限流异常处理类:
public class MyExceptionUtil {
  /**
   *
   * @author Damon
   * @date 2020年3月24日
   *
   */


  /**
   * 
   * 基于API函数的限流
   * @param ex
   * @return
   * @author Damon 
   * @date 2020年3月24日
   *
   */
  public static Response<Object> apiBlockHandlerException(BlockException ex) {
    return Response.ok(200, -4, "block 。。。。", null);
  }
 }

大家可以发现,controller 与 service 中都可以有注解 @SentinelResource,而且在 Spring cloud 之多种方式限流(实战)一文中,我们知道 Sentinel 默认为所有的 HTTP 服务提供限流埋点,而且有默认的限流提示(对于接口),只需要控制配置限流规则即可。这里,我们加了 @SentinelResource,其提供了属性 blockHandler、blockHandlerClass 限流的处理逻辑,同时,该注解也提供了 fallback 属性可以直接加熔断的处理函数。

同样,我们先打开 Sentinel 的Dashboard,看看其服务实时监控(如果没有则先请求几个接口):

请求的几个簇点链路:

我们可以针对函数本身作任何的规则设置,也可以针对注解@SentinelResource资源来进行设置规则:

发现,对于方法,直接加限流或降级规则设置后,其返回的结果都是:

Blocked by Sentinel (flow limiting)

而对于注解 @SentinelResource,设置限流规则:

访问其接口时,发现返回:

{"message":{"status":200,"code":-4,"message":"block 。。。。"},"data":null}

设置熔断规则:

访问后,返回:

{"message":{"status":200,"code":-5,"message":"testFallBack ..."},"data":null}

从上面的测试结果来看:

  • Sentinel 默认给所有的Http服务 设下埋点,只要定义好规则(限流、熔断),其都会按照规则执行,并且返回默认的信息:

    Blocked by Sentinel (flow limiting)
    
  • Sentinel 中设置的注解 @SentinelResource 中,包括属性 value、blockHandler、blockHandlerClass、fallback,其中中间两个是对限流定义的类与其出路逻辑函数,而 fallback 是针对熔断规则设置的处理函数。

  • 设置的规则中,限流的处理函数中,必须要有BlockException ex 这个参数,返回值要与原函数的返回值一致。而熔断的处理函数中,其函数的参数与返回值必须与原函数的都完全一致。

OK,Sentinel 作为熔断机制来处理,操作结束。

整理了一些大厂的面试资料以及 Java进阶学习资料,获取方式:关注此关注号,回复“面试题”、“Java进阶”,获取海量大厂的资料。

 

个人网站:http://www.damon8.cn

 

热文推荐

微服务自动化部署CI/CD

基础设施服务k8s快速部署之HA篇

今天被问微服务,这几点,让面试官刮目相看

Spring cloud 之多种方式限流(实战)

Spring cloud 之熔断机制(实战)

面试被问finally 和 return,到底谁先执行?

Go语言入门基础之库源码文件

Go语言入门基础之命令源码文件

Springcloud Oauth2 HA篇

Spring Cloud Kubernetes之实战一配置管理

Spring Cloud Kubernetes之实战二服务注册与发现

Spring Cloud Kubernetes之实战三网关Gateway

求关注

关注公众号,回复入群,获取更多惊喜!公众号(程序猿Damon)里回复 ES、Flink、Java、Kafka、MQ、ML、监控、大数据、k8s 等关键字可以查看更多关键字对应的文章。

如有收获,点个在看,谢谢

【多变量输入超前多步预测】基于CNN-BiLSTM的光伏功率预测研究(Matlab代码实现)内容概要:本文介绍了基于CNN-BiLSTM模型的多变量输入超前多步光伏功率预测方法,并提供了Matlab代码实现。该研究结合卷积神经网络(CNN)强大的特征提取能力与双向长短期记忆网络(BiLSTM)对时间序列前后依赖关系的捕捉能力,构建了一个高效的深度学习预测模型。模型输入包含多个影响光伏发电的气象与环境变量,能够实现对未来多个时间步长的光伏功率进行精确预测,适用于复杂多变的实际应用场景。文中详细阐述了数据预处理、模型结构设计、训练流程及实验验证过程,展示了该方法相较于传统模型在预测精度和稳定性方面的优势。; 适合人群:具备一定机器学习和深度学习基础,熟悉Matlab编程,从事新能源预测、电力系统分析或相关领域研究的研发人员与高校研究生。; 使用场景及目标:①应用于光伏电站功率预测系统,提升电网调度的准确性与稳定性;②为可再生能源并网管理、能量存储规划及电力市场交易提供可靠的数据支持;③为深度学习在时间序列多步预测中的典型案例,用于科研复现与教学参考。; 阅读建议:建议读者结合提供的Matlab代码进行实践操,重点关注数据归一化、CNN特征提取层设计、BiLSTM时序建模及多步预测策略的实现细节,同时可尝试引入更多外部变量或优化网络结构以进一步提升预测性能。
### 配置与使用 Sentinel 网关中的熔断机制 #### 启动 Sentinel 控制台 为了管理熔断规则,首先需要启动 Sentinel 的控制面板。通过命令行工具,在对应的目录下执行如下命令来启动 Sentinel 控制台[^2]: ```bash java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -jar sentinel-dashboard-1.8.1.jar ``` #### 创建熔断规则 在 Sentinel 中创建熔断规则主要涉及以下几个参数: - **资源名称**:定义要保护的服务接口或方法名。 - **策略类型**:选择基于异常比例的熔断方式。 - **最小请求数**:设定触发熔断前至少收到的有效请求数量,默认为5次请求。 - **异常比例阈值**:指定允许的最大失败率,一旦超过此数值即触发熔断;该值位于区间\[0.0, 1.0\]之间。 - **熔断时长**:确定熔断后的持续秒数。 具体操是在 Sentinel 控制台上找到目标服务并点击进入详情页后,切换到“流量控制”标签下的“熔断降级”,按照上述说明填写各项配置项即可完成设置[^3]. #### 测试熔断效果 配置完成后可以通过模拟高并发场景测试熔断功能是否生效。如果一段时间内的错误率达到预设条件,则后续请求会被立即拒绝直到超时期满。期满后系统会尝试发送少量试探性的新请求验证服务健康状况——若这些请求均能正常响应则解除熔断状态恢复正常运模式;反之将继续保持熔断直至满足恢复标准为止.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值