简介
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一致,就是将相应的注解换了相应的名称。
环境准备
<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() ;
}
}
完毕!!!