All Downloads are FREE. Search and download functionalities are using the official Maven repository.

reactivefeign.cloud2.publisher.LoadBalancerPublisherClient Maven / Gradle / Ivy

package reactivefeign.cloud2.publisher;

import org.reactivestreams.Publisher;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer;
import reactivefeign.client.ReactiveHttpRequest;
import reactivefeign.publisher.PublisherHttpClient;
import reactor.core.publisher.Flux;

import java.net.URI;

import static org.springframework.cloud.client.loadbalancer.LoadBalancerUriTools.reconstructURI;

/**
 * @author Sergii Karpenko
 */
public class LoadBalancerPublisherClient implements PublisherHttpClient {

    private final ReactiveLoadBalancer reactiveLoadBalancer;
    private final PublisherHttpClient publisherClient;

    public LoadBalancerPublisherClient(ReactiveLoadBalancer reactiveLoadBalancer,
                                       PublisherHttpClient publisherClient) {
        this.reactiveLoadBalancer = reactiveLoadBalancer;
        this.publisherClient = publisherClient;
    }

    @Override
    public Publisher executeRequest(ReactiveHttpRequest request) {
        return Flux.from(reactiveLoadBalancer.choose())
                .flatMap(serviceInstanceResponse -> {
                    URI lbUrl = reconstructURI(serviceInstanceResponse.getServer(), request.uri());
                    ReactiveHttpRequest lbRequest = new ReactiveHttpRequest(request, lbUrl);
                    return publisherClient.executeRequest(lbRequest);
                });
    }
}