分布式軟件體系結構風格
1、 三層C/S結構
2、 三層B/S結構
三層C/S結構(3-Tier C/S Architecture)
§第1層:用戶界面GUI—表示層——客戶機
§第2層:業務邏輯—功能層——應用server
§第3層:數據庫—數據層——數據庫server
基本組件:
–數據庫server
• 存放數據的數據庫、負責數據處理的業務邏輯;
–應用server
• 業務邏輯:對數據進行處理;
–客戶機應用程序
• GUI:用戶界面
§連接件:經由網絡的調用-返回機制或隱式調用機制
–客戶機ßà應用server:客戶機向應用server發送請求,並接收返回結果。
–應用serverßà數據server:應用server向數據server發送請求,並接收返回結果。
表示層:
§應用的用戶接口部分,擔負着用戶與應用之間的對話功能。
§檢查用戶從鍵盤等輸入的數據,顯示應用輸出的數據;檢查的內容也僅僅限於數據的形式和取值的范圍。不包含有關業務本身的處理邏輯。
§為使用戶能直觀地進行操作,通常使用圖形用戶界面GUI 。操作簡單、易學易用;
§在變更時。僅僅須要改寫顯示控制和數據檢查程序,而不影響其它層。
§不包括或包括一部分業務邏輯。
功能層:
§應用系統的主體。包含大部分業務處理邏輯(通常以業務組件的形式存在。如JavaBean/EJB/COM等);比如,在制作訂購合同一時候要計算合同金額,依照定好的格式配置數據、打印訂購合同。
§從表示層獲取用戶的輸入數據並加以處理。
§處理過程中須要從數據層獲取數據或向數據層更新數據;
§處理結果返回給表示層。
§用戶檢索數據時,要設法將有關檢索要求的信息一次性地傳送給功能層。而由功能層處理過的檢索結果數據也一次性地傳送給表示層。
§通常,在功能層中包括有確認用戶相應用和數據庫存取權限的功能以及記錄系統處理日志的功能。
數據層:
§數據庫管理系統DMBS,負責管理對數據庫數據的讀寫;
§接受功能層的數據查詢請求。運行請求。並將查詢結果返回給功能層;
§從功能層接受數據存取請求。並將數據寫入數據庫,請求的運行結果也要返回給功能層。
§數據庫管理系統必須能迅速運行大量數據的更新和檢索。如今的主流是關系型數據庫管理系統,因此。一般從功能層傳送到數據層的要求大都使用SQL語言。
長處:
§在用戶數目較多的情況下,三層C/S結構將極大改善性能與靈活性(通常可支持數百並發用戶,通過集群可達數萬並發用戶)。
§同意合理地划分三層結構的功能。使之在邏輯上保持相對獨立性。能提高系統和軟件的可維護性和可擴展性——UI、BL、DB能夠分別加以復用
§同意更靈活有效地選用對應的平台和硬件系統。使
之在處理負荷能力上與處理特性上分別適應於結構清晰的三層; 而且這些平台和各個組成部分能夠具有良好的可升級性和開放性。
§應用的各層能夠並行開發,能夠選擇各自最適合的開發平台和開發語言。
§利用功能層有效地隔離開表示層與數據層,未授權的用戶難以繞過功能層而非法的訪問數據層,為嚴格的安全管理奠定了堅實的基礎。
§將遺留系統(舊版本號的系統)移植到三層C/S下將很easy;
缺點:
§三層C/S結構各層間的通信效率若不高,即使分配給各層的硬件能力非常強,其作為總體來說也達不到所要求的性能。
§設計時必須謹慎考慮三層間的通信方法、通信頻度及數據量,這和提高各層的獨立性一樣是三層C/S結構的關鍵問題——分層風格的固有缺點。
程序:
(1)server端程序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();
}
}
}
server端執行結果為:
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,server在本機的8888port處進行“偵聽”
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); //向server發數據
dos.flush(); //刷新輸出緩沖區,以便馬上發送
System.out.println(dis.readUTF()); //將從server接收的數據輸出
}
dos.writeUTF("end"); //向server發送終止標志
dos.flush(); //刷新輸出緩沖區,以便馬上發送
dos.close();
dis.close();
}finally{
ss.close();
}
}
}
B/S三層架構:
瀏覽器/server(B/S)是三層C/S風格的一種實現方式
–表現層:瀏覽器
–邏輯層:• Webserver• 應用server
–數據層:數據庫server
基本組件:
–數據庫server• 存放數據的數據庫、負責數據處理的業務邏輯;
–Webserver/應用server• 業務邏輯:對數據進行處理。• client應用程序以網頁形式存放於Webserver上;
–瀏覽器• 在client上的瀏覽器中鍵入對應的網址
連接件:經由網絡的調用-返回機制或隱式調用機制
–瀏覽器ßàWebserver/應用server:瀏覽器向Webserver/應用server發送請求,並接收返回結果。
–Webserver/應用serverßà數據server: Webserver/應用server向數據server發送請求,並接收返回結果。
長處:
基於B/S體系結構的軟件,系統安裝、改動和維護全
在server端解決,系統維護成本低:
–client無不論什么業務邏輯,用戶在使用系統時,只須要一個瀏覽器就可執行所有的模塊,真正達到了“零client”的功能,非常easy在執行時自己主動升級。
–良好的靈活性和可擴展性:對於環境和應用條件常常變動的情況,僅僅要對業務邏輯層實施對應的改變,就行達到目的。
§ B/S體系結構還提供了異種機、異種網、異種應用服務的聯機、聯網、統一服務的最現實的開放性基礎。
§較好的安全性:在這樣的結構中,客戶應用程序不能直接訪問數據,應用server不僅可控制哪些數據被改變和被訪問,並且還可控制數據的改變和訪問方式。
§三層模式成為真正意義上的“瘦client”,從而具備了非常高的穩定性、延展性和運行效率。
§三層模式能夠將服務集中在一起管理,統一服務於client,從而具備了良好的容錯能力和負載平衡能力。
§擴大了組織計算機應用系統功能覆蓋范圍,能夠更加充
分利用網絡上的各種資源,同一時候應用程序維護的工作量
也大大降低
– B/S結構出現之前,管理信息系統的功能覆蓋范圍主要是組
織內部。
– B/S結構“零client”方式使組織的供應商和客戶(這些供應商和客戶有可能是潛在的,也就是說可能是事先未知的)的計算機方便地成為管理信息系統的client,進而在限定的功能范圍內查詢組織相關信息。完畢與組織的各種業務往來的數據交換和處理工作。
§ B/S結構的計算機應用系統與Internet的結合也使新近提出的一些新的企業計算機應用(如電子商務。客戶關系管理)的實現成為可能。
缺點:
§client瀏覽器以同步的請求/響應模式交換數據。每請求一次server就要刷新一次頁面;
§受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>
server代碼:
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混合體系結構:
–混合原則一:“內外有別”的原則
–混合原則二:“查改有別”的原則
§混合原則一:“內外有別”的原則:
–企業內部用戶通過局域網直接訪問數據庫server
• C/S結構;
• 交互性增強;
• 數據查詢與改動的響應速度高;
–企業外部用戶通過Internet訪問Webserver/應用server
• B/S結構;
• 用戶不直接訪問數據,數據安全。
§ “內外有別”模型的缺點是企業外部用戶改動和維護數據時,速度較慢,較繁鎖。數據的動態交互性不強
§混合原則二:“查改有別”的原則:
–無論用戶處於企業內外什么位置(局域網或Internet),凡是須要對數據進行更新(維護和改動數據)操作的(Add, Delete, Update),都須要使用C/S結構;
–假設僅僅是運行一般的查詢與瀏覽操作(Read/Query),則使用B/S結構。
§ “查改有別”模型體現了B/S體系結構和C/S體系結構的共同長處。
§但由於外部用戶能直接通過Internet連接到數據庫server,企業數據easy暴露給外部用戶,給數據安全造成了一定的威脅。