分佈式軟件體系結構風格
1、 三層C/S結構
2、 三層B/S結構
三層C/S結構(3-Tier C/S Architecture)
§第1層:用戶界面GUI—表示層——客戶機
§第2層:業務邏輯—功能層——應用服務器
§第3層:數據庫—數據層——數據庫服務器
基本組件:
–數據庫服務器
• 存放數據的數據庫、負責數據處理的業務邏輯;
–應用服務器
• 業務邏輯:對數據進行處理;
–客戶機應用程序
• GUI:用戶界面
§連接件:經由網絡的調用-返回機制或隱式調用機制
–客戶機ßà應用服務器:客戶機嚮應用服務器發送請求,並接收返回結果。
–應用服務器ßà數據服務器:應用服務器向數據服務器發送請求,並接收返回結果。
表示層:
§應用的用戶接口部分,擔負着用戶與應用之間的對話功能;
§檢查用戶從鍵盤等輸入的數據,顯示應用輸出的數據;檢查的內容也只限於數據的形式和取值的範圍,不包括有關業務本身的處理邏輯。
§爲使用戶能直觀地進行操作,通常使用圖形用戶界面GUI ,操作簡單、易學易用;
§在變更時,只需要改寫顯示控制和數據檢查程序,而不影響其他層;
§不包含或包含一部分業務邏輯。
功能層:
§應用系統的主體,包括大部分業務處理邏輯(通常以業務組件的形式存在,如JavaBean/EJB/COM等);例如,在製作訂購合同時要計算合同金額,按照定好的格式配置數據、打印訂購合同。
§從表示層獲取用戶的輸入數據並加以處理;
§處理過程中需要從數據層獲取數據或向數據層更新數據;
§處理結果返回給表示層。
§用戶檢索數據時,要設法將有關檢索要求的信息一次性地傳送給功能層,而由功能層處理過的檢索結果數據也一次性地傳送給表示層。
§通常,在功能層中包含有確認用戶對應用和數據庫存取權限的功能以及記錄系統處理日誌的功能。
數據層:
§數據庫管理系統DMBS,負責管理對數據庫數據的讀寫;
§接受功能層的數據查詢請求,執行請求,並將查詢結果返回給功能層;
§從功能層接受數據存取請求,並將數據寫入數據庫,請求的執行結果也要返回給功能層。
§數據庫管理系統必須能迅速執行大量數據的更新和檢索。現在的主流是關係型數據庫管理系統,因此,一般從功能層傳送到數據層的要求大都使用SQL語言。
優點:
§在用戶數目較多的情況下,三層C/S結構將極大改善性能與靈活性(通常可支持數百併發用戶,通過集羣可達數萬併發用戶);
§允許合理地劃分三層結構的功能,使之在邏輯上保持相對獨立性,能提高系統和軟件的可維護性和可擴展性——UI、BL、DB可以分別加以複用
§允許更靈活有效地選用相應的平臺和硬件系統,使
之在處理負荷能力上與處理特性上分別適應於結構清晰的三層; 並且這些平臺和各個組成部分可以具有良好的可升級性和開放性。
§應用的各層可以並行開發,可以選擇各自最適合的開發平臺和開發語言。
§利用功能層有效地隔離開表示層與數據層,未授權的用戶難以繞過功能層而非法的訪問數據層,爲嚴格的安全管理奠定了堅實的基礎。
§將遺留系統(舊版本的系統)移植到三層C/S下將非常容易;
缺點:
§三層C/S結構各層間的通信效率若不高,即使分配給各層的硬件能力很強,其作爲整體來說也達不到所要求的性能。
§設計時必須慎重考慮三層間的通信方法、通信頻度及數據量,這和提高各層的獨立性一樣是三層C/S結構的關鍵問題——分層風格的固有缺點。
程序:
(1)服務器端程序tcpServer.java
import java.io.*;
import java.net.*;
public class tcpServer{
publicstatic final int PORT=8888;
publicstatic void main(String[] args) throws IOException{
//建立ServerSocket
ServerSocket s=new ServerSocket(PORT);
System.out.println("ServerSocket:"+s);
try{
/*程序阻塞,等待連接。即直到有一個客戶請求到達,程序方能繼續執行*/
Socket ss=s.accept();
System.out.println("Socketaccept:"+ss);
try {
//連接成功,建立相應的I/O數據流
DataInputStream dis=newDataInputStream(ss.getInputStream());
DataOutputStream dos=new DataOutputStream(ss.getOutputStream());
//在循環中,與客戶機通信
while(true){
String str=dis.readUTF(); //從客戶機中讀數據
if(str.equals("end"))break; //當讀到end時,程序終止
System.out.println(str);
dos.writeUTF("Echoing:"+str); //向客戶機中寫數據
}
dos.close();
dis.close();
}finally{
ss.close();
}
}finally{
s.close();
}
}
}
服務器端運行結果爲:
ServerSocket:ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=8888]
Socket accept:Socket[addr=/127.0.0.1,port=7312,localport=8888]
測試:0
測試:1
測試:2
測試:3
測試:4
測試:5
(2)客戶機端程序tcpClient.java
import java.io.*;
import java.net.*;
public class tcpClient{
public static voidmain(String[] args) throws IOException{
//建立Socket,服務器在本機的8888端口處進行“偵聽”
Socket ss=newSocket("127.0.0.1",8888);
System.out.println("Socket:"+ss);
try{
//套接字建立成功,建立I/O流進行通信
DataInputStreamdis=new DataInputStream(ss.getInputStream());
DataOutputStreamdos=new DataOutputStream(ss.getOutputStream());
for(int i=0;i<6;i++){
dos.writeUTF("測試:"+i); //向服務器發數據
dos.flush(); //刷新輸出緩衝區,以便立即發送
System.out.println(dis.readUTF()); //將從服務器接收的數據輸出
}
dos.writeUTF("end"); //向服務器發送終止標誌
dos.flush(); //刷新輸出緩衝區,以便立即發送
dos.close();
dis.close();
}finally{
ss.close();
}
}
}
B/S三層架構:
瀏覽器/服務器(B/S)是三層C/S風格的一種實現方式
–表現層:瀏覽器
–邏輯層:• Web服務器• 應用服務器
–數據層:數據庫服務器
基本組件:
–數據庫服務器• 存放數據的數據庫、負責數據處理的業務邏輯;
–Web服務器/應用服務器• 業務邏輯:對數據進行處理;• 客戶端應用程序以網頁形式存放於Web服務器上;
–瀏覽器• 在客戶端上的瀏覽器中鍵入相應的網址
連接件:經由網絡的調用-返回機制或隱式調用機制
–瀏覽器ßàWeb服務器/應用服務器:瀏覽器向Web服務器/應用服務器發送請求,並接收返回結果。
–Web服務器/應用服務器ßà數據服務器: Web服務器/應用服務器向數據服務器發送請求,並接收返回結果。
優點:
基於B/S體系結構的軟件,系統安裝、修改和維護全
在服務器端解決,系統維護成本低:
–客戶端無任何業務邏輯,用戶在使用系統時,僅僅需要一個瀏覽器就可運行全部的模塊,真正達到了“零客戶端”的功能,很容易在運行時自動升級。
–良好的靈活性和可擴展性:對於環境和應用條件經常變動的情況,只要對業務邏輯層實施相應的改變,就能夠達到目的。
§ B/S體系結構還提供了異種機、異種網、異種應用服務的聯機、聯網、統一服務的最現實的開放性基礎。
§較好的安全性:在這種結構中,客戶應用程序不能直接訪問數據,應用服務器不僅可控制哪些數據被改變和被訪問,而且還可控制數據的改變和訪問方式。
§三層模式成爲真正意義上的“瘦客戶端”,從而具備了很高的穩定性、延展性和執行效率。
§三層模式可以將服務集中在一起管理,統一服務於客戶端,從而具備了良好的容錯能力和負載平衡能力。
§擴大了組織計算機應用系統功能覆蓋範圍,可以更加充
分利用網絡上的各種資源,同時應用程序維護的工作量
也大大減少
– B/S結構出現之前,管理信息系統的功能覆蓋範圍主要是組
織內部。
– B/S結構“零客戶端”方式使組織的供應商和客戶(這些供應商和客戶有可能是潛在的,也就是說可能是事先未知的)的計算機方便地成爲管理信息系統的客戶端,進而在限定的功能範圍內查詢組織相關信息,完成與組織的各種業務往來的數據交換和處理工作。
§ B/S結構的計算機應用系統與Internet的結合也使新近提出的一些新的企業計算機應用(如電子商務,客戶關係管理)的實現成爲可能。
缺點:
§客戶端瀏覽器以同步的請求/響應模式交換數據,每請求一次服務器就要刷新一次頁面;
§受HTTP協議“基於文本的數據交換”的限制,在數據查詢等響應速度上,要遠遠低於C/S體系結構;
§數據提交一般以頁面爲單位,數據的動態交互性不強,不利於在線事務處理(OLTP)應用;
§受限於HTML的表達能力,難以支持複雜GUI(如報表等)。
程序:
前臺界面代碼:
<%@ Page Language="C#" AutoEventWireup="true"CodeBehind="Default.aspx.cs" Inherits="TestWeb1._Default"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>前臺界面</title>
</head>
<body>
<formid="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
服務器代碼:
using System;
usingSystem.Collections;
usingSystem.Configuration;
using System.Data;
using System.Linq;
using System.Web;
usingSystem.Web.Security;
using System.Web.UI;
usingSystem.Web.UI.HtmlControls;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace TestWeb1
{
public partial class _Default :System.Web.UI.Page
{
protected void Page_Load(object sender,EventArgs e)
{
string strselect = "selectLoginName,UserName from Users";
string strCN =@"server=.\SQLEXPRESS;database=Business;Integrated Security=True";
SqlDataAdapter ad = new SqlDataAdapter(select_str,strCN);
DataSet ds = new DataSet();
ad.Fill(ds, "mytable");
DataTable dt = ds.Tables[0];
string str="<ul>";
foreach (DataRow row in dt.Rows)
{
str+="<li>"+row[0]+"||"+row[1]+"||"+row[2]+"<li>";
}
str += "</ul>";
Response.Write(str);
}
}
}
C/S+B/S混合體繫結構:
–混合原則一:“內外有別”的原則
–混合原則二:“查改有別”的原則
§混合原則一:“內外有別”的原則:
–企業內部用戶通過局域網直接訪問數據庫服務器
• C/S結構;
• 交互性增強;
• 數據查詢與修改的響應速度高;
–企業外部用戶通過Internet訪問Web服務器/應用服務器
• B/S結構;
• 用戶不直接訪問數據,數據安全;
§ “內外有別”模型的缺點是企業外部用戶修改和維護數據時,速度較慢,較繁鎖,數據的動態交互性不強
§混合原則二:“查改有別”的原則:
–不管用戶處於企業內外什麼位置(局域網或Internet),凡是需要對數據進行更新(維護和修改數據)操作的(Add, Delete, Update),都需要使用C/S結構;
–如果只是執行一般的查詢與瀏覽操作(Read/Query),則使用B/S結構。
§ “查改有別”模型體現了B/S體系結構和C/S體系結構的共同優點。
§但因爲外部用戶能直接通過Internet連接到數據庫服務器,企業數據容易暴露給外部用戶,給數據安全造成了一定的威脅。