由開放的面向服務架構聯合組織(OSOA)發起的,面向組件的架構(SCA)和服務數據對象(SDO)已經成為了開發面向服務的架構的最新方法。開始時這些開發只是集中在一些通用的開發環境中,如Java和C++,目前SCA和SDO已經開始進入到其他一些平台,在這裡我們將講解如何在PHP上包含一些SOA技術。
首先我們看看SDO能提供給你什麼。在一個典型的PHP應用中,數據一半來自關系數據庫,但是如果這個應用程序後來不僅僅只是從這兒獲取數據,而是從一個普通文本文件或者Web服務中獲取數據呢?這個問題很復雜,因為每種數據源都會要求有自己的獲取方式。
在這種情況下,PHP中SDO提供了一種處理數據源的透明方式。它不是單獨的處理每種數據源,而是提供了一種統一的訪問數據對象的方式。這種過程是通過數據訪問服務(DAS)來完成的,它是SDO架構上的一種中介方式。讓我們看看一個PHP中的SDO請求。
<?php
$providers = $company->shippingByGround;
foreach ($providers as $name => $value) {
echo "$name: $valuen";
}
?>
注意最後的請求是如何處理未知的數據源的,你不知道這裡數據是從哪裡提取來的,只是使用了PHP的SDO格式來做一個查找,而細節是由DAS完成的,PHP目前能夠支持獲取XML和關系數據庫的數據源。
SDO關心的是數據,而SCA使用了更加通用的類和組件來完成同樣的透明方式。從任何PHP類中訪問已有的業務邏輯需要強制開發者來圍繞一類特定的假設來做設計嗎?邏輯是否已在另外一個本地PHP類中?是否在網絡中存在了?是使用PHP編寫的嗎?
當以上提到的場景在各自的要求中是可滿足的話,那麼每個都需要使用不同的方法處理。
使用SCA方式,邏輯在哪裡存放就無關緊要了,更不要提使用何種語言來實現。那你一定會說:“這不是和一個普通的Web Service差不多嗎?沒什麼不同啊!”那麼我們舉個例子來看看PHP SCA組件裡包含了什麼。
<?php
include "SCA/SCA.php";
/**
* Calculate a shipment price for a given customer using a specific provider
*
* @service
*/
class ShipmentQuote {/**
* The customer discount fee service to use.
*
* @reference
* @binding.php ../DiscountFeeRate/DiscountFeeRate.php
*/
public $discountFee;/**
* The shipping service to use.
*
* @reference
* @binding.wsdl ../Shipper/ShipperQuote.wsdl
*/
public $shipper;/**
* Get a quote for a given customer using a specific provider
*
* @param string $shipping The shipping company
* @param string $customer The customer requiring shipment, in order to obtain discount rate
* @return float The quote for a given customer using a certain shipping provider.
*/
function getQuote($shippingCo, $customer)
{
$rateShip = $this->shipper->getShippingPrice($shippingCo);
$rate = $this->discountFee->getDiscountRate($customer);
return $rate * $rateShip;
}
}
?>
上文中最關鍵的就是包含@的語句部分,它們每個都提供了一種特定的SCA行為。最上層的@service標識,表示暴露一個類作為服務。在這個例子裡,最後的getQuote函數將會是服務暴露的唯一操作,通過使用@param和@return標識。
這個最後的服務的執行或者部署——將會被委托為一個PHP SCA運行時——將會將我們帶入一個創建WSDL合同的訪問點,就像你可以在網絡服務中看到的那樣。除了這種部署服務的方式的簡單性以外,SCA模型的真實優勢將會在你檢查getQuote代碼時越發體現的明顯。
注意到兩個語句$this-<shipper->getShippingPrice($shippingCo)和$this->discountFee->getDiscountRate($customer),它們是基於類中前面的應用。每個應用被其支撐服務鎖支持(由@reference和@binding標識來具體操作)在$discountFee用例中,這將是一個PHP類,而在shipper的用例中,這將是一個標准的WSDL基礎的服務。
盡管PHP的簡單和大量用戶群體的支持使得它成為構建web應用的一個好的選擇,但是它在企業應用的很多場景中能力有限,現在通過增加SCA和SDO,提供了對PHP和以往技術的強力支持,它也和其他主流語言一樣,可以參與到面向服務的潮流中了。
【相關文章】