springCloud+consul優(yōu)雅停機(jī)
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
? 作者?|? duanxz
來(lái)源 |? urlify.cn/Ij2IBj
76套java從入門(mén)到精通實(shí)戰(zhàn)課程分享
之前的方案:先調(diào)用待更新的模塊的shutdown的Endpoint,這是springboot的功能實(shí)現(xiàn),consul上可見(jiàn)服務(wù)確實(shí)下線了,再kill掉進(jìn)程。但是還會(huì)有一些請(qǐng)求被轉(zhuǎn)發(fā)到該節(jié)點(diǎn)上,導(dǎo)致少量的錯(cuò)誤。
總結(jié)的幾種:
1、直接kill方式關(guān)閉服務(wù)進(jìn)程
2、向注冊(cè)中心發(fā)送取消注冊(cè)命令
3、發(fā)指令給注冊(cè)中心,改變指定微服務(wù)的服務(wù)狀態(tài)
4、客戶端主動(dòng)通知注冊(cè)中心下線
5、設(shè)置指定模塊的服務(wù)的狀態(tài),可通過(guò)狀態(tài)變更來(lái)實(shí)現(xiàn)再eureka的上下線
?
1、直接kill方式關(guān)閉服務(wù)進(jìn)程
kill -9 沒(méi)有善后
kill -15? 有善后 會(huì)發(fā)送down狀態(tài)到eureka server
kill java進(jìn)程【不建議】
這種方式簡(jiǎ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ù)的問(wèn)題。
?
2、向注冊(cè)中心發(fā)送取消注冊(cè)命令
2.1、eureka
向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)求

?
2.2、consul
PUT 請(qǐng)求
http://10.200.110.100:8500/v1/agent/service/deregister/tag-10-200-110-100-8778
參考《consul之:常用API接口》
3、發(fā)指令給注冊(cè)中心,改變指定微服務(wù)的服務(wù)狀態(tài)
3.1、eureka
通過(guò)eureka變更服務(wù)狀態(tài)的方式實(shí)現(xiàn)服務(wù)上下線,不會(huì)再發(fā)送心跳注冊(cè)到eureka server

?
?3.2、consul
PUT方式:http://10.200.110.100:8500/v1/agent/service/maintenance/tag-10-200-110-100-8778?enable=true&reason=sprint40
參考《consul之:常用API接口》
執(zhí)行完成后,consul的控制臺(tái)如下:
觀察/tag-10-200-110-100-8778的實(shí)時(shí)日志,看新請(qǐng)求進(jìn)來(lái)后,再停機(jī)
?
4、客戶端主動(dòng)通知注冊(cè)中心下線
4.1、eureka
客戶端主動(dòng)通知注冊(cè)中心下線,下線后不會(huì)再注冊(cè)到eureka了
如果你的eureka客戶端是是一個(gè)spring boot應(yīng)用,可以通過(guò)調(diào)用以下代碼通知注冊(cè)中心下線。
import?org.springframework.web.bind.annotation.RequestMapping;
import?org.springframework.web.bind.annotation.RequestMethod;
import?org.springframework.web.bind.annotation.RestController;
import?com.netflix.discovery.DiscoveryManager;
import?com.shm.common.model.RespVO;
import?com.shm.common.util.RespUtil;
@RestController
public?class?OfflineController?{
????@RequestMapping(value?=?"/offline",?method?=?RequestMethod.GET)
????public?RespVO4.2、consul
?
5、設(shè)置指定模塊的服務(wù)的狀態(tài),可通過(guò)狀態(tài)變更來(lái)實(shí)現(xiàn)再eureka的上下線
5.1、eureka
設(shè)置服務(wù)的狀態(tài),可通過(guò)狀態(tài)變更來(lái)實(shí)現(xiàn)再eureka的上下線
pom中加入
actuator的包
???????
??????????org.springframework.boot
??????????spring-boot-starter-actuator
????????
以上的方式都能實(shí)現(xiàn)服務(wù)的下線,但是有的時(shí)候只想要下線某個(gè)服務(wù),卻不需要發(fā)布,等待事情處理完成后上線此服務(wù),則以上方式就做不到了。這時(shí)可以通過(guò)設(shè)置微服務(wù)的狀態(tài)來(lái)完成此功能。項(xiàng)目中整合了actuator的話就非常簡(jiǎn)單了,在項(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í)行后的效果:

等到流量都沒(méi)有進(jìn)來(lái)后,需要發(fā)布的話直接發(fā)布接口,不需要發(fā)布可以直接上線當(dāng)前服務(wù):
這樣一個(gè)服務(wù)的上線和下線就優(yōu)雅的完成了,如果項(xiàng)目中沒(méi)有使用Actuator框架,可以模仿Actuator框架的實(shí)現(xiàn)方式,詳見(jiàn)類:ServiceRegistryEndpoint
如果要再上線:

5.2、consul
shutdown
springboot1.5版本
首先配置:
endpoints.shutdown.enabled:?true
#endpoint.shutdown.enabled:?true
endpoint.shutdown.sensitive:?false
management.endpoints.web.exposure.include:?"shutdown"
或
management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdown
總結(jié)
以上幾種方式都可以實(shí)現(xiàn)微服的下線,3和5的方式最為優(yōu)雅,可以主動(dòng)下線和上線,在沒(méi)有新流量進(jìn)來(lái)后可以隨時(shí)發(fā)布,這樣在也不用等到半夜12點(diǎn)發(fā)布了。?
?
參考:
https://www.cnblogs.com/shihaiming/p/11408684.html
https://www.cnblogs.com/ql211lin/p/10854967.html
https://blog.csdn.net/linxingliang/article/details/106645443
粉絲福利:Java從入門(mén)到入土學(xué)習(xí)路線圖
??????

??長(zhǎng)按上方微信二維碼?2 秒
感謝點(diǎn)贊支持下哈?
