SpringCloud 微服务架构(19)- 服务熔断 hystrix 的替换方案

1 服务熔断Hystrix的替换方案

18年底Netflix官方宣布Hystrix 已经足够稳定,不再积极开发 Hystrix,该项目将处于维护模式。就目前
来看Hystrix是比较稳定的,并且Hystrix只是停止开发新的版本,并不是完全停止维护,Bug什么的依
然会维护的。因此短期内,Hystrix依然是继续使用的

1.1 Sentinel

阿里巴巴开源的一款断路器实现,目前在Spring Cloud的孵化器项目Spring Cloud Alibaba中的一员Sentinel本身在阿里内部已经被大规模采用,非常稳定。因此可以作为一个较好的替代品。

1.2 Resilience4J

一款非常轻量、简单,并且文档非常清晰、丰富的熔断工具,这也是Hystrix官方推荐的替代产品。不仅如此,Resilicence4j还原生支持Spring Boot 1.x/2.x,而且监控也不像Hystrix一样弄Dashboard/Hystrix等一堆轮子,而是支持和Micrometer(Pivotal开源的监控门面,Spring Boot 2.x中的Actuator就是基于Micrometer的)、prometheus(开源监控系统,来自谷歌的论文)、以及Dropwizard metrics(Spring Boot曾经的模仿对象,类似于Spring Boot)进行整合。

2 Sentinel概述

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

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

在这里插入图片描述

2.1 Sentinel与Hystrix的区别

在这里插入图片描述

2.2 名词解释

Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合Dashboard 可以取得最好的效果。
使用 Sentinel 来进行熔断保护,主要分为几个步骤:

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

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

3 Sentinel中的管理控制台

3.1 下载启动控制台

  • 获取 Sentinel 控制台 https://github.com/alibaba/Sentinel/releases/download/1.6.3/sentinel-dashboard-1.6.3.jar
  • 启动
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

在这里插入图片描述

  • 用户名和密码都是 sentinel
    在这里插入图片描述

3.2 搭建基础环境

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


  • 测试 rest 调用: http://localhost:9004/order/buy/1
    在这里插入图片描述

  • 测试 Feign 调用: http://localhost:9003/order/buy/1
    在这里插入图片描述

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

客户端介入 sentinel 管理控制台

  1. 在客户端(需要管理微服务上)引入坐标
  2. 客户端配置启动参数

需要注意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>

在这里插入图片描述

  • 2个order 子工程引入
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

在这里插入图片描述

server:
  port: 9004
spring:
  application:
    name: service-order-rest #服务名称
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springcloud_shop?useUnicode=true&characterEncoding=utf8
    username: root
    password: root
  jpa:
    database: MySQL
    show-sql: true
    open-in-view: true
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/
  instance:
    prefer-ip-address: true # 使用 ip 地址注册

在这里插入图片描述

server:
  port: 9003
spring:
  application:
    name: service-order-feign #服务名称
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springcloud_shop?useUnicode=true&characterEncoding=utf8
    username: root
    password: root
  jpa:
    database: MySQL
    show-sql: true
    open-in-view: true
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080

eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/
  instance:
    prefer-ip-address: true # 使用 ip 地址注册

## 配置 feign 日志输出
## NONE:不输出日志, BASIC:适用于生产环境追踪问题
## HEADERS: 在 BASIC 的基础上,记录请求和响应的头信息, FULL:记录所有
#feign:
#  client:
#    config:
#      service-product: # 需要调用的服务名称
#        loggerLevel: FULL
#  #开启对 hystrix 的支持
#  hystrix:
#    enabled: true
#logging:
#  level:
#    com.tzb.order.feign.IProductFeignClient: debug
#
## 暴露所有actuator监控的端点
#management:
#  endpoints:
#    web:
#      exposure:
#        include: '*'



  • 启动
    在这里插入图片描述

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

  • 分别访问一下2个服务
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页