日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

my.ini修改后服务无法启动_Spring Cloud Eureka 服务实现不停机(Zero-downtime)部署

發布時間:2023/12/3 javascript 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 my.ini修改后服务无法启动_Spring Cloud Eureka 服务实现不停机(Zero-downtime)部署 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題

互聯網產品高速迭代,通常伴隨著高頻次的版本發布。部署新版上線需要重啟服務,直接 kill 服務進程可能會造成服務短暫不可用,從而影響到正在使用的用戶。

Spring Cloud 項目中一般會用到 Ribbon 作為負載均衡,那么是不是只要保證每個服務部署多臺服務器,發布時采用 Rolling Update 分批次部署,保證一部分服務器正常提供服務的同時發布另一部分服務器,Ribbon 就能自動切換,保證服務的不間斷?然而并不是。

產生原因

所有服務的狀態保存在注冊中心,即 Eureka Server。一個服務要想獲取其他服務的實例列表和狀態,需要通過 Eureka Client 定時從 Eureka Server 中獲取并緩存下來,默認時間間隔是30秒。Eureka Client 和 Eureka Server 是通過 HTTP 協議通信,請求由 Eureka Client 發起,而不是基于長連接或者 Eureka Server 主動推送,所以無法立即知道其他服務狀態變更。

即使同一個服務部署多臺機器,每臺機器依次發布,當其中一個服務實例重啟時,服務調用方是無法第一時間知道的,所以還是會調用到這臺暫時無法提供服務的實例上。這樣會造成短暫的訪問失敗,這段時間也會對正在使用產品的用戶造成一定的影響。

解決方案

基于以上的原因,在部署應用時應該按照以下步驟進行(為了簡單起見,假設一個應用部署兩個實例):

  • 將服務的一個實例在注冊中心的狀態設置為 DOWN
  • 等待一段時間,直到其他服務緩存刷新,不再調用到這臺服務器上
  • 停止服務,更新代碼,重新啟動,等待,直到啟動成功
  • 完成后,再重復以上步驟部署另一個實例。

    第一步:修改服務實例狀態為 DOWN

    有兩種方案可以修改實例的狀態,選擇其一即可:

  • 直接調用 Eureka Server API 修改:PUT /eureka/apps/{appID}/{instanceID}/status?value=DOWN
  • 調用服務實例對應的 actuator endpoint:/service-registry
  • 我更偏向使用方法二,對應的命令:

    curl -H "Content-Type:application/json" -X POST http://{host:port}/actuator/service-registry?status=DOWN

    如果 actuator endpoint 加了 Spring Security Basic 認證,則還需要加上用戶名和密碼:

    curl -H "Content-Type:application/json" -X POST -u {username}:{password} http://{host:port}/actuator/service-registry?status=DOWN

    第二步:等待其他服務緩存刷新

    具體要等多久,其他調用者的請求才會不再訪問到這臺狀態為 DOWN 的實例?這里涉及到三個配置項:

    • eureka.client.registryFetchIntervalSeconds Eureka 客戶端每隔多久去 Eureka 服務器拉取最新的注冊信息,默認值 30(秒)。
    • ribbon.ServerListRefreshInterval Ribbon 的緩存刷新間隔時間,默認 30000(毫秒)。Eureka 客戶端拉取到最新注冊信息后,Ribbon、Feign 等組件不會立即生效,是因為 Ribbon 還有一層緩存。
    • eureka.server.responseCacheUpdateIntervalMs Eureka Server 返回最新的注冊信息的接口緩存刷新時間間隔,默認 30000(毫秒)。有時候會看到 Eureka 頁面和 /eureka/apps 接口的服務狀態不一致,就是因為 /eureka/apps 接口默認會有 30 秒緩存。

    在默認情況下,當一個服務狀態改為 DOWN,最長可能需要 30+30+30 秒,所有的緩存才會刷新,其他調用者才不會調用到這個狀態為 DOWN 的實例。這就意味著修改服務實例狀態為 DOWN 后需要等待 90 秒,才能進行下一步操作。

    為了讓部署時間縮短,可以將以上三個配置項都修改為5秒:

    Eureka Server:

    eureka:server:responseCacheUpdateIntervalMs: 5000

    Eureka Client(即各個服務):

    ribbon:ServerListRefreshInterval: 5000 eureka:client:registryFetchIntervalSeconds: 5

    完成以上配置,部署時將實例狀態設為 DOWN 后,只需要等待 15 秒即可停止進程:

    sleep 15s

    第三步:實例部署

    這一步主要需要注意

    • 盡量不要使用 kill -9 pid 強制殺掉進程,而應該使用 kill pid 或者 kill -15 pid 關閉進程。使用 kill pid 或者 kill -15 pid 關閉進程之前,Eureka Client 會給 Eureka Server 請求刪除自己,后續服務再次啟動后會重新注冊為 UP 狀態。如果使用 kill -9 pid 強制殺掉進程,Eureka Client 沒有辦法注銷自己,Eureka Server 就不知道該實例已下線,直到長時間收不到心跳才會刪除該實例。如果在 Eureka Server 刪除實例之前實例啟動了,那么它的狀態還是會保持 DOWN 狀態。如果確實需要用到 kill -9 pid 強制殺掉進程,那么服務重啟后需要再通過第一步的方式將實例狀態設為 UP。
    • 服務啟動后,需要等待并確認啟動成功后,才可以開始部署下一臺服務器。這里我們可以定時去請求 Spring Boot 提供的 actuator endpoint /health 接口,例如每隔 1 秒請求一次,直到接口可以正常訪問,即可認為服務啟動成功。

    本文基于 Spring Boot 2.1.x 及 Spring Cloud Greenwich 版本

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的my.ini修改后服务无法启动_Spring Cloud Eureka 服务实现不停机(Zero-downtime)部署的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。