Project
所有項目在開始時必須添加版本號,版本號格式參考major.minor[.maintenance[.build]],同時將主版本號加入server.path 作為api版本號。在同一主版本號上不會對原有API進行破壞性重構(gòu),所有的破壞性重構(gòu)都要考慮升級一個大的版本號。小版本號可以新增API,API擴展。
版本號需要體現(xiàn)在log,jar,docker image 和docker container上.
如使用gradle可以用下面命令將gradle的變量導入到application.properties中
processResources {
filesMatching('application.properties') {
expand(project.properties)
}
}
在spring的配置文件里可以
info.build.version=${version}
在同一版本上開發(fā)時,需要加上snapshot。
API版本分為兩種情況:
- 開放給外部調(diào)用的API
- 內(nèi)部系統(tǒng)調(diào)用的API
開放給外部調(diào)用的API
指會通過gateway直接暴露微服務(wù)外部的API。這種API需要自己去檢查每次請求的權(quán)限信息。通常對暴露給外部調(diào)用的API很難進行大版本的升級,所以在這種API設(shè)計的時候需要經(jīng)過再三的review。
內(nèi)部系統(tǒng)調(diào)用的API
內(nèi)部系統(tǒng)調(diào)用的API指在微服務(wù)中為其他的微服務(wù)調(diào)用而設(shè)計的API。要求每個API的提供方需要維護調(diào)用API的client,client來控制權(quán)限校驗和數(shù)據(jù)傳輸過程中的加密、壓縮等處理。而其他消費方只與client進行集成,而消費方并不需要知道client的實現(xiàn)細節(jié)。
嚴禁出現(xiàn)同一API同時提供給內(nèi)部和外部使用
GIT
每當版本發(fā)布時,git上需要打上版本號的tag。在后續(xù)針對該版本維護時,checkout出一條對應(yīng)的branch對其進行維護,從而避免影響到develop分枝的開發(fā)。
CI
每一個project的CI都需要集成contract test保證API的穩(wěn)定性。API的提供方只需編寫provider side的contract test,consumer side的contract test由各個調(diào)用方編寫并集成在提供方的contract test里。
在deploy的時候,需要固化當前版本號下所依賴的第三方API的版本號以及對應(yīng)的測試代碼的版本號。
版本切換
非主版本號的升級,在通過了contract test時,可以直接停止所有老版本服務(wù)而發(fā)布新的版本。
主版本號升級時,需要在同時部署新版本服務(wù)的同時保留老版本服務(wù),后續(xù)通過日志監(jiān)控API的流量情況逐步減少老版本服務(wù)的instance數(shù)量直到最后完全停掉老版本。