zoukankan      html  css  js  c++  java
  • 在spring boot中3分钟上手阿里巴巴服务熔断系统sentinel

     

    一直在用hystrix做熔断降级,但是无奈hystrix官方已经不再维护了,sentinel背后是阿里巴巴公司,并且一直在维护sentinel,所以先了解下,hystrix不够用时,可以换成sentinel

    并且特性丰富,这里就使用如下两个核心功能

    1. 熔断
    2. 流控

    启动Sentinel控制台

    sentinel的控制台是由spring boot开发,特殊需求可以修改源码定制,源码参考:sentinel-dashboard 可以使用docker一键启动控制台 编写sentinel-dashboard的Dockerfile

    1.  
      FROM openjdk:8-jdk-alpine
    2.  
       
    3.  
      ADD https://github.com/alibaba/Sentinel/releases/download/1.6.0/sentinel-dashboard-1.6.0.jar /sentinel-dashboard-1.6.0.jar
    4.  
      ENTRYPOINT ["java", "-Dserver.port=8080", "-Dcsp.sentinel.dashboard.server=localhost:8080", "-Dproject.name=sentinel-dashboard", "-jar", "/sentinel-dashboard-1.6.0.jar", "-Dfile.encoding=utf-8"]
    5.  
      复制代码

    构建sentinel-dashboard镜像:docker build -t sentinel-dashboard . 然后启动

    1.  
      docker run --name sentinel-dashboard
    2.  
      -it --rm -p 8719:8719 -p 8780:8080 sentinel-dashboard
    3.  
      复制代码

    其中8080是sentinel web控制界面端口,8719是sentinel应用端和控制台通信端口,参考配置控制台信息

    打开 本机ip:8780 查看效果,默认的用户名密码都是 sentinel

    创建测试项目并进行配置

    在spring boot里集成sentinel比较容易,找个现有的spring boot的项目,或者去https://start.spring.io/创建一个即可

    引入sentinel包,这个包用来进行熔断控制,同时会和sentinel控制台进行通信

    1.  
      <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-sentinel -->
    2.  
      <dependency>
    3.  
      <groupId>org.springframework.cloud</groupId>
    4.  
      <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    5.  
      <version>0.9.0.RELEASE</version>
    6.  
      </dependency>
    7.  
      复制代码

    注意修改pom.xml文件后记得reimport一下

    在配置里加上和sentinel控制台通信的配置:src/main/resources/application.properties

    1.  
      spring.application.name=MySentinel
    2.  
      spring.cloud.sentinel.eager= true
    3.  
      spring.cloud.sentinel.transport.port= 8720
    4.  
      spring.cloud.sentinel.transport.dashboard= 127.0.0.1:8780
    5.  
      spring.cloud.sentinel.transport.heartbeat-interval-ms= 500
    6.  
      复制代码

    注意这里的8720端口是应用端的sentinel和sentinel控制台通信的端口

    启动项目在sentinel控制台查看效果

    可以看到项目已经成功和sentinel控制台建立了通信

    sentinel可以对多个http客户端进行熔断,参考:Feign & RestTemplate支持

    这里使用最常用的RestTemplate来进行请求

    在spring boot main方法所在类里配置允许sentinel对RestTemplate进行熔断 核心代码如下:

    1.  
      @Bean
    2.  
      @SentinelRestTemplate
    3.  
      public RestTemplate restTemplate() {
    4.  
      return new RestTemplate();
    5.  
      }
    6.  
      复制代码

    这个SentinelRestTemplate注解有几个事件回调的参数,可以在熔断时执行自定义的处理逻辑,参考:RestTemplate 支持

    有时间可以去详细研究下

    编写熔断测试代码

    在项目里编写测试控制器比如 MyController.java 核心代码如下

    1.  
      @RestController
    2.  
      @RequestMapping("test")
    3.  
      public class MyController {
    4.  
       
    5.  
      @GetMapping(value = "/hello")
    6.  
      @SentinelResource("hello")
    7.  
      public String hello() {
    8.  
      return "Hello Sentinel";
    9.  
      }
    10.  
       
    11.  
      }
    12.  
      复制代码

    SentinelResource注解里的值是资源标识符,可以为这个资源标识符指定限流,熔断规则等

    在浏览器里请求这个地址,然后查看sentinel控制台

     可以看到sentinel控制台已经成功监控到了这个测试的url

    降级测试

    编写一个控制器路由,让这个路由能够触发降级阈值,核心代码如下:

    1.  
      @GetMapping(value = "/mye")
    2.  
      @SentinelResource("mye")
    3.  
      public String mye() {
    4.  
      if (true) {
    5.  
      throw new RuntimeException("mye");
    6.  
      }
    7.  
      return "mye Sentinel";
    8.  
      }
    9.  
      复制代码

    可以看到这段代码是会100%抛出异常

    配置降级规则 点击 降级规则->新作降级规则 按钮新增降级规则

    右键新窗口可以查看大图,这个熔断规则是任务当请求里的异常比例超过50%后,熔断接口30秒

    然后多次请求这个异常接口,查看控制台日志,在几次异常后,可以看到sentinel已经开始熔断保护这个接口了

    限流测试

    编写一个输出字符串的接口来测试,核心代码如下:

    1.  
      @GetMapping(value = "/myrate")
    2.  
      @SentinelResource("myrate")
    3.  
      public String myrate() {
    4.  
      return "myrate Sentinel";
    5.  
      }
    6.  
      复制代码

    添加限流规则

     这里为了看到效果,阈值设置得比较极端:qps超过1秒就限流

    然后在浏览器里访问这个接口,按住ctrl+r模拟频繁访问的效果,因为阈值设置得比较极端,立刻就可以在应用控制台里看到已经触发了sentinel的限流保护机制了

    页面上也开始提示No message了

    一些注意的点

    测试时注意端口不要冲突了,setinel控制台占用了两个端口(8719, 8080),应用也会占用两个端口(8720, 8666), 8666应用web端口可以自行设置

    应用的sentinel客户端会缓存sentinel控制台的熔断规则,如果sentinel控制台宕机了,应用还会继续使用缓存的熔断规则进行熔断。可以重启应用让熔断规则失效

    docker的sentinel默认重启后熔断规则会丢失,如果保存熔断规则需要配置数据源,参考动态数据源支持

    转载于:https://juejin.im/post/5cc826a5f265da03a33c443a

  • 相关阅读:
    linux下文件的复制、移动与删除
    031_spark架构原理
    Scala基础篇-05求值策略
    Ceph pg分裂流程及可行性分析
    Ceph中的序列化
    奔跑吧,OpenStack现场分享:超融合架构如何抹平物理硬件差异?
    Ceph中Bufferlist的设计与使用
    IaaS中的统一存储:从设计到实现
    关于Ceph现状与未来的一些思考
    解析Ceph: 数据的端到端正确性和 Scrub 机制
  • 原文地址:https://www.cnblogs.com/xiaoxiaoweng/p/13600755.html
Copyright © 2011-2022 走看看