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

开发 开发工具
总的来说,OpenFeign是一个功能强大的声明式服务调用和负载均衡工具,它可以提高服务调用的效率和灵活性,并可以帮助用户更好地管理他们的分布式系统。

简介

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

  1. 支持SpringMVC的注解:OpenFeign整合了SpringMVC的注解,例如@RequestMapping,使得用户可以直接在接口上使用这些注解,而无需编写接口实现。
  2. 负载均衡:OpenFeign通过动态代理的方式生成实现类,这些实现类中包含了负载均衡的实现,并可以调用其他服务。
  3. 声明式服务调用:OpenFeign提供了一种声明式的方式来访问远程服务,这使得使用者可以像调用本地方法一样来调用远程服务。
  4. 可插拔的注解:OpenFeign提供了可插拔的注解支持,这意味着用户可以根据自己的需要选择不同的注解来使用。
  5. 异步通信:OpenFeign支持异步通信,这使得用户可以更好地利用异步请求带来的优势。
  6. 熔断器:OpenFeign可以与resilience4j集成,支持熔断器的功能,这可以在服务调用失败时保护系统,防止故障扩散。
  7. 服务发现: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一致,就是将相应的注解换了相应的名称。

环境准备

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


<dependency>
  <groupId>com.playtika.reactivefeign</groupId>
  <artifactId>feign-reactor-spring-configuration</artifactId>
  <version>3.3.0</version>
</dependency>
<dependency>
  <groupId>com.playtika.reactivefeign</groupId>
  <artifactId>feign-reactor-cloud</artifactId>
  <version>3.3.0</version>
</dependency>
<dependency>
  <groupId>com.playtika.reactivefeign</groupId>
  <artifactId>feign-reactor-webclient</artifactId>
  <version>3.3.0</version>
</dependency>

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<Object> info(@PathVariable("id") Integer id) ;
  
}

回退类定义

public class DemoReactorFeignFallback implements DemoReactorFeign {


  @Override
  public Mono<Object> 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<Object> 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
        .<DemoReactorFeign>builder()      //  指定方法返回值参数化类型
        .target(DemoReactorFeign.class, "http://localhost:8088/demos") ;
    target.info(6666).doOnNext(System.out::println).block() ;
  }
  
}

完毕!!!

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2023-09-28 08:01:06

MySQL事务失效

2017-01-15 09:56:48

LinuxIO性能

2010-02-22 10:38:44

Web交换技术

2010-01-05 13:59:22

网吧交换机

2020-11-24 20:54:17

数据

2014-06-12 19:53:08

达梦DMETLETL

2011-12-21 17:12:07

2016-11-28 09:08:43

java系统异步非阻塞

2023-10-06 16:56:19

Python二进制工具

2020-04-10 10:10:28

Nginx高并发性能

2019-10-30 16:54:08

golangredis数据库

2024-08-05 11:34:49

2020-07-15 08:14:12

高并发

2020-09-23 22:36:27

分布式架构系统

2014-08-08 13:30:44

Nginx

2013-01-30 10:12:24

NginxNginx优化高并发

2021-03-28 09:45:05

幂等性接口数据

2024-02-02 11:24:00

I/O高并发场景

2022-06-12 06:45:26

高并发防重

2018-02-27 09:17:52

分布式存储性能
点赞
收藏

51CTO技术栈公众号