最近剛?cè)肟游⒎詹笫睿偸菚龅胶芏嗫樱粋€坑一個腳印跨琳,默默記下自点。
Problem 1:
其中一個微服務模塊,啟動脉让,本身沒有問題桂敛,postman測試接口也沒有問題功炮。同時在網(wǎng)關中配置了相關轉(zhuǎn)發(fā),例如:
#serviceId 就是微服務的名字术唬, 網(wǎng)關接收到 /ctrl/**的請求薪伏,就會轉(zhuǎn)發(fā)到這個微服務
zuul:
prefix: /zuulName
routes:
signal:
path: /ctrl/**
serviceId: eureka-client-t1
strip-prefix: false
gis:
path: /gis/**
serviceId: eureka-client-t2
strip-prefix: false
但是通過網(wǎng)關訪問就會出現(xiàn)問題,通過API網(wǎng)關路由來訪問微服務碴开,zuul默認路由規(guī)則 :http://zuul的Host地址:zuul端口/要調(diào)用的服務名/服務方法地址毅该,報錯:
com.netflix.zuul.exception.ZuulException: Forwarding error......
Caused by: com.netflix.client.ClientException: null......
Caused by: java.lang.RuntimeException: java.net.SocketTimeoutException: Read timed out
是因為接口調(diào)用的時間過長,超過了等待時長潦牛,于是配置一下時長眶掌,在網(wǎng)關模塊中application.yml配置
hystrix:
command:
default:
execution:
isolation:
thread:
timeout-in-milliseconds: 60000
以及
zuul:
host:
connect-timeout-millis: 70000 #http連接超時要比hystrix大
socket-timeout-millis: 60000
還有
ribbon:
ReadTimeout: 50000
ConnectTimeout: 50000
進行這樣的配置之后,可以通過API網(wǎng)關路由來訪問服務了巴碗,postman接口測試正常朴爬。
Problem 2:
微服務之間通訊的時候,由于配置了熔斷器橡淆,發(fā)現(xiàn)A服務中每次調(diào)用B的時候召噩,都會進入fallback,由此判斷調(diào)用過程出現(xiàn)了問題。
其實還是上面說到的時間問題逸爵,我將fallback去掉之后具滴,在controller 中try...catch捕獲到了錯誤,定位錯誤:spring cloud java.util.concurrent.TimeoutException
【此處記錄下师倔,不去掉fallback也能捕捉錯誤构韵,在client中try...catch就可以】
首先我嘗試了在A服務的application.yml中設置了熔斷器的檢測時間:(熔斷器檢測時間(默認1秒))
hystrix:
command:
default:
execution:
isolation:
thread:
timeout-in-milliseconds: 60000
但是并沒有效果, 后來就關閉熔斷器超時檢測時間功能趋艘,也就是不超時
ribbon:
ReadTimeout: 50000
ConnectTimeout: 50000
hystrix:
command:
default:
execution:
timeout:
enabled: false
OK疲恢,到此問題都解決了,微服務自身運行正常瓷胧,API網(wǎng)官訪問也正常显拳,微服務間通訊也正常