kptfh / Feign Reactive
Programming Languages
Projects that are alternatives of or similar to Feign Reactive
Happy to announce that from now Java Reactive Feign client is officially backed by Playtika. All development will be conducted in Playtika fork https://github.com/Playtika/feign-reactive
Subscribe to stay up to date 🙂
feign-reactive
Use Feign with Spring WebFlux
Overview
Implementation of Feign on Spring WebClient. Brings you the best of two worlds together : concise syntax of Feign to write client side API on fast, asynchronous and non-blocking HTTP client of Spring WebClient.
Modules
feign-reactor-core : base classes and interfaces that should allow to implement alternative reactor Feign
feign-reactor-webclient : Spring WebClient based implementation of reactor Feign
feign-reactor-cloud : Spring Cloud implementation of reactor Feign (Ribbon/Hystrix)
feign-reactor-rx2 : Rx2 compatible implementation of reactor Feign (depends on feign-reactor-webclient)
feign-reactor-jetty : experimental Reactive Jetty client based implementation of reactor Feign (doesn't depend on feign-reactor-webclient). In future will allow to write pure Rx2 version.
- have greater reactivity level then Spring WebClient. By default don't collect body to list instead starts sending request body as stream.
- starts receiving reactive response before all reactive request body has been sent
- process Flux<
String
> correctly in request and response body
Usage
Write Feign API as usual, but every method of interface
- may accept
org.reactivestreams.Publisher
as body - must return
reactor.core.publisher.Mono
orreactor.core.publisher.Flux
.
@Headers({ "Accept: application/json" })
public interface IcecreamServiceApi {
@RequestLine("GET /icecream/flavors")
Flux<Flavor> getAvailableFlavors();
@RequestLine("GET /icecream/mixins")
Flux<Mixin> getAvailableMixins();
@RequestLine("POST /icecream/orders")
@Headers("Content-Type: application/json")
Mono<Bill> makeOrder(IceCreamOrder order);
@RequestLine("GET /icecream/orders/{orderId}")
Mono<IceCreamOrder> findOrder(@Param("orderId") int orderId);
@RequestLine("POST /icecream/bills/pay")
@Headers("Content-Type: application/json")
Mono<Void> payBill(Publisher<Bill> bill);
}
Build the client :
/* Create instance of your API */
IcecreamServiceApi client = ReactiveFeign
.builder()
.target(IcecreamServiceApi.class, "http://www.icecreame.com")
/* Execute nonblocking requests */
Flux<Flavor> flavors = icecreamApi.getAvailableFlavors();
Flux<Mixin> mixins = icecreamApi.getAvailableMixins();
or cloud aware client :
IcecreamServiceApi client = CloudReactiveFeign.<IcecreamServiceApi>builder()
.setFallback(new TestInterface() {
@Override
public Mono<String> get() {
return Mono.just("fallback");
}
})
.setLoadBalancerCommand(
LoadBalancerCommand.builder()
.withLoadBalancer(AbstractLoadBalancer.class.cast(getNamedLoadBalancer(serviceName)))
.withRetryHandler(new DefaultLoadBalancerRetryHandler(1, 1, true))
.build()
)
.target(IcecreamServiceApi.class, "http://" + serviceName);
/* Execute nonblocking requests */
Flux<Flavor> flavors = icecreamApi.getAvailableFlavors();
Flux<Mixin> mixins = icecreamApi.getAvailableMixins();
Rx2 Usage
Write Feign API as usual, but every method of interface
- may accept
Flowable
,Observable
,Single
orMaybe
as body - must return
Flowable
,Observable
,Single
orMaybe
.
@Headers({"Accept: application/json"})
public interface IcecreamServiceApi {
@RequestLine("GET /icecream/flavors")
Flowable<Flavor> getAvailableFlavors();
@RequestLine("GET /icecream/mixins")
Observable<Mixin> getAvailableMixins();
@RequestLine("POST /icecream/orders")
@Headers("Content-Type: application/json")
Single<Bill> makeOrder(IceCreamOrder order);
@RequestLine("GET /icecream/orders/{orderId}")
Maybe<IceCreamOrder> findOrder(@Param("orderId") int orderId);
@RequestLine("POST /icecream/bills/pay")
@Headers("Content-Type: application/json")
Single<Long> payBill(Bill bill);
Build the client :
/* Create instance of your API */
IcecreamServiceApi client = Rx2ReactiveFeign
.builder()
.target(IcecreamServiceApi.class, "http://www.icecreame.com")
/* Execute nonblocking requests */
Flowable<Flavor> flavors = icecreamApi.getAvailableFlavors();
Observable<Mixin> mixins = icecreamApi.getAvailableMixins();
Maven
<repositories>
<repository>
<id>bintray-kptfh-feign-reactive</id>
<name>bintray</name>
<url>https://dl.bintray.com/kptfh/feign-reactive</url>
</repository>
</repositories>
...
<dependencies>
...
<dependency>
<groupId>io.github.reactivefeign</groupId>
<artifactId>feign-reactor-cloud</artifactId>
<version>1.0.0</version>
</dependency>
or if you don't need cloud specific functionality
<dependency>
<groupId>io.github.reactivefeign</groupId>
<artifactId>feign-reactor-webclient</artifactId>
<version>1.0.0</version>
</dependency>
or if you tend to use Rx2 interfaces
<dependency>
<groupId>io.github.reactivefeign</groupId>
<artifactId>feign-reactor-rx2</artifactId>
<version>1.0.0</version>
</dependency>
...
</dependencies>
License
Library distributed under Apache License Version 2.0.