SOA 面向服務框架設計與實現

 

文章節選自 《Netkiller Architect 手札》php

 

因爲Java 語言的編譯與重啓不可抗拒缺陷,所選擇使用PHP彌補這個缺陷。css

在合適的場景中使用PHP 爲 Java 提供 SOA 服務有不少優點,最大的優點就是升級,可以隨時升級,即時生效,服務不中斷。html

 

任何一種語言都有其擅長的一面,多種語言互補是一種趨勢。nginx

 

14.4. Service-oriented architecture (SOA)

SOA 與 REST不少相同之處,目前SOA主要是基於SOAP實現,也有基於MQ的實現。而REST只限於HTTP POST/GET/PUT/DELETE等等。git

我我的比較喜歡機遇TCP的SOA實現,不喜歡SOAP大量XML傳輸。github

14.4.1. SOAP實現

這裏提供一個簡單的機遇SOAP實現的SOA框架web

index.php入口文件sql

<?php
define ('CONFIG_DIR', '../config/');
define ('LIBRARY_DIR', '../library/');
define ('DEBUG', false);
//define ('DEBUG', ture);

require_once(CONFIG_DIR. 'default.php');
$remote_addr = $_SERVER['REMOTE_ADDR'];
if(!in_array($remote_addr, $firewall)) {
	printf("Permission denied: %s", $remote_addr);
	exit(0);
}

$request_uri = $_SERVER['REQUEST_URI'];
$classspath = LIBRARY_DIR.strtolower($request_uri)  . '.class.php';
if( is_file($classspath) ){
	require_once($classspath);
}else{
	die("Cannot loading interface!");
}

$class = ucfirst(substr($request_uri, strrpos($request_uri, '/')+1));
if( DEBUG ){
		printf("%s<br>",$class);
}

if (class_exists($class)) {
    $server = new SoapServer(null, array('uri' => "http://webservice.example.com"));
	$server->setClass($class);
	$server->handle();
}else{
	die('Object isnot exist.');
}

接口文件數據庫

<?php
require_once('common.class.php');

class Members extends Common{
	private $dbh = null;
	public function __construct() {
		parent::__construct();
		$this->dbh = new Database('slave');
	}
	public function getAllByUsernameAndMobile($username,$mobile){
		$result = array();
		if(empty($username) or empty($mobile)){
			return($result);
		}
		$sql = "SELECT username, chinese_name, sex FROM members m, members_digest md WHERE m.id = md.id and m.username= :username and md.mobile = md5( :mobile );";
		$stmt = $this->dbh->prepare($sql);
		$stmt->bindValue(':username', $username);
		$stmt->bindValue(':mobile', $mobile);
		$stmt->execute();
		$result = $stmt->fetch(PDO::FETCH_ASSOC);
		return($result);
	}
	public function getAllByLimit($limit,$offset)
	{
		$sql = "SELECT username FROM members limit ".$limit.",".$offset;
		$stmt = $this->dbh->query($sql);
		while ($row = $stmt->fetch()) {
			//printf("%s\r\n", $row['username']);
			$result[] = $row['username'];
		}
		return $result;
	}
	function __destruct() {
       $this->dbh = null;
   }
}

客戶端調用實例安全

<?php

$options = array('uri' => "http://webservice.example.com",
                'location'=>'http://webservice.example.com/members',
				 'compression' => 'SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP',
				'login'=>'neo',
				'password'=>'chen',
                'trace'=>true
				);
$client = new SoapClient(null, $options);

try {

	print_r($client->getAllByUsernameAndMobile('280600086','13113668890'));
	print_r($client->getAllByLimit(20,20));

}
catch (Exception $e)
{
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

Nginx 虛擬主機配置文件 /etc/nginx/conf.d/webservice.example.com.conf

server {
    listen       80;
    server_name  webservice.example.com;

    charset utf-8;
    access_log  /var/log/nginx/webservice.example.com.access.log  main;
    auth_basic            "Login";
    auth_basic_user_file  htpasswd;

    location / {
        root   /www/example.com/webservice.example.com/htdocs;
        index  index.html index.php;
		if ($request_filename !~ (js|css|images|robots/.txt|.*\.html|index/.php) ) {
	            rewrite ^/(.*)$ /index.php/$1 last;
		    break;
		}
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ /index.php/ {
        root           /www/example.com/webservice.example.com/htdocs;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /www/example.com/webservice.example.com/htdocs$fastcgi_script_name;
        include        fastcgi_params;
    }

}

每增長一個功能需求,在library中建立一個 Class 文件便可。

index.php 有IP過濾功能,禁止非法IP訪問

客戶端採用壓縮傳輸,節省xml傳輸開銷

Nginx 設置了HTTP認證,防止他人探測,另外提示你還能夠採用雙向SSL認證。

 

有興趣能夠看看這個項目:

 

https://github.com/netkiller/SOA

 

延伸閱讀

數據庫安全·保護表

數據庫安全·保護表字段

數據庫安全·時間一致性

 

 

數據庫安全·爲數據安全而分庫

 

數據庫安全·內容版本控制,撰改留痕

數據庫安全·用戶/角色認證

數據庫安全·Token 認證

數據庫安全·數據加密

數據庫安全·開發加密插件

數據與應用程序間通訊·UDP Socket

 

關注做者公衆號,每日推送原創文章。若是已有什麼建議,請給我留言。

相關文章
相關標籤/搜索