深入ReactiveFeign:反应式远程接口调用的最佳实践

2023年 12月 26日 124.3k 0

环境:SpringBoot2.7.15

1. 简介

Feign-reactive是一个用于在Spring Cloud应用程序中实现响应式微服务的框架。它支持在Spring Cloud应用程序中实现异步和非阻塞的远程调用。Feign-reactive的一些主要特点:

  • 基于Feign的简洁风格:Feign-reactive继承了Feign的简洁风格,使得在编写基于微服务架构的应用程序时,可以更加方便地实现异步编程。
  • 支持Reactive编程模型:Feign-reactive提供对Reactive编程模型的支持,使得在编写异步和非阻塞的代码时更加容易。
  • 异步和非阻塞远程调用:通过Feign-reactive,可以轻松地实现异步和非阻塞的远程调用,从而提高应用程序的响应速度和吞吐量。
  • 与Spring Cloud集成:Feign-reactive与Spring Cloud集成,使得可以在Spring Cloud应用程序中方便地使用Feign-reactive实现响应式微服务。
  • 可扩展性:Feign-reactive具有可扩展性,可以根据需要添加自定义的拦截器、编码器和解码器等。
  • Feign-reactive是一个非常有用的框架,可以帮助开发人员轻松地实现响应式微服务,提高应用程序的性能和吞吐量。

    2. 依赖管理

    
      com.playtika.reactivefeign
      feign-reactor-spring-configuration
      3.3.0
    
    
      com.playtika.reactivefeign
      feign-reactor-cloud
      3.3.0
    
    
      com.playtika.reactivefeign
      feign-reactor-webclient
      3.3.0
    

    3. 实战案例

    远程接口

    @GetMapping("/demos/info/{id}")
    public Object info(@PathVariable("id") Integer id) throws Exception {
      TimeUnit.SECONDS.sleep(3) ;
      Map result = new HashMap() ;
      result.put("code", 0) ;
      result.put("data", id) ;
      result.put("message", "success") ;
      return result ;
    }

    开启反应式功能

    @EnableReactiveFeignClients
    public class AppFeignReactorApplication {}

    基于反应式的Feign接口定义

    @ReactiveFeignClient(
        url = "http://localhost:8088/demos", 
        name = "demoReactorFeign"
    )
    public interface DemoReactorFeign {
      @GetMapping("/info/{id}")
      public Mono info(@PathVariable("id") Integer id) ;
    }

    以上就完成了一个非常简单的反应式feign接口定义,接下来就可以使用了。其实这里除了注解与openfeign不一样外,其它都一样。

    测试调用

    @Resource
    private DemoReactorFeign demoReactorFeign ;
    
    
    @GetMapping("/{id}")
    public Object info(@PathVariable("id") Integer id) {
      return this.demoReactorFeign.info(id) ;
    }

    调用结果

    图片

    接下来会介绍更多关于反应式feign的配置

    配置降级

    @ReactiveFeignClient(
        url = "http://localhost:8088/demos", 
        name = "demoReactorFeign", 
        fallback = DemoReactorFeignFallback.class,
        configuration = {DemoReactorFeignConfig.class}
    )
    public interface DemoReactorFeign {

    降级接口定义

    public class DemoReactorFeignFallback implements DemoReactorFeign {
    
    
      @Override
      public Mono info(Integer id) {
        return Mono.just("请求失败") ;
      }
    
    
    }

    自定义配置

    public class DemoReactorFeignConfig {
    
    
      @Bean
      public DemoReactorFeignFallback demoReactorFeignFallback() {
        return new DemoReactorFeignFallback() ;
      }
      
    }

    当远程接口调用失败或超时将会执行上面的fallback。

    图片图片

    超时配置

    reactive:
      feign:
        client:
          config:
            demoReactorFeign:
              options:
                connectTimeoutMillis: 2000
                readTimeoutMillis: 2000

    负载均衡配置

    reactive:
      feign:
        loadbalancer:
          enabled: true

    断路器配置

    reactive:
      feign:
        circuit:
          breaker:
           enabled: true

    要使其生效,必须引入下面的依赖

    
      org.springframework.cloud
      spring-cloud-starter-circuitbreaker-reactor-resilience4j
    

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论