Eureka開發快速剔除失效服務


同一個服務部署了多個實例,在通過網關調用時會隨機調用其中一個。但是,當某個服務掛掉之后,依然在注冊中心中,依然會隨機被調用到,調用時便會超時報錯,為了快速的剔除掉掛掉的服務,於是有下面幾種主動下線的方法:


1.直接停掉服務

默認情況下,如果Eureka Server在90秒沒有收到Eureka客戶的續約,它會將實例從其注冊表中刪除。但這種做法的不好之處在於, 客戶端已經停止了運行,但仍然在注冊中心的列表中。 雖然通過一定的負載均衡策略或使用熔斷器可以讓服務正常進行,但有沒有方法讓注冊中心馬上知道服務已經下線呢?


2.為了讓注冊中心馬上知道服務要下線, 可以向eureka 注冊中心發送delete請求

格式為 http:{ip:port}/eureka/apps/{application.name}/{在eureka上注冊成功的實例ID}

下面是下線一個hello-service的例子。

img

用curl 發送delete 請求:

curl -X DELETE http://localhost:1111/eureka/apps/HELLO-SERVICE/localhost:hello-service:8080

或者用postman 發送delete請求

img

值得注意的是,Eureka客戶端每隔一段時間(默認30秒)會發送一次心跳到注冊中心續約。如果通過這種方式下線了一個服務,而沒有及時停掉的話,該服務很快又會回到服務列表中。

所以,可以先停掉服務,再發送請求將其從列表中移除。


3.客戶端主動通知注冊中心下線

如果你的eureka客戶端是是一個spring boot應用,可以通過調用以下代碼通知注冊中心下線。

DiscoveryManager.getInstance().shutdownComponent();

例子如下,

@RestController
public class HelloController {
    @Autowired
    private DiscoveryClient client;
 
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String index() {
        java.util.List<ServiceInstance> instances = client.getInstances("hello-service");       
        return "Hello World";
    }
    
    @RequestMapping(value = "/offline", method = RequestMethod.GET)
    public void offLine(){
        DiscoveryManager.getInstance().shutdownComponent();
    }   
}


免責聲明!

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



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