服务注册发现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個)
不應該啊,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,再刪除它。總結
以上是生活随笔為你收集整理的服务注册发现consul之五:Consul移除失效服务的正确姿势的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解压bzi2文件出错,分析和处理
- 下一篇: DataSourceUtils(使用C3