Spring Cloud GateWay 引入 Feign Reactive 踩坑记录

问题1: 项目启动报错:Invalid value type for attribute 'factoryBeanObjectType': java.lang.String

问题2: Bean冲突

起因

Spring Gateway 模型为WebFlux ,使用的是Netty 容器,属于异步非阻塞模型

OpenFeign 所使用的是于同步阻塞模型

因而二者存在模型不兼容 ,存在线程饥饿现象

引入Reactive-Feign来解决模型问题

官方对于响应式模型说明: Spring Cloud OpenFeign文档

其中1.19 明确指示当前版本的OpenFeign不支持响应式,鼓励用户使用第三方社区的增强版Feign-Reactive

简介: Feign Reactive 是一种基于响应式编程的远程服务调用框架,是 Spring Cloud 项目中的一部分。它提供了一种声明式的、基于注解的方式来定义和实现远程服务接口,同时支持响应式编程模型。 与传统的 Feign 不同,Feign Reactive 对响应式编程的支持使得它更适合于处理异步和流式的数据。它与 Spring WebFlux 集成,支持使用 Reactor、RxJava 等响应式库进行开发。

1.项目pom中引入

xml 复制代码
<!-- https://mvnrepository.com/artifact/com.playtika.reactivefeign/feign-reactor-spring-cloud-starter -->
<dependency>
    <groupId>com.playtika.reactivefeign</groupId>
    <artifactId>feign-reactor-spring-cloud-starter</artifactId>
    <version>4.0.3</version>
    <type>pom</type>
</dependency>

2.启动项开启响应式Feign

添加注解@EnableReactiveFeignClients

3.随意编写一个测试用的Client

通过注解@ReactiveFeignClient开启

此时启动项目就会出现

问题1 : 项目启动报错:Invalid value type for attribute 'factoryBeanObjectType': java.lang.String需要提供该Bean返回的类型,显然该Bean返回的并不是一个String,故而报错

进而导致报以下错,致使整个项目无法启动 org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration.propertySourcesPlaceholderConfigurer

原因分析: 错误在源码中,无法通过常规方式修复

1. 在org.springframework.beans.factory.support包下的FactoryBeanRegistrySupport类中getTypeForFactoryBeanFromAttributes方法中明确指示factoryBeanObjectType为String而不是一个类

2. 在reactivefeign.spring.config包的ReactiveFeignClientsRegistrar类的registerReactiveFeignClient方法中的beanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, className);这一行代码中明确指示了一个K-V 关系 FactoryBean.OBJECT_TYPE_ATTRIBUTE : className

启动的时候报错: attribute不能为String,在这段KV关系中,Feign-Reactive清楚地 将attreibute 对应的value设置为了一个String类型。

解决方案(需要改动源代码,先说解决方案,再讲怎么改源码)

综上:需要放入一个Clazz而非String,所以只要把className对应的Class 拿出来替代className就好了

再次启动发现不再报该错误,但是紧接着 问题2: Bean冲突 出现了

txt 复制代码
Parameter 1 of method reactiveFeignContract in reactivefeign.spring.config.ReactiveFeignClientsConfiguration required a single bean, but 2 were found:
	- feignConversionService: a programmatically registered singleton
	- webFluxConversionService: defined by method 'webFluxConversionService' in class path resource [org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration$EnableWebFluxConfiguration.class]

由错误信息可知,在feignConversionService和webFluxConversionService这两个Bean中,返回的都是同样对象类型 只需要在其中一个Bean中添加@Primary即可解决,推荐在feignConversionService中添加。因为feignConversionService和问题1所在的类为同一个

自此重新启动项目即可恢复正常

疑惑1: 问题怎么发现的

经历了问ChatGpt,翻遍CSDN和掘金以及博客园,全部无果 。我去GitHub翻了Issue看到的解答。国内完全没有相关资料,更没有人记录。

GitHub Issue 解答

疑惑2: 怎么修改源码 根据疑惑1的大佬解惑,方式是: 打patch补丁。但是比较麻烦,所以我用了一个更麻烦的笨方法,但是可能简单一点?

第一步. 下载官方的源码 github.com/PlaytikaOSS...

第二步. 用IDE打开官方项目

第三步. 修改相关代码

第四步. 修改结束后install到本地仓库,上述的修改都在模块feign-reactor-spring-configuration 里,只需要install这个模块就好了

注: 官方GitHub仓库地址 github.com/PlaytikaOSS...

至此已经结束

后话

1.由于GitHub被墙,下载慢,我直接使用Gitee将其整个项目拉取。如果不想根据疑惑2 的方式修改,直接访问我的Gitee gitee.com/jaluson/fei... 拉取项目,然后执行第四步就好.

2.此短文目的: 由于相关问题没有明确的解答,故而在此,仅作为自己的学习记录,方便自己后续温习。

相关推荐
特立独行的猫A6 小时前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python
码事漫谈9 小时前
我花了一周时间,看AI公司怎么"管"AI,结果越看越后背发凉
后端
爱学习的程序媛12 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
GISer_Jing12 小时前
Agent核心内容
后端·ai·langchain
budingxiaomoli13 小时前
Spring统一功能处理
java·后端·spring
某鹏14 小时前
网关选型:Go、Java、Graal 谁都不能完胜
后端
用户02478365309714 小时前
从屎山到防线:14 行状态迁移表,给任务系统装上防瞎跳闸门
后端
CQU_JIAKE14 小时前
11.13[体系结构】指标,五级流水线,八级流水线,虚实地址思考
后端
panbook16 小时前
从0到1实现一个分布式时序数据库(三):主从复制、故障检测与切换
后端
上线再说16 小时前
图片从 8.2MB 压到 296KB:我把小程序图片链路的账单拆了一遍
后端