服務注冊發現consul之五:Consul移除失效服務的正確姿勢


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個)

然后就開始懷疑人生了,為什么服務在線卻訪問不到呢,用Eureka的時候才出現過這個問題,難道Consul也有?那我辛辛苦苦切換過來還有什么意義!然后我就盯着那個數字6看,產生了一個疑問:哪里來的6個oauth實例?這個時候才想到,可能是Feign負載均衡拿到了“假”的oauth實例,所以才請求失敗。點開Consul的Node列表看了一下,發現有6個oauth躺在那里,然而只有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)如下圖:

 

示例:put方式訪問http://1XX.XX.xx.250:8500/v1/agent/service/deregister/trade-1xx-xx-206-101-18090

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

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

示例:查看list service如下:http://1XX.XX.XX.250:8500/v1/agent/services
上面是列出所有的service。
 
可以用下面的
http://172.29.206.250:8500/v1/health/state/critical,返回的json中都是失敗的service,再刪除它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM