SOA面向服務架構首先Martin Fowler提出SOA歧義Service Oriented Ambiguity,認為'什么是SOA'是不可能回答,因為不同的人意味著不同的事情,SOA意味服務接口,意味流程整合,意味資源再利用,意味著管制,在下面SOA組件圖中,服務和服務消費者(客戶端)之間存在多個約束,當一個服務顯式暴露后,客戶端能夠通過綁定定位到該服務,相當于兩者簽訂了合同,規定了合同內容和如何實施,具體合同的描述是通過消息方式進行: 由于Java等傳統語言主要是以類表達對象,將功能行為封裝在類內部,而業務客戶一般都是注重軟件的功能,包括同行業公司系統之間數據交流也是以功能服務為接口,因此,面向服務的架構SOA更加貼近業務客戶,也更適合業務伙伴之間流程整合,各個行業已經誕生自己行業特點的SOA,例如電信聯盟的NGOSS,已經成為電信行業業務支撐系統BOSS的標準。SOA不但是技術用語,也是業務銷售用語,通過服務這個中間概念,可以實現業務和技術之間的無縫轉換,如今SOA已經和REST DDD以及云計算等新技術方法結合。其內部主要概念有SCA ESB JBI等等,涉及工作流 規則引擎 消息總線等多個技術細節方面。 通常,一個架構師進行系統架構頂層設計時,必須考慮使用者的利益,不能單單實現軟件的功能,還要考慮到軟件的性能Scalable 可用性available/usable 安全性等軟件質量,還要借鑒社區的最佳實踐和經驗形成的模式和反模式,避免重蹈覆轍和陷阱,再大膽采取最新的軟件技術(比如用REST替代SOAP等)。 服務的提出其實隱含了兩個概念,服務提供者和服務消費者,這兩者之間有一個合同約定,這非常類似我們現實生活中簽訂的服務合同,A單位和B單位分別是服務的提供者和消費者,兩者簽訂了一個服務合同,規定A為B提供某項服務。服務就是提供一些公共需求的設施,通過一個工作過程能提供幫助,使用,讓使用者受益。 服務具體有如下:Windows Service:如PC定位者RPC Locator, 事件日志EventLog, DHCP Client,;. 軟件服務Software Service,如分布式服務Distribution Service, 警告服務Alert Service 安全服務 Security Service, 日志服務;業務服務Business Service,如 賬號和客戶服務,銷售服務,訂單服務,采購服務。 服務兩個重要特點:自治和管制,自治代表服務不能被外部勢力牽制,比如如果一個服務內部處理中需要調用外部資源或等待外部流程結束,這種等待不能影響服務本身的調用,如果一個服務分為顯式對外和隱式內部兩個部分,那么自治是針對隱式內部,意味著我們不能在具體一個服務中直接使用同步代碼實現復雜功能。如: public AServiceImpl implements AService{ public void productSale(...){ Product product = productService.getProduct();
} } 在AServiceImpl的productSale方法中,我們獲得商品的庫存和定價,都是通過同步的RPC實現調用的,這樣造成productSale方法依賴于InventoryService和priceService,無法實現自身自治。 實現服務真正自治,實際就是解決類之間依賴耦合的問題,消息是一種方式,但是基于消息又有兩種通訊方式,基于請求響應和基于事件的EDA。 從服務自治可以看出,為什么要提出服務必須自治,因為服務是受管制的,在實際業務活動中,不同服務是被不同部分管理,比如定價服務歸屬財務部門系統,庫存歸屬倉庫系統,涉及系統之間調用協調不能自己使用同步RPC,而是需要消息。 在實際應用中,很多單位使用SOA主要看中其能夠無縫整合新舊系統,稱為EAI企業應用整合,下圖是蘇寧的一種SOA圖,使用ESB企業服務總線這樣的消息系統整合了新舊各種系統。 使用SOA和ESB能夠靈活實現業務流程管理,工作流的管理BPM,如下圖,一個訂單的產生可能需要幾個部門批準才能完成,而且這幾個部門經常是變化的,如何靈活實現這種批準流程的定制也成為SOA實現的一部分,如下: 注意圖中1 2 3 4 5 6 7 8 9標注的訂單處理流程步驟,這種不同服務之間調用處理順序可通過BPM進行靈活定制。 目前提供SOA全套解決方案和產品的廠商很多,包括IBM SAP和Oracle,國內金蝶用友浪潮軟件等等,比如蘇寧的SOA是以SAP為主的八國聯軍組裝,既然SOA中間件服務商已經為我們提供了成熟的架構方案和產品,那么作為SOA使用者是否就無需頂層架構設計了呢?當然不是,SOA使用者要根據自己業務進行模塊劃分,進行領域建模設計,根據DDD領域驅動設計將業務分解為一個上下文模塊,然后再用服務作為對外接口,內部封裝的是DDD聚合根,而傳統SOA作法是內部封裝的是數據表的DTO,從而導致SOA服務內部腐爛堵塞,違背SOA自治和可用性等原則約束。具體可見DDD領域驅動設計。 SOA的好處1. 松耦合:由于服務自治,有一定封裝邊界,服務調用交互是通過發布接口。這意味著應用程序不感興趣的服務如何被實現。 SOA基礎
EAI集成
Web服務
BPM工作流
SOA最佳實踐
相關主題EDA專題微服務架構Reactive編程CQRS架構中間件NGOSS是什么?JBPMEBAY架構LinkedIn架構更多 SOA 討論分布式系統
|
|