[go: nahoru, domu]

Skip to content

kptfh/feign-reactive

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

feign-reactive

Build Status Download

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.

Usage

Write Feign API as usual, but every method of interface must return reactor.core.publisher.Mono or reactor.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(Bill bill);
}

Build the client :

/* Create instance of your API */
IcecreamServiceApi client = ReactiveFeign
    .builder()
    .webClient(WebClient.create())
    .encoder(new JacksonEncoder(TestUtils.MAPPER))
    .logger(new Slf4jLogger())
    .logLevel(Logger.Level.FULL)
    .target(IcecreamServiceApi.class, "http://www.icecreame.com")

/* Execute requests asynchronously */
Flux<Flavor> flavors = icecreamApi.getAvailableFlavors();
Flux<Mixin> mixins = icecreamApi.getAvailableMixins();

or cloud aware client :

 IcecreamServiceApi client = CloudReactiveFeign
    .builder()
    .webClient(WebClient.create())
    .encoder(new JacksonEncoder(new ObjectMapper()))
    //Ribbon load balancer
    .setLoadBalancerCommand(
            LoadBalancerCommand.builder()
                    .withLoadBalancer(AbstractLoadBalancer.class.cast(getNamedLoadBalancer(serviceName)))
                    .build()
    )
    .target(TestInterface.class, "http://"+serviceName);

/* Execute requests asynchronously */
Flux<Flavor> flavors = icecreamApi.getAvailableFlavors();
Flux<Mixin> mixins = icecreamApi.getAvailableMixins();

Maven

<repositories>
    <repository>
        <id>jcenter</id>
        <url>https://jcenter.bintray.com/</url>
    </repository>
</repositories>
...
<dependencies>
    ...
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-reactive</artifactId>
        <version>0.1.0</version>
    </dependency>
    ...
</dependencies>

License

Library distributed under Apache License Version 2.0.