起因
新項目用的是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());
};
}