请教个基础点的问题,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回答

大目

2019-09-06

您的代码问题有点多。

先解释下

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中的依赖全部去掉,下放到各个微服务上,由微服务自己管理。

1
0

大目

2019-09-05

没看懂您的问题 建议把代码托管到github 我可以看看

0
1
岁月中的程序猿
谢谢老师了
2019-09-05
共1条回复

Spring Cloud Alibaba微服务从入门到进阶

面向未来微服务:熟练掌握Spring Cloud Alibaba

3085 学习 · 1324 问题

查看课程