Eureka如何剔除已經宕機的節點


 

 

 

 同一個服務部署了多個實例,在通過網關調用時會隨機調用其中一個。但是,當某個服務掛掉之后,依然在注冊中心中,依然會隨機被調用到,調用時便會超時報錯。(主要是開發測試或者演示時需要立即將失效的從注冊中心剔除。)

則:1、需要在注冊中心,將eureka.server.eviction-interval-timer-in-ms改小,默認60秒,配置文件中單位是毫秒。

eureka:
  instance:
    hostname: localhost
    # 過期時間,默認90s, 可不配置
    lease-expiration-duration-in-seconds: 90
    # 續約時間,默認30s,可不配置
    lease-renewal-interval-in-seconds: 30
    # ip地址優先
    prefer-ip-address: true
  server:
    # 關閉注冊中心自我保護模式,避免注冊中心不移除失效的服務,默認為true
    enable-self-preservation: true
    # 去除失效服務的時間間隔(毫秒)
    eviction-interval-timer-in-ms: 4000
  client:
    # 啟用eureka客戶端,默認為true, 可不配置
    enabled: true
    # 取注冊信息,默認為true,可不配置
    fetchRegistry: false
    # 兩個心跳參數,默認都是30s,可不配置
    instance-info-replication-interval-seconds: 30
    registry-fetch-interval-seconds: 30
    # 注冊到注冊中心,默認為true,可不配置
    registerWithEureka: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

 

2、還需要在業務微服務中,將過期時間默認90秒和續約時間默認30秒改小。

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka
  instance:
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
    prefer-ip-address: true   #以IP地址注冊到服務中心
    ip-address: 192.168.217.211
    non-secure-port: 8767
    #Eureka客戶端向服務端發送心跳的時間間隔,單位為秒(客戶端告訴服務端自己會按照該規則),默認30
    lease-renewal-interval-in-seconds: 10
    #Eureka服務端在收到最后一次心跳之后等待的時間上限,單位為秒,超過則剔除(客戶端告訴服務端按照此規則等待自己),默認90
    lease-expiration-duration-in-seconds: 30

 

注意:更改Eureka更新頻率將打破服務器的自我保護功能

 

 

其他幾種主動下線服務的方式

1. 直接停掉服務。

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

 

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

格式為 /eureka/apps/{application.name}/

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

下圖是用postman 發送delete請求

 

值得注意的是,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();
    }   
}

 

 

文章轉載:https://blog.csdn.net/itwxming/article/details/91576288

文章轉載:https://blog.csdn.net/xiaobao5214/article/details/81263445

 


免責聲明!

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



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