多年來,我們一直使用大單體代碼庫,于是形成了對某些事情的看法和偏見。如果我們在采用 SOA 時仍然無意識地堅持過去的習慣,可能就意識不到將會在哪些方面遭遇失敗。 在本文中,我們將討論在 SOA 架構(gòu)中采用單體系統(tǒng)開發(fā)實踐會存在哪些風險。 想要在 SOA 世界中取得成功,就要避免數(shù)據(jù)和架構(gòu)的高度耦合,這點很重要。每一個服務(wù)都應該建立在深思熟慮的抽象基礎(chǔ)之上。在某種程度上,服務(wù)應該是獨立的——理想情況下,它們不需要知道其他服務(wù)的存在。而在以下這些情況下,很容易創(chuàng)建出高度耦合的服務(wù):
如果不注意,我們可能會得到一個高度耦合的服務(wù)生態(tài)系統(tǒng)。下面是一些耦合的依賴結(jié)構(gòu): 左邊:服務(wù) A 調(diào)用服務(wù) B,知道服務(wù) B 需要調(diào)用服務(wù) C,然后它再調(diào)用服務(wù) C 獲取結(jié)果。 右邊:服務(wù) A 依賴服務(wù) B,服務(wù) B 依賴服務(wù) C,而服務(wù) C 又依賴服務(wù) A。這是一個依賴循環(huán)。 這些結(jié)構(gòu)最終會變成分布式單體。到了某個時候,你會遇到以下這些問題:
“糟糕”的依賴結(jié)構(gòu)是分布式單體的征兆——開發(fā)單體的痛苦一點都不會少,面向服務(wù)的好處卻一點都不會有。此外,高度耦合的服務(wù)通常會讓你越陷越深。換句話說,如果不解決這些問題,隨著服務(wù)生態(tài)系統(tǒng)的增長,情況會變得更糟。 當數(shù)據(jù)高度耦合時,你需要使用同步 API 和異步任務(wù)來保持數(shù)據(jù)同步。這些同步過程也可能以 Saga 的形式出現(xiàn)。但不管怎樣,你不得不做這些事情:
但是,如果服務(wù)生態(tài)系統(tǒng)的數(shù)據(jù)耦合程度很低或者沒有耦合,就可以避免這些麻煩。 當你發(fā)現(xiàn)自己正處在這樣的境地,你該怎么辦?當然,并不存在放之四海而皆準的解決方案,這里只是提供一些建議:
在 SOA 世界里,溝通方式、團隊、運營、部署和流程與單體架構(gòu)世界是不一樣的。我們開發(fā)單體系統(tǒng)使用的工具與開發(fā)面向服務(wù)系統(tǒng)使用的工具不一定都一樣。如果開發(fā)人員(和企業(yè))想要成功轉(zhuǎn)向 SOA,那么舊工具和開發(fā)習慣也需要被新的工具和開發(fā)習慣所取代。 在開發(fā)單體系統(tǒng)時,我們在本地機器運行大部分的基礎(chǔ)設(shè)施。開發(fā)人員或多或少都會遇到“它無法在我的機器上運行”的問題。企業(yè)會提供引導解決方案來避免這個問題,讓開發(fā)人員盡快恢復開發(fā)工作。大多數(shù)解決方案的目標是讓基礎(chǔ)設(shè)施更容易在本地機器上運行。 在開發(fā)面向服務(wù)的系統(tǒng)時,在本地機器上運行所有的東西將會遇到伸縮性問題。
在本地運行多個服務(wù)的解決方案是一種單體思維,以這種方式來開發(fā)面向服務(wù)的系統(tǒng)可能會變成分布式單體。一些公司提供了本地服務(wù)開發(fā)解決方案,它們通常是這樣的:
端到端測試有兩種形式:
單體代碼庫的端到端測試比較容易。在準備好適當?shù)臄?shù)據(jù)之后,就可以在本地機器上執(zhí)行測試。 雖然我們已經(jīng)進行了單元和集成測試,讓測試人員在本地機器上進行端到端手動測試仍然會進一步提升我們的信心。隨著服務(wù)生態(tài)系統(tǒng)的發(fā)展,服務(wù)會越來越多,想要在本地測試所有東西是不可能的事情:
SOA 架構(gòu)的端到端測試則不太一樣。進行本地端到端測試的成本非常高,而且不具備伸縮性。 SOA 之所以流行,是因為它可以加快迭代速度。如果你花了大量時間在本地測試上,那就無法利用 SOA 的優(yōu)勢。你需要放棄在本地測試一切的想法。 你的測試策略取決于你將要采用的本地開發(fā)解決方案。下面是一些無需進行本地測試就可以發(fā)布代碼的方法:
當然,雖然你放棄了本地測試,但仍然可以通過以下這些途徑來提升信心:
另一方面,如果測試策略發(fā)生了變化,那么調(diào)試策略也需要做出改變。 在單體系統(tǒng)中,一個堆棧跟蹤信息就足以讓我們著手診斷問題。堆棧跟蹤信息為我們指明了方向,我們層層深入,直到找到問題根源。堆棧跟蹤信息和傳統(tǒng)的調(diào)試工具通常也可以用來調(diào)試 SOA 架構(gòu)中出現(xiàn)的問題,但對某些問題是毫無用處的:
除了看代碼找問題,你的調(diào)試工具箱中也需要包括這些:
在采用 SOA 架構(gòu)時很容易把系統(tǒng)開發(fā)成分布式單體。我們要避免將單體系統(tǒng)的開發(fā)習慣帶到 SOA 架構(gòu)中。以下是一些需要注意的癥狀:
單體系統(tǒng)并不是壞東西。很多公司為了轉(zhuǎn)向 SOA 而大肆投入資源,但卻沒有意識到,在某些情況下,單體可能更適合它們。無論你是堅持使用單體還是采用 SOA,都要避免把系統(tǒng)變成分布式單體——這才是最糟糕的。 拓展閱讀 https:///better-programming/signs-of-failing-service-oriented-architecture-fd405c58f75b |
|
來自: 黃爸爸好 > 《架構(gòu)設(shè)計》