方案彙總
API設計
基於https。
只提供純數據。
基於一開始提出的restful方案外,提出了讀寫分離方案如下。
-
相比restful,url可以表示動作,如下的url是允許的。
/accounts/1/update
-
http GET表示讀操作,POST表示寫操作
- 響應狀態與restful方案相同
應用架構
-
API網關
一旦API規模擴大,再加上微服務的使用,路由分發、管理、監控馬上就會變得繁瑣、複雜,需要有相應工具來解決這個問題,參考工具orange。
在前期API規模還小的時候,可以直接使用nginx管理。 -
微服務
微服務解決快速小規模迭代、水平擴展方面的問題。
諸如“服務間相互調用”,屬於系統架構方面的問題,是SOA的目標,此“服務”並不等同於微服務的“服務”。 -
工程模塊劃分
- framework。基礎框架、工具庫,業務無關,基於spring boot。(包含全部service接口定義,及部分默認驅動實現)
- service-driver(s)。基礎service驅動。(例如cache的redis驅動、filesystem的mongodb驅動等)
- common-biz。通用業務邏輯。
- common-web。web相關的通用業務邏輯。
- module(s)。具體業務模塊,web類型的模塊基於spring webmvc。
-
業務模塊內層次劃分,以web模塊爲例
- request interceptor(filter)
- controller(action)
- view resolver
- model
- biz。跨controller、model的業務邏輯。
- actuator。內部管理和監控接口。
代碼庫管理
-
工程劃分
- 框架庫
包含的模塊有:framework、service-driver、common-biz、common-web、web樣例 - 業務庫
自身模塊劃分如前文。同時依賴框架庫輸出的framework、service-driver、common-biz模塊。
- 框架庫
-
業務庫分支方案
約定current的意思是當前最大版本號
- 常設分支包括多個線上分支,master、dev分支。
- 線上分支均爲版本分支,如v1、v2。
-
版本分支的生成。
- v(current) <= master < v(current + 1)
- 當api有不兼容改變時,在master的head上新建v(current + 1)分支,然後current += 1。
-
以v1分支爲例,當current>1且需要在v1分支上新增commit時,在v1的head上新建v1-release分支,開發過程中產生的commit提交到v1-release,測試通過後合併到v1,上線後刪除v1-release。
- 線上分支不會合並,當某個commit涉及多個線上分支時,使用cherry-pick的方式同步到多個分支。
- 版本分支自身會分出子服務分支以適應微服務部署,如v1可以分出v1-account、v1-order等。
子服務分支的新增commit用獨立的release分支完成。
-
代碼複用
- 有私有maven倉庫,按通常的依賴管理複用
- 無私有maven倉庫,業務工程庫使用git subtree引入框架工程庫
工具鏈
只提供基於默認工具的工程指導,使用其他工具的成員,如eclipse,需要有能力自行解決工具問題。
- idea
- gradle
- sourcetree
工作計劃
需要完成框架庫、搭建業務庫。
目標
項目可滿足基本的業務需求,並可投入實際使用。
完成框架庫、搭建業務庫。
預期
- 所有應帶默認實現的service-driver已完成local類型的實現。
- web樣例中演示帶默認實現的service的使用,關係數據庫工具的使用。
關鍵過程
service-driver接口定義及實現
自上而下優先級由高到低,自左至右優先級不分先後。
低優先級的service可能會依賴高優先級service。
帶default
標籤表示framework模塊會有默認實現,不需要driver(s)模塊。
大部分driver都需要考慮local、global兩種類型的實現。
不好抽象出接口或者工作量大且已有成熟第三方定義及實現的service,例如關係數據庫工具、httpclient工具等,不在framework中定義,直接在業務模塊中引用,避免抽象得不好的service出現在上游以至於污染下游模塊。
- filesystem
default
- session
default
、logdefault
- auth
default
- cache
default
- queue
- event
- sms
web樣例
基於web的業務模塊