gateway调用Fegin失败问题解决
阅读原文时间:2023年07月08日阅读:1

新项目用的是springcloud2.0,网关用gateway替换了zuul。

gateway动态路由跟zuul有本质上的区别。这就涉及到webflux这一套大东东了。简单来说,gateway是spring5.0b出来的,最新基于webflux,默认使用netty为底层容器的一套响应式,非阻塞的异步框架,这跟之前的zuul的同步阻塞,基于tomcat的框架是完全不同的,具体到细节,光编码就是完全不一样,是另一种的风格基于jdk8的Lambda和流那一套东东,还涉及到Flux 和 Mono。

这篇文章主要不是来讲webflux的,这边也只是简单讲一下。

原因是gateway这一块用fegin进行微服务之间的相互调用,发现是失败的。

网上百度一波,基本上都说修改feign的配置文件,注入Decode。结果发现不行,仅仅修改decode是完全不够的,还要修改encode。

具体如下:

/**
 * 手动调整feignConfig,以支持webflux下feign调用
 *
 * @auther: jrhua
 * @date: 2020/7/17 14:17
 */
@Configuration
public class FeignConfig {
    @Bean
    public Encoder feignEncoder() {
        return new SpringEncoder(feignHttpMessageConverter());
    }

    @Bean
    public Decoder feignDecoder() {
        return new OptionalDecoder(
                new ResponseEntityDecoder(new SpringDecoder(feignHttpMessageConverter())));
    }

    public ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {
        return () -> {
            return new HttpMessageConverters(new MappingJackson2HttpMessageConverter());
        };
    }