springcloud中微服務的優雅停機

大部分項目部署中,爲了方便,可能都直接使用kill -9 服務的pid來停掉服務。
但是由於Eureka採用心跳的機制來上下線服務,會導致服務消費者調用此已經kill的服務提供者然後出錯。
可以採用以下方式來解決:
核心是先調用方法主動通知Eureka註冊中心服務下線,然後再停掉服務。

本文會介紹幾種eureka 註冊中心服務下線的方式

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

1、通過/offline請求來實現服務下線
在啓動eureka服務的時候發現控制檯有以下的輸出
在這裏插入圖片描述

由此猜想可以通過改接口下線服務, 於是嘗試了一下
在這裏插入圖片描述

果然能從註冊中心中移除該實例
在這裏插入圖片描述

2.向eureka 註冊中心發送delete 請求

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

下面是下線一個hello-service的例子。
在這裏插入圖片描述

下圖是用postman 發送delete請求

在這裏插入圖片描述

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();
    }   
}

4、在服務器上用curl發送post請求到pause.

curl -X POST http://localhost:8080/pause
此時eurake上該服務被標記問下線,但該服務其實還是可以正常訪問的,當client還未及時更新本地Instances緩存時,依然不會中斷服務。當所有client都感知到該服務DOWN後就不會再往該服務發請求了。

5、通過actuator 監控組件來實現優雅停機*
(1)、在微服務pom.xml文件中,配置spring-boot-starter-actuator 監控組件

org.springframework.boot spring-boot-starter-actuator

(2)、application.yml配置

#管理端點

management: 
#  endpoints:
#    web:
#      base-path: /actuator  #默認爲 /actuator
  endpoints: 
    web:
      exposure:
        include:
        - shutdown
        - info
        - health
  endpoint:
    shutdown:
      enabled: true

#配置management的自定義端口,可以與server.port不同,
#management.server.port: 8081
#management.server.address: 127.0.0.1 # management只能在本機訪問

(3)、在任意一臺服務器上利用curl發送shutdown命令

curl -X POST http://ip:端口/actuator/shutdown

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

以上就是針對spring cloud微服務優雅下線的方法的總結,個人最推薦通過actuator 監控組件來實現。
其他方式有待驗證。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章