请教个基础点的问题,gateway放在父项目中报错
来源:10-3 编写Spring Cloud Gateway

岁月中的程序猿
2019-09-05
父项目中,配置了mysql,sentinel,feign之类其他项目用的配置,新建一个gateway子项目时,就加了视频中的配置,然后项目启动时加载了Sentinel,druid的信息,然后报错比如required a bean of type ‘reactor.netty.http.client.HttpClient’ that could not be found. 或者database 配置之类的错误导致项目启动不成功,这是什么原因?
2回答
-
您的代码问题有点多。
先解释下
required a bean of type ‘reactor.netty.http.client.HttpClient’ that could not be found
异常造成的原因:
在这里:
rg.springframework.cloud.gateway.config.GatewayAutoConfiguration.NettyConfiguration#httpClient
有个判断:
@Bean @ConditionalOnMissingBean public HttpClient httpClient(HttpClientProperties properties)
意思是,如果当前Spring容器没有一个名为httpClient,才new一个HttpClient,但你的依赖里面有Feign:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
在:org.springframework.cloud.openfeign.FeignAutoConfiguration.HttpClientFeignConfiguration#httpClient里,有如下代码:
@Bean public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory, HttpClientConnectionManager httpClientConnectionManager, FeignHttpClientProperties httpClientProperties) {
也就是说,Feign会实例化一个类,也叫httpClient,于是Spring Cloud懵了,它不会去new Gateway那个HttpClient了。而Gateway需要的HttpClient是reactor.netty.http.client.HttpClient;并不是Feign这边的org.apache.http.impl.client.CloseableHttpClient。于是注入不成功。启动报错!
解决方案:对于Gateway项目,把下面两个依赖排除掉。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
-------------
但即使排除掉,你个Gateway依然会报其他问题。
建议:如果maven基础不是那么好,并且定位源码能力不是那么牛逼的话,不要在父项目加任何依赖。父pom一般只用来管理依赖版本,不会加通用依赖的。
你的玩法,我能理解意图,因为大部分微服务都需要用到 feign,用到sentinel,用到druid,所以干脆,在父项目统一加上,这样就不用每个微服务添加依赖了。
但问题是,如果随着项目的发展,你们有100个微服务了,你们想升级版本,你改了父pom,你敢保证所有微服务都能正常使用吗?实际项目中,升级可不一定是换个依赖版本的事情……
建议还是把父pom中的依赖全部去掉,下放到各个微服务上,由微服务自己管理。
10 -
大目
2019-09-05
没看懂您的问题 建议把代码托管到github 我可以看看
012019-09-05
相似问题