SpringCloud 微服務(wù)最佳開發(fā)實(shí)踐
現(xiàn)在基于SpringCloud的微服務(wù)開發(fā)日益流行,網(wǎng)上各種開源項(xiàng)目層出不窮。我們?cè)趯?shí)際工作中可以參考開源項(xiàng)目實(shí)現(xiàn)很多開箱即用的功能,但是必須要遵守一定的約定和規(guī)范。
本文結(jié)合我們實(shí)際的開發(fā)中遇到的一些問題整理出了一份微服務(wù)開發(fā)的實(shí)踐規(guī)范,歡迎各位大佬拍磚指點(diǎn)。
Maven規(guī)范
1.所有項(xiàng)目必須要有一個(gè)統(tǒng)一的parent模塊
所有微服務(wù)工程都依賴這個(gè)parent,parent用于管理依賴版本,maven倉庫,jar版本的統(tǒng)一升級(jí)維護(hù)
在parent下層可以有 core,starter,rate-limit 等自定義模塊
2.core 核心包的作用:
- 以POJO形式約定各種開發(fā)規(guī)范;如BaseEntity,統(tǒng)一入?yún)?,返?/li>
- 各種二方、三方組件開箱即用AutoConfig;
- 各種提高開發(fā)效率的幫助類等 XXXUtil
注意:core包所有依賴的scope必須是provided,避免傳遞依賴,同時(shí)配合Condition注解按條件加載Bean 如 @ConditionalOnClass(Ribbon.class),@ConditionalOnBean(StringRedisTemplete.class)
3.starter模塊
如果你每個(gè)服務(wù)都需要依賴10幾個(gè)starter,可以建一個(gè)統(tǒng)一的starter模塊幫他們統(tǒng)一依賴進(jìn)來,管理依賴集,簡(jiǎn)化依賴
4.rate-limit模塊
用于放置非通用的自開發(fā)組件
5.正確區(qū)分Release版本 和 Snapshot版本
說明:如果是Snapshot版本,那么在mvn deploy時(shí)會(huì)自動(dòng)發(fā)布到快照版本庫中,而使用快照版本的模塊,在不更改版本號(hào)的情況下,直接編譯打包時(shí),Maven會(huì)自動(dòng)從鏡像服務(wù)器上下載最新的快照版本。
如果是Release版本,那么在mvn deploy時(shí)會(huì)自動(dòng)發(fā)布到正式版本庫中,而使用正式版本的模塊,在不更改版本號(hào)的情況下,編譯打包時(shí)如果本地已經(jīng)存在該版本的模塊則不會(huì)主動(dòng)去鏡像服務(wù)器上下載。
簡(jiǎn)而言之:
Release : 正式版,有bug不能再繼續(xù)使用這個(gè)版本號(hào)
Snapshot:快照版,有bug可以繼續(xù)使用同一版本號(hào),可以自動(dòng)升級(jí),推薦使用
服務(wù)調(diào)用
規(guī)范服務(wù)間通過引入sdk調(diào)用,服務(wù)消費(fèi)者需要依賴生產(chǎn)者提供的api,配合snapshot方便升級(jí)
account account-api account-service
account-api 模塊中放消費(fèi)方需要用到的東西,api接口,vo,入?yún)⒌?..
public interface AccountApi {
...
}
account-service實(shí)現(xiàn)account-api提供的接口
@RestController
@Log4j2
@Api(tags = "用戶接口")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class AccountController implements AccountApi {
...
}
消費(fèi)者通過feign調(diào)用生產(chǎn)者,直接集成生產(chǎn)者提供的接口并處理熔斷
@Component
@FeignClient(name = "account-service",fallbackFactory = AccountClientFallbackFactory.class)
public interface AccountClient extends AccountApi {
...
}
@Component
public class AccountClientFallbackFactory implements FallbackFactory<AccountClient> {
@Override
public AccountClient create(Throwable throwable) {
AccountClientFallback accountClientFallback = new AccountClientFallback();
accountClientFallback.setCause(throwable);
return accountClientFallback;
}
}
@Slf4j
public class AccountClientFallback implements AccountClient {
@Setter
private Throwable cause;
@Override
public ResultData<AccountDTO> getByCode(String accountCode) {
log.error("查詢失敗,接口異常" ,cause);
AccountDTO account = new AccountDTO();
account.setAccountCode("000");
account.setAccountName("測(cè)試Feign");
return ResultData.success(account);
}
}
Restful設(shè)計(jì)規(guī)范
一個(gè) API 是一個(gè)開發(fā)者的 UI - 就像其他任何 UI 一樣, 確保用戶體驗(yàn)被認(rèn)真的考慮過是很重要的!
可以使用以下兩種格式:
- /版本/訪問控制/域?qū)ο?/li>
- /版本/訪問控制/域?qū)ο?動(dòng)作
域?qū)ο笮枰裱韵聨讞l約束:
- 域?qū)ο?用名詞而非動(dòng)詞
- 直接使用域?qū)ο竺?使用/ticket而不是復(fù)數(shù)/tickets
- 域?qū)ο箨P(guān)系表達(dá) 最大不超過2層,如/ticket/12/message
- 需要正確區(qū)分 GET PUT POST DELETE 請(qǐng)求方法
- 無法用名詞 + 請(qǐng)求方法表述的可以擴(kuò)展為 /域?qū)ο?動(dòng)詞 如 POST /user/login
在網(wǎng)關(guān)層對(duì)接口進(jìn)行訪問控制,訪問控制的規(guī)則分為:
pb - public 所有請(qǐng)求均可訪問
pt - protected 需要進(jìn)行token認(rèn)證通過后方可訪問
pv - private 無法通過網(wǎng)關(guān)訪問,只能微服務(wù)內(nèi)部調(diào)用
df - default 網(wǎng)關(guān)請(qǐng)求token認(rèn)證,并且請(qǐng)求參數(shù)和返回結(jié)果進(jìn)行加解密
版本:
以微服務(wù)為力度,整個(gè)服務(wù)進(jìn)行升級(jí)
例如,一個(gè)微服務(wù)有如下API
GET /v1/pb/user
POST /v1/pb/user
PUT /v1/pb/user
如果 POST /v1/pb/user 需要升級(jí),則需要將整個(gè)微服務(wù) /v1 升級(jí)到 /v2,同時(shí)保證版本兼容的api老版本可以繼續(xù)訪問
GET /v2/pb/user 等價(jià)于 GET /v1/pb/user
POST /v1/pb/user 標(biāo)記為已廢棄
POST /v2/pb/user
PUT /v2/pb/user 等價(jià)于 PUT /v1/pb/user
代碼實(shí)現(xiàn):
1.GET方式{version}可以是任意值,v1,v2均可,如:@GetMapping("/{version}/pb/user")
2.POST方法強(qiáng)制使用 V1 ,并標(biāo)記為已廢棄,但是仍可使用
@Deprecated
@PostMapping("/v1/pb/user")
3.POST {version}應(yīng)是當(dāng)前版本,只能是v2
@PostMapping("/{version}/pb/user")
網(wǎng)關(guān)
- 可以不承擔(dān)微服務(wù)鑒權(quán)功能,由自己服務(wù)實(shí)現(xiàn)(簡(jiǎn)單服務(wù)可以直接在網(wǎng)關(guān)層鑒權(quán))
- 網(wǎng)關(guān)鑒權(quán)與微服務(wù)鑒權(quán)的差異在我其他文章中有詳細(xì)說明,可參考此文:http://t.hk.uy/2c3
- 需要實(shí)現(xiàn)訪問控制權(quán)限,結(jié)合上文的Restful規(guī)范,屏蔽
/pv/**等特殊請(qǐng)求 - 需要實(shí)現(xiàn)灰度發(fā)布功能
開發(fā)聯(lián)調(diào)的時(shí)候需要將服務(wù)器流量導(dǎo)入到本地,結(jié)合nacos的元數(shù)據(jù)與請(qǐng)求頭可實(shí)現(xiàn)服務(wù)實(shí)例的篩選。參考此文實(shí)現(xiàn):http://t.hk.uy/2c6
到此這篇關(guān)于SpringCloud 微服務(wù)最佳開發(fā)實(shí)踐的文章就介紹到這了,更多相關(guān)SpringCloud 微服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot+mybatis搭建一個(gè)后端restfull服務(wù)的實(shí)例詳解
這篇文章主要介紹了spring boot+mybatis搭建一個(gè)后端restfull服務(wù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
關(guān)于使用MyBatis簡(jiǎn)化JDBC開發(fā)和解決SQL語句警告的問題
這篇文章主要介紹了關(guān)于使用MyBatis簡(jiǎn)化JDBC開發(fā)和解決SQL語句警告的問題,如果idea和數(shù)據(jù)庫沒有建立鏈接,idea不識(shí)別表的信息,就會(huì)出現(xiàn)SQL語句的警告,需要的朋友可以參考下2023-05-05
@Value如何獲取yml和properties配置參數(shù)
這篇文章主要介紹了@Value如何獲取yml和properties配置參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
學(xué)習(xí)Java設(shè)計(jì)模式之觀察者模式
這篇文章主要為大家介紹了Java設(shè)計(jì)模式中的觀察者模式,對(duì)Java設(shè)計(jì)模式感興趣的小伙伴們可以參考一下2016-01-01
Spring的同一個(gè)服務(wù)會(huì)加載多次的問題分析及解決方法
這篇文章主要介紹了Spring的同一個(gè)服務(wù)為什么會(huì)加載多次,我們先來梳理一下?Web?容器中如何加載?Bean,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
java實(shí)現(xiàn)二維數(shù)組轉(zhuǎn)置的方法示例
這篇文章主要介紹了java實(shí)現(xiàn)二維數(shù)組轉(zhuǎn)置的方法,結(jié)合實(shí)例形式詳細(xì)分析了java二維數(shù)組轉(zhuǎn)置的原理、實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
springboot 獲取訪問接口的請(qǐng)求的IP地址的實(shí)現(xiàn)
本文主要介紹了springboot獲取訪問接口的請(qǐng)求的IP地址的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
解決springboot項(xiàng)目啟動(dòng)報(bào)錯(cuò)Error creating bean with&nb
這篇文章主要介紹了解決springboot項(xiàng)目啟動(dòng)報(bào)錯(cuò)Error creating bean with name dataSourceScriptDatabaseInitializer問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2024-03-03

