1、問題
在一次項目架構中,使用SpringCloud
微服務架構,其中將Alibaba-Cloud
配置SpringCloud
組件使用,服務發現和配置中心使用的是阿里巴巴開源的組件nacos
,nacos-server
部署在linux
下的centos7.0
環境上,每一個服務啓動時都會去鏈接nacos-server
端,在nacos-server
部署在Linux
環境下時,因爲網絡波動等緣由,框架bug
就產生了,Windows
下無此問題,部署在Linux
下,客戶端鏈接配置中心時會報以下錯誤,錯誤日誌以下:html
2020-04-14 09:51:15.874 ERROR [jiuyv-gateway,,,] 15364 --- [252.80.198_8848] c.a.n.c.config.http.ServerHttpAgent : [NACOS SocketTimeoutException httpPost] currentServerAddr: http://130.252.80.198:8848, err : Read timed out 2020-04-14 09:51:15.874 ERROR [jiuyv-gateway,,,] 15364 --- [252.80.198_8848] c.a.n.c.config.http.ServerHttpAgent : no available server, currentServerAddr : http://130.252.80.198:8848 2020-04-14 09:51:16.049 ERROR [jiuyv-gateway,,,] 15364 --- [252.80.198_8848] c.a.n.client.config.impl.ClientWorker : [fixed-130.252.80.198_8848] [check-update] get changed dataId exception java.net.ConnectException: no available server, currentServerAddr : http://130.252.80.198:8848 at com.alibaba.nacos.client.config.http.ServerHttpAgent.httpPost(ServerHttpAgent.java:170) ~[nacos-client-1.1.4.jar:na] at com.alibaba.nacos.client.config.http.MetricsHttpAgent.httpPost(MetricsHttpAgent.java:64) ~[nacos-client-1.1.4.jar:na] at com.alibaba.nacos.client.config.impl.ClientWorker.checkUpdateConfigStr(ClientWorker.java:377) [nacos-client-1.1.4.jar:na] at com.alibaba.nacos.client.config.impl.ClientWorker.checkUpdateDataIds(ClientWorker.java:352) [nacos-client-1.1.4.jar:na] at com.alibaba.nacos.client.config.impl.ClientWorker$LongPollingRunnable.run(ClientWorker.java:512) [nacos-client-1.1.4.jar:na] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_25] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_25] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_25] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_25] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_25] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_25] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25] 2020-04-14 09:51:16.052 ERROR [jiuyv-gateway,,,] 15364 --- [252.80.198_8848] c.a.n.client.config.impl.ClientWorker : longPolling error : java.net.ConnectException: no available server, currentServerAddr : http://130.252.80.198:8848 at com.alibaba.nacos.client.config.http.ServerHttpAgent.httpPost(ServerHttpAgent.java:170) ~[nacos-client-1.1.4.jar:na] at com.alibaba.nacos.client.config.http.MetricsHttpAgent.httpPost(MetricsHttpAgent.java:64) ~[nacos-client-1.1.4.jar:na] at com.alibaba.nacos.client.config.impl.ClientWorker.checkUpdateConfigStr(ClientWorker.java:377) ~[nacos-client-1.1.4.jar:na] at com.alibaba.nacos.client.config.impl.ClientWorker.checkUpdateDataIds(ClientWorker.java:352) ~[nacos-client-1.1.4.jar:na] at com.alibaba.nacos.client.config.impl.ClientWorker$LongPollingRunnable.run(ClientWorker.java:512) ~[nacos-client-1.1.4.jar:na] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_25] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_25] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_25] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_25] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_25] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_25] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25]
控制檯截圖以下:
java
2、緣由
緣由是因爲在遠程服務器上的配置,網絡有些延遲,二nacos
框架中將超時時間設置得特別短,在段時間內就一直報超時異常,雖然不影響使用,可是問題仍是很明顯,框架存在bug
,若是將一樣的配置放在本地nacos
配置中心上啓動,則沒有碰見該問題。linux
3、解決方式
1. 查源碼,提Issue
在得出這個異常是框架的bug
以後,查找nacos
源碼,查看Issue
: https://github.com/alibaba/nacos/issues/2206 ,看看是否有相似的問題,在GitHub
上查到了這種超時問題,可是沒有明確解決方式,只是說在將來的1.2.0
版本以後會解決掉,並且有部分人nacos
的client
和server
端都升級1.2.0
版本,依然有此問題,因而我提了個Issue
,官方GitHub
上的回答以下:git
Issue: https://github.com/alibaba/nacos/issues/2206
github
2. 解決方式: pom加入nacos-client端依賴
<!-- Alibaba-nacos服務發現--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- Alibaba-nacos配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.2.0</version> </dependency>
3. 我使用的版本
- Spring Boot Version: 2.1.6.RELEASE
- Spring Cloud Version: Spring Cloud Greenwich
- Spring Cloud Alibaba Version: 2.1.1.RELEASE
- Nacos Version: 1.1.4
- Java Version: 1.8
經過以上將nacos
集成到微服務項目中做爲服務註冊與發現和配置中心的實踐,仍是有點小bug
,相信在後續更新中,nacos
框架會更加完善,到時候咱們再體驗他更加具備體驗性的功能吧。spring
若是有問題,請評論聯繫,我很願意探討。centos