简介
OpenFeign是Spring Cloud的一部分,它基于Feign实现了声明式服务调用和负载均衡。以下是OpenFeign的一些主要特性:
总的来说,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() ;
}
}
完毕!!!