高并发下就该使用非阻塞式方式接口调用提高系统整体性能

2023年 9月 25日 57.3k 0

简介

OpenFeign是Spring Cloud的一部分,它基于Feign实现了声明式服务调用和负载均衡。以下是OpenFeign的一些主要特性:

  • 支持SpringMVC的注解:OpenFeign整合了SpringMVC的注解,例如@RequestMapping,使得用户可以直接在接口上使用这些注解,而无需编写接口实现。
  • 负载均衡:OpenFeign通过动态代理的方式生成实现类,这些实现类中包含了负载均衡的实现,并可以调用其他服务。
  • 声明式服务调用:OpenFeign提供了一种声明式的方式来访问远程服务,这使得使用者可以像调用本地方法一样来调用远程服务。
  • 可插拔的注解:OpenFeign提供了可插拔的注解支持,这意味着用户可以根据自己的需要选择不同的注解来使用。
  • 异步通信:OpenFeign支持异步通信,这使得用户可以更好地利用异步请求带来的优势。
  • 熔断器:OpenFeign可以与resilience4j集成,支持熔断器的功能,这可以在服务调用失败时保护系统,防止故障扩散。
  • 服务发现:OpenFeign可以与nacos, loadbalancer配合使用,支持服务发现的功能及负载均衡,这使得用户可以更加方便地管理和调用远程服务。
  • 总的来说,OpenFeign是一个功能强大的声明式服务调用和负载均衡工具,它可以提高服务调用的效率和灵活性,并可以帮助用户更好地管理他们的分布式系统。

    但是OpenFeign并不支持反应式客户端,如Spring WebClient,Spring Cloud OpenFeign也不支持。

    feign-reactor是Spring Cloud的feign的扩展,它提供了对Reactor Netty的支持,可以更好地处理HTTP请求。具体来说,feign-reactor基于Reactor Netty实现,它支持Reactive编程模型,可以更好地处理异步请求,并且可以更好地利用网络资源。此外,feign-reactor还提供了一些其他的特性,例如:支持负载均衡、支持熔断器、支持自定义请求和响应等。

    总的来说,feign-reactor可以提升feign在处理HTTP请求时的效率和灵活性。

    使用上基本与openfeign一致,就是将相应的注解换了相应的名称。

    环境准备

    
      org.springframework.boot
      spring-boot-starter-webflux
    
    
    
    
      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
    

    feign-reactor-cloud依赖提供了CircuitBreaker + LoadBalancer的支持。

    feign-reactor-webclient依赖提供了有关WebClient客户端相关的实现及配置。

    feign-reactor-spring-configuration依赖提供了Spring自动配置。

    开启反应式客户端

    @SpringBootApplication
    // 这里与openfeign就是名称不一样
    @EnableReactiveFeignClients
    public class SpringcloudFeignReactorApplication {
    }

    reactor feign接口定义

    @ReactiveFeignClient(
        // 目标地址
        url = "http://localhost:8088/demos", 
        // 这里没有走服务发现机制,随意
        name = "demoReactorFeign", 
        // 回退;当发生异常或超时调用,这里与openfeign一样都需要实现当前feign接口
        fallback = DemoReactorFeignFallback.class,
        // 配置
        configuration = {DemoReactorFeignConfig.class}
    )
    public interface DemoReactorFeign {
    
    
      // 下面这个注解是feign的注解
      // @RequestLine("GET /info/{id}")
      // feign中@PathVariable => @Param
      // 基于SpringMVC的注解
      @GetMapping("/info/{id}")
      public Mono info(@PathVariable("id") Integer id) ;
      
    }

    回退类定义

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

    配置类

    // 这里没有添加@Configuration注解,不需要,不过添加了也可以,只是可能会出现问题
    public class DemoReactorFeignConfig {
    
    
      // 配置上面的回退类
      @Bean
      public DemoReactorFeignFallback demoReactorFeignFallback() {
        return new DemoReactorFeignFallback() ;
      }
      
    }

    以上对feign reactor的使用除了类不一样外,其它都与openfeign是保持一致的。

    测试接口

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

    图片图片

    成功调用目标接口

    超时支持

    超时配置,我们只需要提供配置即可

    reactive:
      feign:
        client:
          config:
            default:
              options: 
                connectTimeoutMillis: 1000
                readTimeoutMillis: 1000

    以上是默认配置,对所有的接口都是一样的超时时间。

    由于目标接口模拟了耗时操作,所以调用了回退接口由于目标接口模拟了耗时操作,所以调用了回退接口

    为具体接口配置超时

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

    编程方式

    也可以直接通过编程的方式

    public class ProgramReactorFeignMain {
    
    
      @Headers({ "Accept: application/json" })
      static interface DemoReactorFeign {
    
    
        @RequestLine("GET /info/{id}")
        public Mono info(@Param("id") Integer id) ;
        
      }
      
      public static void main(String[] args) throws Exception {
        DemoReactorFeign target = 
            WebReactiveFeign                  //  WebClient based reactive feign  
            //JettyReactiveFeign              //  Jetty http client based
            //Java11ReactiveFeign             //  Java 11 http client based
            .builder()      //  指定方法返回值参数化类型
            .target(DemoReactorFeign.class, "http://localhost:8088/demos") ;
        target.info(6666).doOnNext(System.out::println).block() ;
      }
      
    }

    完毕!!!

    相关文章

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

    发布评论