關於此的好的、壞的想必你都已經瞭解得很多了。本篇文章會拋開商家們的流言蜚語,用一種簡單易懂的方式來闡述面向服務編程。這會是你所看到關於SOA的獨一無二的介紹。
在日常業務中有些事物並不時常改變,比如說美國加油站一直以來都在用加侖為單位銷售汽油,餐館依然使用菜單,牙科醫生還是會每六個月就銷售一次清潔用品。每種業務都會有一些方面不時常變動,而這部分往往佔據了是業務的絕大部分。我們就稱這些為核心業務功能(_core business functions)。
業務中的也存在一些常常變化的事物。價格、稅率、貨品分類、新產品、新市場策略、廣告、新業務領域、新領域的客戶等等。的確,為了生存,企業必定要變化,而且是快速的變化。不過,至關重要的是要那些變化影響不到核心業務功能。
軟體開發人員早就明白變化快速的軟體模組要與保持不變的部分相分離的道理。這項原則在獨立的程式或系統之中有時稱作是“共同封閉原則”。而運用在企業的資訊管理系統之中就成了SOA。
SOA是把保持不變的核心業務功能剝離成一個個獨立的服務的實踐。這些服務是被多個展現層程式所調用的粉飾了的方法。展現層程式是那些容易變化的程式,用來展示資料給使用者或是從使用者處接收資料。
我們通過思考Internet上的商鋪來協助搞明白。客戶通過瀏覽器來與商鋪網站的展現程式相互動。展現程式解析了客戶的操作,然後調用一些像是擷取當前分類的資料或是為註冊客戶要求的服務。請注意,這些服務並不知道正在與web網站互動。他們就像是與厚用戶端互動,或是3270的綠屏介面(3270是IBM的一種大型主機系統,其上應用程式常以綠屏的終端形式出現,因而常稱作“綠屏”應用程式)。他們只是簡單返回那些web系統可能會用到的資料,並將其格式標準化。
SOA其實也就是這些了,其餘部分就是一些細節。在最高的抽象層面上,SOA就是將頻繁變化與不常變化的元素分離, 僅此而已。但為什麼這一點會變得那麼重要?
讓我們再來看看Internet上的商鋪。它展現給使用者一個分類,從而使得使用者能夠將物品移入或是移出一個購物車,並且最終實現訂購。這些內容的展現卻很善變,市場人士喜歡令其時常變化。比如說,他們可能會想把購物車比作是邊框上的滾動欄。他們想要或多或少的在產品列表上的附加說明。他們想要不同的配色,字型和布局方式。確實他們想要applets、JStart Clients、Ajax,以及無數其他的展現選擇。可是所有的這些都與封裝為服務的核心業務功能毫無關係。無論展現層的風吹雨打,這些擷取分類以及註冊流程卻固定不變。這就是為何分離顯得這麼重要。它確保了資訊處理在展現的飄搖不定中得到保護。
不過展現並非唯一易變的,業務功能也是一樣。再次考慮下我們的商鋪,或許在銷售產品中需要增加一種優質紅酒。而銷售煙酒則需要驗證消費者的年齡。假定我們有了能提供驗證的Service。而每當有煙酒訂單的時候,這個Service就會調用到。呼叫此service的決定並非來自於展現層,當然也不屬於業務。而是某種特定手續所需的業務過程。業務過程變動就像是兔子跳動那樣躁動不安。如果業務成長了,他們會為其商務程序增加更多的步驟以及分支。處理過程中需要調用到的那些服務無序改變,可是處理的過程卻需要。因此,我們就需要將業務過程從展現層以及業務service中分離出來。如果它出現在單一的程式中,Smalltalk語言對這樣的分離有個稱謂,就叫做Mode-View-Controller。
值得注意的是,這麼多的技術都殊途同歸的與SOA有著關聯。這是因為SOA並非什麼特定的技術,而是某種將最佳化的業務功能於易變的過程與展現相解藕的方法學。這就是企業軟體的MVC。
在我下一篇關於此的blog之中,我們會進入細節層面,並來關注這些服務是如何被構建的以及展現與過程的解藕是如何?的。
(原文連結網址: http://blog.objectmentor.com/articles/2007/04/11/what-is-soa-really; Robert C. Martin的英文blog網址: http://blog.objectmentor.com/)
作者簡介:Robert C. Martin是Object Mentor公司總裁,物件導向設計、模式、UML、敏捷方法學和極限編程領域內的資深顧問。他不僅是Jolt獲獎圖書《敏捷式軟體開發 (Agile Software Development):原則、模式與實踐》(中文版)(《敏捷式軟體開發 (Agile Software Development)》(英文影印版))的作者,還是暢銷書Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主編,並與James Newkirk合著了XP in Practice。他是國際程式員大會上著名的發言人,並在C++ Report雜誌擔任過4年的編輯。