将@FeignClient用于reactor的接口

定义

@FeignClient(contextId = "test-feign", value = "mbiolance-service-message", path = "/test-feign",configuration = CommonFeignConfiguration.class)
public interface MessageTestFeignService {
    @GetMapping("/test")
    Mono<String> test();
}
@RestController
@RequiredArgsConstructor
@RequestMapping("/test-feign")
@Api(tags = "测试服务接口")
public class TestRestful implements MessageTestFeignService {

    @GetMapping("/test")
    @Override
    public Mono<String> test(){
        try {
            InetAddress localHost = InetAddress.getLocalHost();
            return Mono.just("message 连接测试成功:"+localHost);
        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        }
    }
}

调用

    @Autowired
    private MessageTestFeignService messageTestFeignService;

    @GetMapping("/test2")
    public String test2(){
        String block = messageTestFeignService.test().block();
        return block;
    }

问题

no suitable HttpMessageConverter found for response type

feign.codec.DecodeException: Could not extract response: no suitable HttpMessageConverter found for response type [reactor.core.publisher.Mono<java.lang.String>] and content type [text/html;charset=UTF-8]
	at feign.AsyncResponseHandler.decode(AsyncResponseHandler.java:119)
...
Caused by: org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [reactor.core.publisher.Mono<java.lang.String>] and content type [text/html;charset=UTF-8]
	at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:126)
....

应该如何调用reactor的接口

使用 Reactivate-Feign

     <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
            <version>2.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.playtika.reactivefeign</groupId>
            <artifactId>feign-reactor-cloud</artifactId>
            <version>2.0.31</version>
        </dependency>
        <dependency>
            <groupId>com.playtika.reactivefeign</groupId>
            <artifactId>feign-reactor-spring-configuration</artifactId>
            <version>2.0.31</version>
        </dependency>
        <dependency>
            <groupId>com.playtika.reactivefeign</groupId>
            <artifactId>feign-reactor-webclient</artifactId>
            <version>2.0.31</version>
        </dependency>
@ReactiveFeignClient(url = "http://mbiolance-service-message",name = "mbiolance-service-message-test",path = "/",configuration = ReactiveFeignConfiguration.class)
public interface MessageTestFeignService {
    @GetMapping("/test")
    Mono<String> test();
}

添加

@EnableReactiveFeignClients(basePackages = "com.mbiolance.cloud.message")

没有添加报下面错误

Field messageTestFeignService in com.bioproj.controller.TestController required a bean of type 'com.mbiolance.cloud.message.rpc.MessageTestFeignService' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)

接下来会报错如下

Caused by: reactivefeign.client.ReactiveFeignException: java.net.UnknownHostException: mbiolance-service-message: Temporary failure in name resolution
	at reactivefeign.webclient.client.WebReactiveHttpClient.lambda$executeRequest$3(WebReactiveHttpClient.java:101)
	at reactor.core.publisher.Mono.lambda$onErrorMap$30(Mono.java:3286)
	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:88)
	... 60 common frames omitted
Caused by: java.net.UnknownHostException: mbiolance-service-message: Temporary failure in name resolution
	at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
	|_ checkpoint ⇢ Request to GET http://mbiolance-service-message/test [DefaultWebClient]
Stack trace:

解决方案

@Configuration
public class WebClientConfig {
    @LoadBalanced
    @Bean
    public WebClient.Builder register() {
        return WebClient.builder();
    }
}