Sentinel 与 OpenFeign 断路器:Hystrix 已过时,Sentinel 强势崛起

发布于:2024-04-29 ⋅ 阅读:(27) ⋅ 点赞:(0)
简介

随着微服务架构的流行,服务之间的通信变得日益频繁。为了保证系统的稳定性和可靠性,在服务之间的通信中使用断路器是至关重要的。本文将介绍 OpenFeign 与 Sentinel 结合使用的方法,强调 Hystrix 已经过时,并展示 Sentinel 的强大之处。

1. Hystrix 的退场

Hystrix 曾是微服务领域中最流行的断路器实现之一,但随着其维护停滞和社区活跃度下降,Hystrix 已经宣布停止维护。这导致了很多开发者开始寻找替代方案,而 Sentinel 就是其中的佼佼者。

2. Sentinel 的介绍

Sentinel 是阿里巴巴开源的一款高可用性的流量控制、熔断降级解决方案。它提供了实时的流量监控、熔断降级、系统负载保护等功能,可以帮助开发者保护系统免受不稳定的外部服务的影响。

3. OpenFeign 与 Sentinel 结合

OpenFeign 是一个声明式的 HTTP 客户端,可以轻松地与 Sentinel 集成,从而实现对服务调用的流量控制和熔断降级。下面是集成的方法:

3.1 添加依赖

在项目的 pom.xml 文件中添加 Sentinel、Nacos 和 OpenFeign 的相关依赖,确保版本兼容性。

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

<!-- Nacos -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- OpenFeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- loadbalancer-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

3.2 配置 Sentinel 和 Nacos

这段配置是针对使用 Feign 和 Sentinel 进行服务调用时的相关设置。

  • feign.circuitbreaker.enabled: true: 这个配置项启用了 Feign 的断路器功能。Feign 通过集成断路器来处理对其他服务的调用,当远程服务不可用或出现故障时,断路器会打开,防止请求继续发送到不可用的服务上,从而保护系统的稳定性。【注意】为啥开启了sentinel还需要单独开启circuitbreaker,有时候会抽风,feign.circuitbreaker.enabled: true为了更靠谱点

  • feign.sentinel.enabled: true: 这个配置项启用了 Feign 与 Sentinel 的集成功能。

在配置文件中添加 Sentinel 和 Nacos 的配置,例如:

feign:
  client:
    config:
      metaDataClient:
        connect-timeout: 5000
        read-timeout: 10000
    default-to-properties: true
  circuitbreaker:
    enabled: true
  sentinel:
    enabled: true
    
spring:
  cloud:
	  nacos:
	    discovery:
	      server-addr: localhost:8848  # Nacos 注册中心的地址
	      username: nacos
	      password: nacos

3.3 创建 Feign 客户端

创建一个接口,使用 @FeignClient 注解来声明一个 Feign 客户端,示例如下:

@FeignClient(name = "service-provider", fallbackFactory = EchoServiceFallbackFactory.class)
public interface EchoService {
    @GetMapping(value = "/echo")
    String echo();
}

3.4 创建 Sentinel FallbackFactory

创建一个 FallbackFactory 类,用于对 Sentinel 断路器的回退处理,示例如下:

@Component
public class EchoServiceFallbackFactory implements FallbackFactory<EchoService> {
    @Override
    public EchoService create(Throwable cause) {
        return new EchoService() {
            @Override
            public String echo() {
                System.out.println("Circuit breaker triggered!");
                return "Circuit breaker triggered!";
            }
        };
    }
}

4. 启用 Nacos 注册中心

在 Spring Boot 应用的启动类上添加 @EnableDiscoveryClient 注解,以启用 Nacos 注册中心的服务注册和发现功能。

@SpringBootApplication
@EnableDiscoveryClient
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

最后Resilience4j 是一个备受推崇的工具。它提供了一套弹性组件,用于处理分布式系统中的故障和延迟,帮助开发者构建具有高可用性和可靠性的应用程序。

5. Resilience4j 简介

Resilience4j 是一个轻量级的容错库,由 Java 8+ 编写,旨在帮助开发者构建弹性和鲁棒性的分布式系统。它提供了诸如断路器、限流、重试等功能,通过这些功能,可以有效地保护应用程序免受外部服务的故障和不稳定性的影响。

6. Resilience4j 的核心组件

Resilience4j 提供了一系列核心组件,用于实现容错和弹性功能:

6.1 断路器(Circuit Breaker)

断路器是 Resilience4j 最为重要的组件之一,它可以监控对远程服务的调用,并在达到一定的失败阈值后打开,阻止对故障服务的调用,从而避免资源的浪费和系统的雪崩效应。

6.2 限流器(Rate Limiter)

限流器用于限制对远程服务的请求速率,防止系统因为过多的请求而被压垮。通过限制请求的速率,可以有效地保护系统免受过载的影响。

6.3 重试器(Retry)

重试器用于处理由于网络故障或服务不可用导致的请求失败。它可以根据预定义的策略和条件,自动地对失败的请求进行重试,提高系统的可靠性和稳定性。

6.4 超时器(Timeout)

超时器用于设置请求的最大执行时间,当请求执行时间超过设定的阈值时,超时器会自动取消请求并返回一个超时异常,避免长时间的等待导致系统资源的浪费。

7. Resilience4j 的优势

Resilience4j 具有以下几个显著的优势:

  • 轻量级: Resilience4j 是一个轻量级的库,不依赖于其他大型框架,可以很容易地集成到现有的项目中。
  • 响应式: Resilience4j 支持响应式编程,可以与 Reactor、RxJava 等响应式框架无缝集成,提供异步和非阻塞的容错解决方案。
  • 可组合性: Resilience4j 的组件是可以组合使用的,开发者可以根据实际需求灵活地选择和配置不同的组件,构建符合业务场景的弹性策略。