服務接口規(guī)范
作為一家互聯(lián)網(wǎng)公司绝骚,并且大部門屬于電商部門,系統(tǒng)必須支持根據(jù)業(yè)務的擴張压汪,實現(xiàn)橫向擴展蛾魄,因此系統(tǒng)基礎采用分布式橫向擴展方式設計,使用OpenApi實現(xiàn)統(tǒng)一外部接入接口規(guī)范舌狗,使用dubbo實現(xiàn)內部服務負載規(guī)范痛侍,使用Restful實現(xiàn)內部管理接口規(guī)范
采用API開發(fā)
系統(tǒng)基于領域驅動開發(fā)魔市,根據(jù)業(yè)務劃分,研發(fā)部門按照各自負責的領域并行開發(fā)君丁,系統(tǒng)之間存在提供或者依賴基礎服務的情況将宪。
傳統(tǒng):采用SOA/WebService服務,有SOAP印蔗、WSDL等語法定義服務規(guī)范华嘹,需要存在SA/BA的角色先按照業(yè)務需求定義好WSDL,WSDL定義完整耙厚,但是由于定義完整岔霸,存在嚴格的規(guī)范限制,制約了性能泛豪,每次都需要通過SAX等工具生成客戶端侦鹏,每次提供的WSDL有變更都需要額外生成對應的客戶端代碼略水。(還有存在自身不具備負載的能力劝萤,需要依賴F5、Nginx等實現(xiàn)前置負載跨释,雖然有類似于Oracle公司的ESB等集成工具鳖谈,但是很貴,很貴捷绒,很貴9嵋3缟!)
當下:基于敏捷開發(fā)扳肛,快速迭代乘碑,橫向擴展的形勢下兽肤,采用基于定義接口,提供API依賴包电禀,輕依賴尖飞,接口變更只需要更新依賴版本店雅,變動較少闹啦,語法沒有強約束,性能損耗少窍奋,由于存在較少約束,不會受限于業(yè)務變更纺酸。
工程規(guī)范
對外提供的服務接口以及內部處理的業(yè)務邏輯,在工程上劃分為
project
- project-biz (實現(xiàn)對外暴露接口業(yè)務邏輯)
- main
- common(aop,convert,util)
- conf
- dao
- mapper(對每一張表具體實體操作)
- single
- tddl
- repo(集成封裝了mapper成為業(yè)務級實體變更吁峻,外部只能應用repo)
- single
- impl
- XXXInterface
- tddl
- diamond
- exceptions
- manager
- impl(XXXInterfaceImpl, 只能操作dao.repo,common,diamond)
XXXInterface
- model
- service(只能操作manager,diamond實例)
- mq
- task(定時任務)
ApplicationMain
- test
- ut (單元測試)
- it (集成測試)
- project-client (對外暴露接口)
- api (接口)
- dubbo
- gw
- web
- model (數(shù)據(jù)模型)
- enumus
- dubbo
- gw
- web
- util
DTO,DO,PO,DAO,POJO數(shù)據(jù)域使用
在數(shù)據(jù)域這塊有兩個分歧點用含,糾結點來源于dao層的技術選型以及對domain的理解啄骇,一方使用 JPA(部分部門) 做持久層操作缸夹,一方使用 mybatis(部分部門) 做持久層操作虽惭。
下方是2套技術的比較蛇尚,在持久化層面的區(qū)別只是基于對持久層的理解,但是在manager-> service 領域層的理解匆笤,出現(xiàn)了較大的理解偏差炮捧。本身不是JPA(spring-data)和mybatis技術的問題咆课,而是2個項目的成員對于domain分層上面理解程度存在偏差书蚪。
- mapper:
JPA -> Repository蘸吓,請求/響應對象 PO
mybatis -> xml mapper善炫,請求/響應對象 DAO - repo:
JPA -> 操作 mapper 層, 請求/響應對象 PO
mybatis -> 操作 mapper 層, 請求對象 DTO撩幽,響應對象 DO库继,對數(shù)據(jù)的整合在此層完成箩艺,主表-子表的封裝在這層實現(xiàn) - manager:
JPA -> 操作 repo, common, manager 等層,請求基礎類型宪萄、DO艺谆、DTO、POJO拜英,響應基礎類型静汤、DO、DTO居凶、POJO虫给, 這里非常混亂侠碧,沒有一個標準的規(guī)范抹估,manager之間允許相互調用
mybatis -> 操作 repo, common 等層弄兜,請求 XxxParam、XxxQuery踱卵、DTO,響應 Result/Batch/PageDTO<DO>班利、基礎類型积蜻,manager類型不允許相互調用宙拉。即使多個manager存在調用同樣的外部service問題,也作為冗余牛郑,如果有大量這種情況钉答,有必要抽象成基礎的AbstractBaseManager。
DO作為領域對象虏缸,可以囊括領域中所有的數(shù)據(jù) - service:
JPA -> gw入?yún)⑹莗rimitive類型甲献,dubbo入?yún)⑹荄TO慨灭,http入?yún)⑹荄O吃引,gw出參是DTO/Collection,dubbo出參是POJO语稠,http出參是POJO
mybatis -> gw入?yún)rimitive類型输涕,dubbo入?yún)⑹莗rimitive類型,web入?yún)⑹荴xxParam碉京,gw出參是業(yè)務類型命名的XxxGW界弧,dubbo出參是Result/Batch/PageDTO<DTO>,web出參是DTO