java时间提醒微服务器_springcloud中微服务的优雅停机(已验证)
大部分項(xiàng)目部署中,為了方便,可能都直接使用kill -9 服務(wù)的pid來停掉服務(wù)。
但是由于Eureka采用心跳的機(jī)制來上下線服務(wù),會(huì)導(dǎo)致服務(wù)消費(fèi)者調(diào)用此已經(jīng)kill的服務(wù)提供者然后出錯(cuò)。
可以采用以下方式來解決:
核心是先調(diào)用方法主動(dòng)通知Eureka注冊(cè)中心服務(wù)下線,然后再停掉服務(wù)。
本文會(huì)介紹幾種eureka 注冊(cè)中心服務(wù)下線的方式
最不可取的就是直接使用kill命令停掉服務(wù)。
默認(rèn)情況下,如果Eureka Server在90秒沒有收到Eureka客戶的續(xù)約,它會(huì)將實(shí)例從其注冊(cè)表中刪除。但這種做法的不好之處在于, 客戶端已經(jīng)停止了運(yùn)行,但仍然在注冊(cè)中心的列表中。 雖然通過一定的負(fù)載均衡策略或使用熔斷器可以讓服務(wù)正常進(jìn)行,但有沒有方法讓注冊(cè)中心馬上知道服務(wù)已經(jīng)下線呢?
1、直接關(guān)閉服務(wù)
kill -9 沒有善后
kill -15? 有善后 會(huì)發(fā)送down狀態(tài)到eureka server
kill java進(jìn)程【不建議】
這種方式簡單粗暴,直接造成的影響就是部分模塊調(diào)用時(shí)出錯(cuò),如果有多臺(tái)服務(wù)器的話,一臺(tái)一臺(tái)地重啟還是可以的,前提是調(diào)用端得有自己的重試策略,比如使用Feign作為客戶端調(diào)用接口的話可以配置ribbon的重試策略,而且被調(diào)用方得做好冪等策略,防止重試調(diào)用時(shí)出現(xiàn)重復(fù)數(shù)據(jù)的問題。
2、向eureka 注冊(cè)中心發(fā)送delete 請(qǐng)求,只是取消注冊(cè)服務(wù), 當(dāng)發(fā)送心跳時(shí)還是會(huì)注冊(cè)到eureka
格式為? ?eureka地址/eureka/apps/服務(wù)名稱/實(shí)例名稱
請(qǐng)求方式為delete
下面是取消注冊(cè)一個(gè)服務(wù)的例子。
下圖是用postman 發(fā)送delete請(qǐng)求
3.通過eureka變更服務(wù)狀態(tài)的方式實(shí)現(xiàn)服務(wù)上下線,不會(huì)再發(fā)送心跳注冊(cè)到eureka server
4. 客戶端主動(dòng)通知注冊(cè)中心下線,下線后不會(huì)再注冊(cè)到eureka了
如果你的eureka客戶端是是一個(gè)spring boot應(yīng)用,可以通過調(diào)用以下代碼通知注冊(cè)中心下線。
importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.RestController;importcom.netflix.discovery.DiscoveryManager;importcom.shm.common.model.RespVO;importcom.shm.common.util.RespUtil;
@RestControllerpublic classOfflineController {
@RequestMapping(value= "/offline", method =RequestMethod.GET)public RespVOoffLine(){
DiscoveryManager.getInstance().shutdownComponent();returnRespUtil.success();
}
}
5、設(shè)置服務(wù)的狀態(tài),可通過狀態(tài)變更來實(shí)現(xiàn)再eureka的上下線
pom中加入
actuator的包
org.springframework.boot
spring-boot-starter-actuator
以上的方式都能實(shí)現(xiàn)服務(wù)的下線,但是有的時(shí)候只想要下線某個(gè)服務(wù),卻不需要發(fā)布,等待事情處理完成后上線此服務(wù),則以上方式就做不到了。這時(shí)可以通過設(shè)置微服務(wù)的狀態(tài)來完成此功能。項(xiàng)目中整合了actuator的話就非常簡單了,在項(xiàng)目啟動(dòng)的時(shí)候可以看到控制臺(tái)的輸出:
/actuator/service-registry 可以已Get的方式獲取當(dāng)前服務(wù)的狀態(tài),以Post的方式修改當(dāng)前服務(wù)狀態(tài),如將服務(wù)設(shè)置為Down狀態(tài),這樣其他微服務(wù)接收到此狀態(tài)后將不調(diào)用此服務(wù)。將order服務(wù)狀態(tài)設(shè)置為Down:
看下執(zhí)行后的效果:
等到流量都沒有進(jìn)來后,需要發(fā)布的話直接發(fā)布接口,不需要發(fā)布可以直接上線當(dāng)前服務(wù):
這樣一個(gè)服務(wù)的上線和下線就優(yōu)雅的完成了,如果項(xiàng)目中沒有使用Actuator框架,可以模仿Actuator框架的實(shí)現(xiàn)方式,詳見類:ServiceRegistryEndpoint
如果要再上線:
總結(jié)
以上幾種方式都可以實(shí)現(xiàn)微服的下線,3和5的方式最為優(yōu)雅,可以主動(dòng)下線和上線,在沒有新流量進(jìn)來后可以隨時(shí)發(fā)布,這樣在也不用等到半夜12點(diǎn)發(fā)布了。
總結(jié)
以上是生活随笔為你收集整理的java时间提醒微服务器_springcloud中微服务的优雅停机(已验证)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装成功后python报错_python
- 下一篇: 计算机板报设计简单,计算机板报制作