基于.NET环境的分布式应用系统开发技术
1 ASP.NET提供的分布式应用程序的基本原理
1.1 分布式应用程序结构
分布式应用程序的主要原则是将应用程序逻辑地分为3个基本层:
(1) 表示;
(2) 业务逻辑;
(3) 数据访问和存储。
通过按照这些原则对应用程序进行分层,使用基于组件的编程技术,并充分利用.NET平台与Microsoft Windows 操作系统的功能,开发人员可以生成具有高度可伸缩性和灵活性的应用程序。
1.2 表示服务
表示层包括到应用程序的Web客户端接口。利用 ASP.NET Web 应用程序和 XML Web services,Web客户端能够以可视形式为应用程序提供丰富、灵活和交互的用户界面。Web客户端还具有在平台之间提供更大程度的可移植性的优点。
1.3 业务逻辑/应用程序服务
该层被分为应用程序服务器与服务,它们可用于支持客户端。可以使用 .NET Framework 编写 Web 应用程序以利用 COM+ 服务、消息队列 (MSMQ)、目录服务和安全性服务。应用程序服务反过来可以与数据访问层上的若干个数据服务进行交互,包括“业务外观”层和“业务规则”层。
1.4 数据访问和存储服务
“数据访问项目”层执行从数据库(或其他数据服务)获取数据或向数据库发送数据的功能。在分布式应用程序结构中,相应功能使用 ADO.NET 数据适配器和 SQL 服务器存储过程来完成。
2 应用系统分布式架构的实现
2.1 数据层
2.1.1 采用的数据库
数据库采用SQL Server 2000,该数据库引擎集成了对XML的支持,同时具有可扩展、易于使用和安全的特点,是开发WEB应用系统最好的数据存储设备之一。本文后面举例的数据库是作者单位的技术管理数据库系统。
2.1.2 采用SQL语言创建数据库表及存储过程
为了便于数据库从开发的机器移植到正式使用的服务器上,数据库的创建,数据库表的建立以及存储过程的建立没有采用企业管理器,而是都采用SQL语句进行编写,保障了数据库的可移植性。
2.2 业务层
2.2.1 XML Web services的基本原理及基础结构
XML Web services 是一些应用程序,这些应用程序采用标准协议(如 HTTP、XML、XSD、SOAP 和 WSDL)在可伸缩的、松耦合和无状态环境中提供交换消息的功能。XML Web services 使在异类环境中生成模块化应用程序成为可能,并使得这些应用程序可与各种平台和设备进行互操作。这些应用程序基于 SOAP 的 XML 消息具有显式定义部分(结构化的和类型化的)或不严格定义的部分(使用任意 XML)。在不破坏协议的情况下,消息随着时间不断发展的能力是 XML Web services(XML Web services 用作将来 Web 的生成块)的灵活性和可靠性的基础。虽然数据和应用程序逻辑的远程访问不是一个新概念,但以松耦合的方式进行这种操作却是一个全新的概念。XML Web services 的客户端和 XML Web services 之间的唯一假设是接收者理解其接收到的消息。这样,用任何语言编写的、使用任何组件模型和在任何操作系统上运行的程序都能够访问 XML Web services。
XML Web services 的基础结构提供定位 XML Web services 的发现机制、定义如何使用这些服务的服务说明以及通信时使用的标准连网形式。
2.2.2 系统实现的XML Web services服务的主要功能
本系统开发的XML Web services 组件主要包括了以下两个主要的功能:
(1) 保存数据连接和数据集定义,然后将添加 XML Web services 方法以公开此数据集,这使其他应用程序能够查看和修改此数据集;
(2) 创建了若干私有成员来实现录入、修改、查询等各种方法,XML Web services 将公开这些方法,它们包括数据集定义、数据适配器、数据连接和若干从数据库中检索数据和更新数据库的命令对象。
2.2.3 创建和配置数据库连接和数据集架构
(1) 建立XML Web services项目
以有害作业场所管理为例,要调用其数据表harmplace,为此建立Web服务http://servername/harmplaceWebservice,在该项目中建立harmplaceService.asmx文件,有害作业场所相关的Web服务内容都在该文件中。
基础
网络架构
全异步系统(没有blocking, 可达到各组件最好的综合利用率)
CAP & BASE
弱事务
网络框架
基本原理:
reactor,proactor, half-sync/half-async, active object, monitor object
C
libevent
成功案例: memcached, thrift
C++
ACE
Boost ASIO(封装变化,生命周期钩子暴露很到位,但是流程被拆离了)
JAVA
Grizzly(SUN Glassfish)
MINA(Twitter MQ)
RPC
RPC框架
thrift
RPC类型: 静态idl数据结构+service描述
调用方式: 支持同步方式调用, sendonly方式.
编解码协议: thrift
支持通信协议: tcp
跨语言: 支持. c++, java, php, ruby, python, erlang, coca, php(client only)
支持协议多版本
不支持容器托管
RPC容器
POSA中视RPC容器为RPC框架的升级版本
ICE
RPC类型: 静态idl数据结构+service描述
支持同步方式, sendonly, 异步future, AMI, AMC等方式.
支持通信协议: udp, tcp, ssl
跨语言: 支持. c++, java, php, ruby, python, erlang, coa, php(client only)
支持协议多版本
支持容器托管
动态RPC框架
Hessian
对于java语言是动态的.无需idl
Avro
json型的自描述格式.无需idl. 单次传输schema.可兼容多版本.
request/ response类型的rpc 是同步语义,不适合分布式多组件通信.
ACT或者Future型rpc在开发上面比较烦琐.
惟有基于message驱动的消息中间件适合分布式异步环境, 尤其是适合信令,小数据通信.
大数据传递就适合临时启用socket pipeline方式进行流式传递.
颠覆: 化异步为同步
协程 coroutine
协程的概念其实90年代就有人提出了.
erlang的进程模型就是一个很好的协程实现.
协程的概念同样也可以运用到其它语言当中.比如c++中.
c++中使用协程可以基于glibc自带的ucontext或者第三方ptr库来做.
如下是c++协程方面的库:可以
libcoro
libcoroutine
通过coroutine, 我们可以用同步编程语义来构建异步网络程序.
预编译方式
这个方法比较适合用在java中,因为java下面比较方便一些.比如可以使用jdt插件对java代码作一次预编译替换(可以参考GWT的相关套路).
进而把同步程序透明改造成异步.