你們好,我是飄渺Jam,一名來自三流城市三流公司的三流程序員,這是咱們的第161篇原創文章,若是你喜歡個人文章請點贊轉發支持一下。 html
如今基於SpringCloud的微服務開發日益流行,網上各類開源項目層出不窮。咱們在實際工做中能夠參考開源項目實現不少開箱即用的功能,可是必需要遵照必定的約定和規範。java
本文結合咱們實際的開發中遇到的一些問題整理出了一份微服務開發的實踐規範,歡迎各位大佬拍磚指點。程序員
Maven規範
-
全部項目必需要有一個統一的parent模塊api
全部微服務工程都依賴這個parent,parent用於管理依賴版本,maven倉庫,jar版本的統一升級維護服務器
在parent下層能夠有 core,starter,rate-limit 等自定義模塊微信
-
core 核心包的做用:restful
-
以POJO形式約定各類開發規範;如BaseEntity,統一入參,返參架構
-
各類二方、三方組件開箱即用AutoConfig;併發
-
各類提升開發效率的幫助類等 XXXUtilapp
注意:core包全部依賴的scope必須是provided,避免傳遞依賴,同時配合Condition註解按條件加載Bean 如 @ConditionalOnClass(Ribbon.class),@ConditionalOnBean(StringRedisTemplete.class)
-
starter模塊
若是你每一個服務都須要依賴10幾個starter,能夠建一個統一的starter模塊幫他們統一依賴進來,管理依賴集,簡化依賴
-
rate-limit模塊
用於放置非通用的自開發組件
-
正確區分Release版本 和 Snapshot版本
說明:若是是Snapshot版本,那麼在mvn deploy時會自動發佈到快照版本庫中,而使用快照版本的模塊,在不更改版本號的狀況下,直接編譯打包時,Maven會自動從鏡像服務器上下載最新的快照版本。
若是是Release版本,那麼在mvn deploy時會自動發佈到正式版本庫中,而使用正式版本的模塊,在不更改版本號的狀況下,編譯打包時若是本地已經存在該版本的模塊則不會主動去鏡像服務器上下載。
簡而言之:
Release : 正式版,有bug不能再繼續使用這個版本號
Snapshot:快照版,有bug能夠繼續使用同一版本號,能夠自動升級,推薦使用
服務調用規範
-
服務間經過引入sdk調用,服務消費者須要依賴生產者提供的api,配合snapshot方便升級
account account-api account-service
account-api 模塊中放消費方須要用到的東西,api接口,vo,入參等...
public interface AccountApi { ... }
account-service實現account-api提供的接口
@RestController @Log4j2 @Api(tags = "用戶接口") @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class AccountController implements AccountApi { ... }
-
消費者經過feign調用生產者,直接集成生產者提供的接口並處理熔斷
@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("測試Feign"); return ResultData.success(account); } }
Restful設計規範
一個 API 是一個開發者的 UI - 就像其餘任何 UI 同樣, 確保用戶體驗被認真的考慮過是很重要的!
restful接口可使用如下兩種格式:
-
/版本/訪問控制/域對象
-
/版本/訪問控制/域對象/動做
域對象須要遵循如下幾條約束:
-
域對象 用名詞而非動詞
-
直接使用域對象名 使用/ticket而不是複數/tickets
-
域對象關係表達 最大不超過2層,如/ticket/12/message
-
須要正確區分 GET PUT POST DELETE 請求方法
-
沒法用名詞 + 請求方法表述的能夠擴展爲 /域對象/動詞 如 POST /user/login
在網關層對接口進行訪問控制,訪問控制的規則分爲:
pb - public 全部請求都可訪問
pt - protected 須要進行token認證經過後方可訪問
pv - private 沒法經過網關訪問,只能微服務內部調用
df - default 網關請求token認證,而且請求參數和返回結果進行加解密
版本:
以微服務爲力度,整個服務進行升級
例如,一個微服務有以下API
GET /v1/pb/user
POST /v1/pb/user
PUT /v1/pb/user
若是 POST /v1/pb/user
須要升級,則須要將整個微服務 /v1 升級到 /v2,同時保證版本兼容的api老版本能夠繼續訪問
GET /v2/pb/user 等價於 GET /v1/pb/user
POST /v1/pb/user 標記爲已廢棄
POST /v2/pb/user
PUT /v2/pb/user 等價於 PUT /v1/pb/user
代碼實現:
-
GET方式{version}能夠是任意值,v1,v2都可,如:@GetMapping("/{version}/pb/user")
-
POST方法強制使用 V1 ,並標記爲已廢棄,可是仍可以使用
@Deprecated @PostMapping("/v1/pb/user")
-
POST {version}應是當前版本,只能是v2
@PostMapping("/{version}/pb/user")
網關
-
能夠不承擔微服務鑑權功能,由本身服務實現(簡單服務能夠直接在網關層鑑權)
網關鑑權與微服務鑑權的差別在我其餘文章中有詳細說明,可參考此文:微服務網關受權VS微服務受權 -
須要實現訪問控制權限,結合上文的Restful規範,屏蔽
/pv/**
等特殊請求 -
須要實現灰度發佈功能
開發聯調的時候須要將服務器流量導入到本地,結合nacos的元數據與請求頭可實現服務實例的篩選。參考此文實現: SpringCloud 實現網關的灰度發佈
這裏爲你們準備了一份小小的禮物,關注公衆號,輸入以下代碼,便可得到百度網盤地址,無套路領取!
001:《程序員必讀書籍》
002:《從無到有搭建中小型互聯網公司後臺服務架構與運維架構》
003:《互聯網企業高併發解決方案》
004:《互聯網架構教學視頻》
006:《SpringBoot實現點餐系統》
007:《SpringSecurity實戰視頻》
008:《Hadoop實戰教學視頻》
009:《騰訊2019Techo開發者大會PPT》
010: 微信交流羣
本文分享自微信公衆號 - JAVA日知錄(javadaily)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。