分布式软件体系结构风格
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 [email protected]"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暴露给外部用户,给数据安全造成了一定的威胁。