spring cloud微服務不定期會出現網絡請求失敗的錯誤。於是看了下后台日志,發現有幾個請求會報如下的異常:
Caused by: feign.RetryableException: Connection refused (Connection refused) executing POST http://oauth/oauth/token****** at feign.FeignException.errorExecuting(FeignException.java:67) at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:104) at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76) at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:108) at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302) at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298) at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) ... 26 more
(調用流程是user
服務調用oauth
服務)
一開始很奇怪,為什么有的請求可以成功,有的不可以。因為服務編排用的是Docker Compose,所以第一反應是編排服務的時候,oauth
的hosts忘加了(后來才想起來請求用的是Feign,根本不需要管hosts,RestTemplate才需要,mdzz)。在docker-compose.yml
里加上以后,並沒有卵用。
然后到Consul上看了一下,oauth
服務確實是在線的。(不過后面的passing
數量不是2,是6,這里因為已經移除了失效的,所以只剩下2個)

不應該啊,Consul不應該把無效的服務注銷掉嗎?
這是因為:當在Spring Cloud應用中使用Consul來實現服務治理時,由於Consul不會自動將不可用的服務實例注銷掉(deregister),這使得在實際使用過程中,可能因為一些操作失誤、環境變更等原因讓Consul中存在一些無效實例信息,而這些實例在Consul中會長期存在,並處於斷開狀態。它們雖然不會影響到正常的服務消費過程,但是它們會干擾我們的監控,所以我們可以實現一個清理接口,在確認故障實例可以清理的時候進行調用來將這些無效信息清理掉。
在consul的官網上:https://www.consul.io/api/agent/service.html (果然遇到問題就應該先去找官方文檔啊!)
解決辦法:調用deregister接口

用PUT請求Consul 的這個deregister
接口,附上實例的id就可以成功注銷掉實例了(注意是實例的id,不是服務名,即服務名+一段唯一字符串。有ACL認證的Consul需要在Header上加token,否則會報permission denied)如下圖:

接着看到這個服務的實例數量……難道要一個一個請求嗎?

當然不是,配合下面這個實例列表接口,批量刪除吧!


