今年microXchg微服務大會上,Uwe Friedrichsen做了開幕報告。報告中探討了“彈性功能服務設計”的核心理念,要點包括:微服務開發(fā)人員應該了解容錯設計模式與緩存,但不能用于改善完全不好(過度耦合)的系統(tǒng)設計;理解領域驅動設計(DDD,Domain-Driven Design)和模塊化的重要性;組件重在可替換性而非可重用性。
Friedrichsen是Codecentric公司的CTO,他在演講一開始就指出了軟件開發(fā)的目的在于交付業(yè)務價值。為實現(xiàn)該目標,軟件必須在生產環(huán)境中運行并(高度)可用。微服務這樣的現(xiàn)代架構風格意味著凡事皆分布(很多情況下是在不少于一個LAN上的分布),因此故障在系統(tǒng)中是常見的并且是不可預測的。
容錯設計模式應該被開發(fā)人員所熟知,諸如電路熔斷器(Circuit Breaker)、艙壁(Bulkhead)、超時與重試(Timeout and Retry)等。容錯設計模式借助Michael Nygard所著的《[Release It!(https://pragprog.com/book/mnee/release-it)》一書而廣為人知。緩存雖然十分有用,但是在部署中應慎重使用,并非簡單地應用就可以達到克服不好系統(tǒng)設計的效果,例如涉及多個獨立服務的長激活路徑。
Friedrichsen展示了一系列用于微服務的“設計基礎”(如下圖所示),其中包括了一些側重于高內聚、低耦合和分離關注的設計原則。這些原則在系統(tǒng)邊界處尤為關鍵,雖然他們的理論早在上世紀70年代就由David Parnas (PDF鏈接)詳細闡明了,但是他們依然常被錯誤地理解。
領域驅動設計(DDD,Domain-Driven Design)是一個十分有用的工具,但是不少開發(fā)人員過度聚焦于被Friedrichsen稱做“實體DDD”的領域靜態(tài)上下文模型。通常系統(tǒng)的動態(tài)行為對業(yè)務行為、領域時間和數(shù)據(jù)流更具描述力。
不要從靜態(tài)領域模型著手,魔法存在于系統(tǒng)的動態(tài)行為之中。
微服務開發(fā)人員不應糾結于可重用性,而是應該瞄準于可替換性。Friedrichsen引用了Fred Brooks的說法,討論多年來一直被開發(fā)人員所追求的軟件重用承諾問題。Brook建議對于需要創(chuàng)建可重用組件(超越那些適用單一用例目標的組件)的工作,通常需要付出三倍以上的工作投入。這意味只有當組件被無修改地被使用了四次以上,才會看到些許在可重用性上投入的反饋。
微服務系統(tǒng)中使用的交流模式也很大程度上影響了功能性服務設計,F(xiàn)riedrichsen建議應將關注置于會限制未來更改和擴充能力的前期架構選取之上。
報告的結論和核心關鍵要點在于,當實現(xiàn)微服務這樣的分布式系統(tǒng)時,系統(tǒng)的特性會使得多年來一直為我們所熟知的設計問題影響得以呈現(xiàn)出來并會倍增,因此開發(fā)人員和架構師需要重新領會功能服務設計。
Uwe Friedrichsen演講“彈性功能服務設計”的視頻可以在microXchg大會的YouTube頻道上看到。
查看英文原文:Relearning Functional Service Design for Microservices: Uwe Friedrichsen at microXchg