SpringCloud 2021.0.9 OpenFeign 与 circuitbreaker-resilience4j 使用示例

背景

OpenFeign是微服务中服务远程调用组件。
circuitbreaker 是断路器的抽象接口。
resilience4j是断路器的一种实现。

在服务间远程调用过程中,为了避免服务雪崩,需要设置失败保护机制,当下游服务超时或者不可用时,上游服务可以快速返回,同时下游服务会降级,上游服务短时间不去请求下游服务。

实现远程调用

服务提供者

服务提供者就是正常的SpringBoot项目,为了让服务调用者可以请求该服务,需要将服务信息注册到Consul注册中心。

1依赖如下:

<dependencies>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
        </dependency>

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

2配置如下:

spring:
  application:
    name: system-application
  cloud:
    consul:
      discovery:
        service-name: ${spring.application.name}
        instance-id: system-service
      host: localhost
      port: 8500
      config:
        format: yaml
        data-key: system
        enabled: true
        watch:
          enabled: true
          wait-time: 5

  config:
    import: optional:consul:${spring.cloud.consul.host}:${spring.cloud.consul.port}/test

hello:
  name

3还需要自己实现一个普通controller。

启动服务提供者,打开consul控制台,服务成功注册即可。

服务消费

1 添加依赖


 <dependencies>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

相比服务提供者,多了一个断路器的依赖:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
        </dependency>

2 配置:

spring:
  application:
    name: portal-application
  cloud:
    consul:
      discovery:
        service-name: ${spring.application.name}
        instance-id: portal-service
      host: localhost
      port: 8500

  config:
    import: optional:consul:${spring.cloud.consul.host}:${spring.cloud.consul.port}


feign:
  circuitbreaker:
    enabled: true
#  client:
#    config:
#      default:
#        connectTimeout: 1000
#        readTimeout: 1000

server:
  port: 8081


配置文件中只添加如下配置,用于打开circuitbreaker。
feign:
circuitbreaker:
enabled: true

3 配置断路器, 这里配置了1ms的超时。

@Configuration
public class BreakerConfig {

    @Bean
    public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
        return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
                .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofMillis(1)).build())
                .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
                .build());
    }
}

4 实现FeignClient调用,主要是加入fallback逻辑,用于失败后的处理

@FeignClient(name ="system-application",  fallback = UserClient.Fallback.class)
@Component
public interface UserClient {

    @GetMapping("")
    String getName();

    @Component
    static class Fallback implements UserClient {

        @Override
        public String getName() {
            return "00000000000000000000000";
        }
    }
}

至此,基本的Demo已经完成。

启动服务消费者,访问feignClient的接口,发现返回了fallback类中配置的信息。证明断路器配置起作用。

除了断路器的配置外,如下的配置和断路器无关,支持配置了http请求的超时时间,如果超时,会报错,不会触发Fallback。

  client:
    config:
      default:
        connectTimeout: 1000
        readTimeout: 1000

总结

  1. 加入断路器依赖
  2. feign.circuitbreaker.enabled: true 开启断路器
  3. 注入Resilience4JConfigBuilder

以上三步在服务调用方实现。

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一点博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值