SOA 的基本概念及设计原则浅议
1、SOA 的基本概念
在SOA架構風格中,服務是最核心的抽象手段,業務被劃分(組件化)為一系列粗粒度的業務服務和業務流程。業務服務相對獨立、自包含、可重用,由一個或者多個分布的系統所實現,而業務流程由服務組裝而來。一個"服務"定義了一個與業務功能或業務數據相關的接口,以及約束這個接口的契約,如服務質量要求、業務規則、安全性要求、法律法規的遵循、關鍵業績指標(Key Performance Indicator,KPI)等。接口和契約采用中立、基于標準的方式進行定義,它獨立于實現服務的硬件平臺、操作系統和編程語言。這使得構建在不同系統中的服務可以以一種統一的和通用的方式進行交互、相互理解。除了這種不依賴于特定技術的中立特性,通過服務注冊庫(Service Registry)加上企業服務總線(Enterprise Service Bus)來支持動態查詢、定位、路由和中介(Mediation)的能力,使得服務之間的交互是動態的,位置是透明的。技術和位置的透明性,使得服務的請求者和提供者之間高度解耦。這種松耦合系統的好處有兩點:一點是它適應變化的靈活性;另一點是當某個服務的內部結構和實現逐漸發生改變時,不影響其他服務。而緊耦合則是指應用程序的不同組件之間的接口與其功能和結構是緊密相連的,因而當發生變化時,某一部分的調整會隨著各種緊耦合的關系引起其他部分甚至整個應用程序的更改,這樣的系統架構就很脆弱了。
SOA架構帶來的另一個重要觀點是業務驅動IT,即IT和業務更加緊密地對齊。以粗粒度的業務服務為基礎來對業務建模,會產生更加簡潔的業務和系統視圖;以服務為基礎來實現的IT系統更靈活、更易于重用、更好(也更快)地應對變化;以服務為基礎,通過顯式地定義、描述、實現和管理業務層次的粗粒度服務(包括業務流程),提供了業務模型和相關IT實現之間更好的"可追溯性",減小了它們之間的差距,使得業務的變化更容易傳遞到IT。
因此,可以將SOA的主要優點概括為:IT能夠更好更快地提供業務價值(Business Centric)、快速應變能力(Flexibility)、重用(Reusability)。
從演變的歷程來看,SOA在很多年前就被提出來了,現在SOA的再現和流行是若干因素的結合。一方面是多年的軟件工程發展和實踐所積累的經驗、方法和各種設計/架構模式,包括OO/CBD/MDD/MDA、EAI和中間件;另一方面是互聯網的多年發展帶來前所未有的分布式系統的交互能力和標準化基礎。與此同時,企業越來越重視業務模型本身的組件化,以支持高度靈活的業務戰略。但是現有的企業軟件架構不夠靈活,難以適應日益復雜的企業整合,難以滿足隨需應變商務的需要,因此與業務對齊、以業務的敏捷應變能力為首要目標、松散耦合、支持重用的SOA架構方法得到青睞。更多的細節請參見"以服務為中心的企業整合"。
基于我們同客戶打交道的經驗,有必要在這里澄清大家經常混淆的幾個基本問題。
第一,SOA是架構風格,是方法;而不是具體架構具體實現技術(如Web Service)、具體架構元素(如企業服務總線,Enterprise Service Bus,ESB)。
經常有人認為只要用了Web Service,就是SOA了。這是不對的,Web Service只是實現服務的一種具體技術表現形式。同樣,認為搞SOA,就是買點軟件,建個ESB,這也是不對的,ESB只是SOA架構風格中的一部分。首先,ESB是一種從實踐中總結出來的架構風格元素,即BUS(總線模式);其次,ESB的主要功能是負責連通性和服務中介(Service Mediation),解耦服務的請求者和服務的提供者。
第二,SOA的首要目標是IT與業務對齊,支持業務的快速變化;其次是IT架構的靈活性和IT資產的重用。
業務對敏捷性的需要,是SOA最大的驅動力。一方面是業務在這方面的要求越來越高;另一方面是今天的IT很不靈活,很難適應業務快速變化的需求,不僅僅是因為IT架構不靈活,更重要的是業務模型中的元素和IT系統的元素之間存在很大的差距。這種不對齊,導致業務人員和IT人員之間的溝通不夠有效,業務的變化需要花費很大的代價傳遞到IT系統。很難想像,業務人員對一個Java對象,一個EJB或者一個JSP頁面感興趣,這離業務世界太遠了。這種業務和IT的對齊,需要在IT系統中實現更高階的抽象元素,就是業務模型中的元素(服務、流程、業績管理),并且滿足業務需要的水平整合(將人、信息、應用和流程端到端地動態整合起來)。這樣一個以服務為中心的、端到端整合的環境,首先使得業務變化可以在業務元素這個層面上溝通,更容易、更準確地從業務傳遞到IT。其次,這種變化被隔離在需要變化的局部,而不擴散到系統的其他部分。這就需要整個IT架構本身是松散耦合的,一個服務的變化(功能、數據、過程、技術環境等)不影響其他服務。最后,我們希望這些反映業務元素的服務,是相對穩定、可以重用的,這對快速適應變化、減少成本是非常重要的。
第三,在工程上,SOA的重點是服務建模和基于SOA的設計原則進行架構決策和設計。
經常碰到客戶提出這樣的問題:SOA挺好,為什么好?怎么做才是SOA的方法?跟過去的方法,比如OO/CBD有什么不同?有時候一個J2EE服務器就好了,為什么那么復雜?
從建模和設計的角度來說,SOA更多地側重在業務層次上,也就是通過服務建模將業務組件化為服務模型,它是業務架構的底層,是技術架構的頂層,承上啟下,是靈活的業務模型和IT之間的橋梁,保證二者之間的"可追溯性"。從這里往下,是基于已有的方法,比如OO/CBD來進行的。從架構的層次上,SOA更多地側重于如何將企業范圍內多個分布的系統(包括已有系統/遺留系統)連接起來(ESB,Adapter/Connector),如何將它們的功能、數據轉化為服務,如何通過服務中介機制(ESB,Service Registry)保證服務之間以松散耦合的方式交互,如何組裝(集成)服務為流程,如何管理服務和流程等。從這往下,對于實現服務的一個具體應用,它的架構、設計和實現是可以基于已有的實踐和方法的,比如J2EE或.NET。
有些時候,由于業務需求比較簡單,所有這些東西都在一個J2EE的應用服務器上,有些要素不是那么突出,不過隨著系統規模的擴大,要解決的業務問題更復雜、范圍更大的時候,SOA的各種架構要素就會變得越來越重要。
在下面的小節里就概括地討論一下SOA的若干個重要方面,包括:面向服務的計算環境,編程模型,架構風格,工程方法,以及相關的技術。
2、計算環境的演變和面向服務的計算環境
2.1 計算環境
計算環境由一組計算機、軟件平臺和相互聯通的網絡組成,這個環境能夠處理和交換數字信息,允許外界訪問其內信息資源(1) 。不同的計算環境有不同的計算風格和編程模型,由一些特定于該計算環境的技術來支撐。如何在一個計算環境中分割和部署計算能力、數據資源,如何讓各個部分相互通信和協作,如何在概念上對問題域進行建模,然后映射到該計算環境,都會受到計算環境的影響和制約。因此,了解一下計算環境的歷史,會幫助我們理解面向服務的計算環境是如何演變而來的。
2.2 計算環境的演變歷程
計算環境的演變經歷了若干個階段,在早期的主機時代,絕大多數的計算功能和系統的組成部分,都包括在一臺機器里。在20世紀80年代,隨著PC的繁榮,計算環境發生很大的變化。通過局域網相互連接的計算設備構成客戶/服務器計算環境,計算資源和數據資源被適當地分割,客戶和服務器通過網絡協議、遠程調用或消息等方式來相互協作,完成計算。
為了滿足更高的可伸縮性需求,多層架構出現,計算資源和數據資源的分布多樣化,與企業中原來已經存在的計算環境,尤其是主機及其遺留系統之間的集成也變得越來越重要。中間件迅速發展,開始出現分布式對象、組件和接口等概念,用于在計算環境中更好地分割運算邏輯和數據資源。計算環境中不同部分之間的交互,也從原有相對低層的網絡協議、遠程調用和消息機制的基礎上,發展到支持分布式對象、組件和接口之間的交互,這種交互在名字服務(Naming Service)等的支持下,通常是位置透明的。但由于缺乏普遍的標準化支持,很難做到技術透明,系統是緊耦合的。
隨著互聯網(Internet)的發展,開放和標準的網絡協議被普遍支持,所有底層計算平臺都開始支持這些標準和協議,這導致一個計算環境內部和各個計算環境之間交互的藩籬被打破。數據和功能的表示與交互在XML、WEB服務(Web Service)技術與標準的基礎上,保證了通用性和最大的交互能力,這使得計算環境發展到一個全新的階段--基于標準、開放的互聯網技術的計算環境。在這樣的計算環境中,各個部分可以采用異構的底層技術,它們使用XML來描述和表示自己的數據和功能,采用開放的網絡協議(如HTTP)來握手,在此之上,基于Web服務來互操作和交換數據。在這里,一個很重要的新概念是"服務"(2),它是一個自包含的功能,使用者通過明確定義的接口(契約)來與一個服務交互,這個接口的描述基于WSDL(Web Service Description Language)這樣的開放標準。對象和組件重在表示一個事物本身的組成部分和相互關聯(也就是WHAT"THINGS"ARE的問題),而服務則表示一個事物做什么(也就是WHAT"THINGS"DO的問題)。Web服務是實現服務的技術手段,就如同各種編程語言中的對象是實現對象的技術手段,J2EE中的EJB是實現組件的技術手段一樣。這種基于標準、開放的互聯網技術,以服務為中心的計算環境,我們稱之為"面向服務的計算環境"。
2.3 面向服務的計算環境
在面向服務的計算環境中,系統可以是高度分布、異構的。它一般包括服務運行時環境(Service Runtime)、服務總線(Service Integration Infrastructure)、服務網關(Service Gateway)、服務注冊庫(Service Registry)和服務組裝引擎(Service Choreography Engine)等,如圖1-1所示。
服務運行時環境提供服務(和服務組件)的部署、運行和管理能力,支持服務編程模型,保證系統的安全和性能等質量要素;服務總線提供服務中介的能力,使得服務使用者能夠以技術透明和位置透明的方式來訪問服務;服務注冊庫支持存儲和訪問服務的描述信息,是實現服務中介、管理服務的重要基礎;而服務組裝引擎,則將服務組裝為服務流程,完成一個業務過程;服務網關用于在不同服務計算環境的邊界進行服務翻譯,比如安全。
面向服務的計算環境是開放的、標準的,由如圖1-2所示的技術標準協議棧所定義和支持。例如,Transport層的HTTP協議,Service Description層的WSDL,Business Process層的WS-CDL等,與Policy相關的WS-Policy。本書后面的章節將討論所有統稱為WS-*的標準和協議。
圖1-1 SOA計算環境的組成要素
圖1-2 SOA計算環境的標準協議棧
面向服務的計算環境,為IBM所定義的隨需應變計算環境奠定了現實基礎。隨需應變計算環境應具備以下特點,如圖1-3所示。
圖1-3 隨需應變的計算環境應該具備的特點
(1)整合:將人、過程、應用和數據全面整合起來。
(2)虛擬化:將分布、異構的物理資源(服務器、存儲設備等)整合起來,呈現為統一的邏輯對象,以安全和可管理的方式供使用。
(3)自主計算:如同生物體一樣,系統具備一些高級生物系統的能力,包括自我診斷和修復問題,自動配置和調整以適應環境的變化,自動優化資源的使用效率、增強工作負荷的處理的能力,自我保護數據和信息的安全。
(4)開放標準:整個環境建立在開放的標準之上,保證系統的交互性。
2.4 面向服務計算環境的現狀
不同的服務計算環境,采用不同的技術和產品,這里主要結合IBM的產品和技術來介紹在J2EE平臺上實現的服務計算環境。
主機通過增加對互聯網技術和標準的支持,來創建主機上的面向服務計算環境。比如IBM的CICS 3.1,提供了SOAP和Web服務的支持,可以將主機上的應用以Web服務的方式提供出來,供消費者使用。
多年來,IT界的主要技術提供者,一直攜手努力定義和推動Web服務的相關標準,并且在主要的幾個計算平臺上實現了高度兼容,包括.NET,J2EE和開源平臺(如LAMPLinux,Apache,mySQL,PHP/Perl/Python)。
IBM以J2EE為基礎,提供了全面的、強大的服務計算環境,如圖1-4所示。
圖1-4 IBM提供的服務計算環境
在這個計算環境中,它是服務的世界。其中,Access Services提供訪問已有應用或遺留系統的能力,將已有系統中的功能和信息轉化為服務,IBM提供了訪問不同系統的適配器和相應的框架來幫助轉化。Business App Services指那些通過新的計算平臺J2EE(如IBM的WebSphere Application Server)來實現的新應用,它們所實現的功能和信息也都轉化為服務提供出來。Partner Service指那些來自合作伙伴的服務,WebSphere Partner Gateway提供企業邊界處不同安全等差異的轉換。Information Service是那些跟信息(而不是活動)有關系的服務,比如將多個系統中異構的數據,聚合、轉換為業務需要的統一整齊的業務數據對象來訪問。Process Service是指把多個服務聚合成為一個服務流程對應業務過程的服務,這種復合服務通常是長時間運行的過程。Interaction Service是把人的活動,通過人機交互以服務的方式出現在整個業務過程中,作為Process Service中的一部分。
在面向服務計算環境中,企業服務總線處于非常重要的位置,它提供服務的中介,解耦服務請求者和服務提供者,是服務計算環境中的核心。 ESB是過去消息中間件的發展,采用了"總線"這樣一種模式來管理和簡化應用之間的集成拓撲結構,以廣為接受的開放標準為基礎來支持應用之間在消息、事件和服務級別上的動態互聯互通。
ESB的基本特征和能力包括:描述服務的元數據和服務注冊管理;在服務請求者和提供者之間傳遞數據及對這些數據進行轉換的能力,并支持由實踐中總結出來的一些模式如同步模式,異步模式等;發現、路由、匹配和選擇的能力,以支持服務之間的動態交互,解耦服務請求者和服務提供者。高級一些的能力,包括對安全的支持、服務質量保證、可管理性和負載平衡等。
ESB所提供的基于標準的連接服務,將應用中實現的功能或者數據資源,轉化為服務請求者能以標準的方式來訪問的服務;當請求者來請求一個服務時,ESB中這種中介轉化過程可能簡單到什么也沒有,也可能要很復雜的中介服務支持,包括動態地查找、選擇一個服務,消息的傳遞、路由和轉換、協議的轉換。這種中介過程,是ESB借助于服務注冊管理及問題域相關的知識(如業務方面的一些規則等)自動進行的,不需要服務請求者和提供者介入,從而實現了解耦服務請求者和提供者的技術基礎。這使得服務請求者不需要關心服務提供者的位置和具體實現技術,雙方在保持接口不變的情況下,各自可以獨立地演變。
所以,ESB采用總線結構模式簡化了應用之間的集成拓撲,通過源自實踐的模式,提供了基于標準的通用連接服務,使得服務請求者和服務提供者之間可以以松散耦合、動態的方式交互,從而在不同層次上使得SOA解決方案是一個松散耦合、靈活的架構。
需要注意的是,ESB是一種架構模式,不能簡單地等同于特定的技術或產品,但實現ESB確實需要各種產品在運行時和工具方面的支持。IBM有很好的產品支持,運行時支持包括WebSphere ESB和WebSphere Message Broker;工具支持有WebSphere Integration Developer,支持用戶以圖形界面的方式來完成相關的開發任務,如發布服務、使用各種模式、轉換消息和定義路由等。
2.5 面向服務的編程模型:服務組件架構(SCA)和服務數據對象(SDO)
為了促進面向服務應用的開發,IT公司聯合起來,在2005年11月發布了服務組件架構(Service Component Architecture)和服務數據對象(Service Data Object)規范,這些公司包括IBM,BEA,Oracle,SAP等。
SCA的目標是大大地簡化服務開發,直接采用Web服務和XML開發服務,使得程序員工作在底層技術上,需要應付各種異構環境下的具體實現細節。其中,SCA定義和規范了技術中立和實現透明的服務組件、服務及服務調用和組裝;而SDO定義和規范了服務世界里的數據,這些數據對象擁有清晰定義的信息模型,獨立于數據源和具體數據訪問技術,使得服務訪問數據和在服務之間交換數據更方便、有效。
很多公司已經在J2EE平臺上支持了SCA/SDO,還提供了C++的版本。IBM WebSphere Process Server 6實現了SCA/SDO規范,提供了最新的SOA編程模型的支持,已經在很多實踐中被廣泛使用。
總結
以上是生活随笔為你收集整理的SOA 的基本概念及设计原则浅议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 也谈Javascript的效率,crea
- 下一篇: SOA 案例研究:SOA 设计