spring cloud 升级config-client及部署问题

接昨天,升级微服务到config-client又遇到一些问题,花了大半天的时间。其实,不该花这么久的,所以还是踩坑了。。

直接说问题吧。

rabbitmq连接报错

主要有几个报错,原因应该都是未连接上rabbitmq导致的

org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection timed out: connect...
org.springframework.amqp.AmqpTimeoutException: java.util.concurrent.TimeoutException...
 org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: connect

总结了一下,未连接成功的原因大概有几点:首先spring.rabbitmq.host有问题,其次port有问题,当让帐密问题就不讨论了。
先说host,固定是5672,我的问题就是出在端口问题上,但不是写错端口,一会详述。
其次是host,这个有可能是localhost忘记改成对应ip了。

我的问题是:首先ip没问题,端口号没问题,那问题出在哪了呢?
问题出在,我的容器端口暴露上,因为我在之前的文章已经更新了我的rabbitmq容器,这样就可以不用频繁改动ip地址,直接使用宿主机ip即可,不过后来我在排查的时候发现,容器的5672端口没有映射到宿主机的5672端口上,我之前没有配!!!
然后映射上,使用宿主机ip和端口号就可以正确访问了。

找不到config-server

报错是这样的:

Could not locate PropertySource: I/O error on GET request for "http://localhost:8888/message/dev/master": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)

这个地方的问题其实很明显,但是当时我没有认真研究报错,而是直接搜索问题了,现在回想一下,如果我认真研究这个报错信息,我可能会少花一点时间。当然也有可能多花时间,研究不出来。。。哈哈哈哈

这个报错意思很明显,就是和config-server无法建立连接,我们可以看到8888这个默认端口。
主要原因就是localhost,可以参考这篇这篇
然后我看了一下,确实是这个问题,在config-client服务启动的时候,首先就会从默认的http://localhost:8888/去找config-server。即便后面的配置正确,你也可以在服务启动的时候看到这条警告信息。
问题的根源所在就是:
这里写图片描述
不知道为什么我的discovery标签并不是从eureka的注册表上找对应的config-server,而是直接请求http://localhost:8888/,所以就会导致连接不上config-server。
解决办法:使用uri标签。直接指定ip和端口号。(使用容器的时候一定要注意端口映射的问题,否则很容易连接不上。)

完事了吗?
没有

一个可以忽略的报错

ERROR com.netflix.discovery.DiscoveryClient:1015 [main] [makeRemoteCall] Can't get a response from http://localhost:8080/eureka/v2/apps/
com.sun.jersey.api.client.ClientHandlerException: java.net.SocketTimeoutException: Read timed out

这个就是服务注册的时候报的错,等一会就好了,可以忽略掉。参考

和另一个可以忽略的报错

java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@7dd3a361 rejected from java.util.concurrent.ThreadPoolExecutor@79ec2803[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 2]

报错线程池问题,好像很恐怖欸!
但是是个bug,可以忽略,不对项目造成影响。
参考博客

last but very important!

bootstrap.yml配置会被application.yml覆盖!
这个bootstrap.yml先于application.yml加载,很多人说bootstrap.yml不会被覆盖,但是在我的实践中,如果bootstrap.ymlapplication.yml拥有相同配置,并且指定了active标签属性的话,bootstrap.yml的内容是不生效的。或许最终原因是active标签导致的。这里没有细究,而是把bootstrap.yml删除了,统一使用application.yml
而client项目中需要两个配置文件,一个是application.yml,其中配置的是server.port;另一个是bootstrap.yml,其中配置的是与config-server建立连接的配置,形如
这里写图片描述
这是因为spring boot启动加载顺序,首先加载bootstrap(如果存在),然后加载application,而boostrap用于应用程序上下文的引导阶段,通常用于引导上下文从外部资源获取配置属性,比如Spring Cloud Config Server,或者 解密外部配置文件的属性等。 默认的Config Server地址是http://localhost:8888/. 所以我们只能在bootstrap.yml或者bootstrap.properties中修改。
如果bootstrap中的属性在application中也存在,那么bootstrap会被覆盖!

猜你喜欢

转载自blog.csdn.net/ybt_c_index/article/details/79914966