微服務(wù)的目標(biāo)就是為了能夠快速響應(yīng)產(chǎn)品迭代聂渊、快速發(fā)布運(yùn)用而生的。所以微服務(wù)的部署頻次會變得很高遏匆,那么如何快速的完成部署呢叁征?
持續(xù)集成選擇
- jenkins: 目前最常用的ci非jenkins莫屬了,jenkins功能強(qiáng)大吱涉,插件眾多刹泄,社區(qū)和用戶也十分活躍外里,代碼也是完全開源的,對于大規(guī)模微服務(wù)部署是一個(gè)不錯(cuò)的選擇特石。
- teamcity: 是jetbrain公司出品的ci盅蝗,部署簡單,使用方便姆蘸,但是是收費(fèi)的墩莫,免費(fèi)使用只能配置100個(gè)微服務(wù),由于我們現(xiàn)在微服務(wù)的規(guī)模只有80左右逞敷,所以選擇了配置簡單的teamcity
環(huán)境準(zhǔn)備
- 在CentOS 7上每個(gè)機(jī)器都創(chuàng)建統(tǒng)一的service模版文件狂秦,然后通過ci傳入不同的微服務(wù)名稱和相關(guān)啟動(dòng)參數(shù),來創(chuàng)建微服務(wù)所對應(yīng)的service文件推捐。然后通過systemctl的命令來啟動(dòng)裂问、關(guān)閉和重啟對應(yīng)的微服務(wù)
[Unit]
Description=${service_name} #服務(wù)名稱
Requires=network.target
After=network.target
[Service]
User=java #啟動(dòng)服務(wù)的用戶
Group=java #啟動(dòng)服務(wù)的組
Type=simple
WorkingDirectory=/opt/apps/${service_name}
Environment=JAVA_HOME=/usr/java/default
TimeoutStopSec=60
ExecStart=java -Xms1G -Xmx1G -jar ${service_name}.jar --spring.profiles.active=pro
SuccessExitStatus=143
Restart=always
RestartSec=5
StandardOutput=null
[Install]
WantedBy=multi-user.target
服務(wù)部署
- 更新代碼
- 根據(jù)源碼構(gòu)建項(xiàng)目,生成jar包
- 上傳jar包到對應(yīng)的備份目錄
- 執(zhí)行停止服務(wù)命令:
systemctl stop service_name
- 移動(dòng)jar包到對應(yīng)的啟動(dòng)目錄
- 執(zhí)行啟動(dòng)服務(wù)命令:
systemctl start service_name
- 然后通過health check檢查服務(wù)正確性
- 啟動(dòng)成功之后玖姑,把相關(guān)代碼在git上打一個(gè)tag愕秫,為了方便之后回滾
踩過的坑
- 當(dāng)一個(gè)服務(wù)還在運(yùn)行的時(shí)候,如果用新的jar包替換老的jar包焰络,那么正在運(yùn)行的進(jìn)程會拋出異常戴甩,導(dǎo)致服務(wù)不可用,所以我們先
stop
服務(wù)闪彼,然后再拷貝jar到對應(yīng)位置甜孤,然后在start
服務(wù),這樣可以保證服務(wù)正常關(guān)閉和啟動(dòng) - 因?yàn)椴渴鹞⒎?wù)是個(gè)連續(xù)的過程畏腕,必須要通過health check來保證當(dāng)前服務(wù)啟動(dòng)正常缴川,才能進(jìn)行后續(xù)的微服務(wù)的部署
- 停止服務(wù)是通過service文件里面的
SuccessExitStatus=143
配置來停止的。不要直接通過kill -9
的命令來停止服務(wù)描馅,那樣會引起微服務(wù)正在進(jìn)行的處理失敗把夸,導(dǎo)致接口返回異常 - service文件里面的
Restart=always
配置可以保證微服務(wù)進(jìn)程意外死亡時(shí)自動(dòng)重啟,進(jìn)一步保障的服務(wù)的穩(wěn)定性