dotnet分布式应用程序-总结分享-1
1讲述发展和组成
Com+ -Enterprise Sevices
.NET 中其实通过托管的Enterprise Service 跟 COM+ 应用架构交互。
COM+的几个主要特性: 比如队列服务、负载平衡、内存数据库、事件服务等。
在分布式程序中,性能比较高。但是只有Windows系统可以调用
.NET Remoting
在基于TCP,传送Binary数据条件下,性能可以与Com+媲美。
相比Com+更容易配置,而且有生命管理周期模型(类似DHCP Contract)。
PublicTO.NETAPP ,可以传递对象的远程的一个远程引用
选择iis作为宿主,性能比ws可能还差。还不如直接选择WS
选择window服务,性能好。需要开端口
选择was是最佳宿主(windows activation service IIS7,需要win2008 r2,vita)
当然也可以选择winform,console等等
适合在应用在性能要求比较高,各个应用程序基于。net开发而且企业局域网的场景下。
XML WebServices
在SOA概念兴起时,各个厂商都有自己的实现形式。而xml webservices是一个微软的实现。
之后微软详细提供了WebService-Enhancement,WSE,包括WS-Security、WS-Routing、WS-Attachments等更多技术。
由于这些大头们,有统一规范。所以是互操作性比较高,跨平台技术的典范
WSE(VS2005 插件),但是性能就一般了。传递的对象一个很浅的copy
其宿主环境是IIS。
适合在应用要求跨平台,跨防火墙,各个应用程序的开发平台各不相同,而且性能要求不苛刻的场景。
MSMQ 非即使的订单处理 ,离线脱机
NTService-Window服务 宿主环境,启动失败的模式都保证这是个稳定的环境
如第一次启动失败,第二次启动仍然失败.可靠的消息传递
适合构建离线消息和松耦合的系统。
2.分布式编程
分布式编程特点:让几个物理上独立的组件作为一个单独的系统协同工作。
假定:如果一台计算机能够在5 秒钟内完成一项任务,那么5 台计算机以并行的方式一起工作时就能在1 秒钟内完成一项任务。
问题:就在于“以并行方式协同工作”,很难让网络中的5台计算机高效协作。
分布式设计的5 个原则
原则1:保守分布
调用不同进程上对象的方法要比调用进程内对象的方法慢数
百倍;将对象移动到网络中的另一台计算机上,这种方法调用又会慢数十倍。
原则4:优先选用无状态对象,而不是有状态对象
原则5:接口编程,而不是具体实现的编程
可伸缩性
可伸缩性与性能
性能是用于测量当前系统运行的速度。
可伸缩性是用于测量当向系统中增加资源时的性能改善
● 垂直伸缩(按比例增加)。当使用新的、快速的硬件取代慢速硬件时,例如将Pentium 500 换成Pentium 1G,就是重直伸缩。
● 水平伸缩(按比例增加)。当为现有的应用程序添加额外的、负载均衡的服务器时,即可实现水平伸缩。这种伸缩可保护当前的硬件资源,并且如果其他的服务器损坏,它也会为应用程序提供相应的故障保护。在硬件方面,水平伸缩相对较便宜,
但是应用程序必须经过良好设计才能进行水平伸缩。
应用程序域
在传统的操作系统中,有进程与线程的概念。进程是win32程序运行的承载体,线程是程序的最小执行单元。但是在进程之间的交互是很麻烦的,且性能损失很大。
在.Net中推出的新概念:应用程序域。(进程的多个逻辑分区)。一个进程可以包含多个应用程序域,每一个应用程序域中承载一个.NET可执行程序,这样的好处如下:
应用程序域是.NET平台操作系统独立性的关键特性。这种逻辑分区将不同操作系统加载可执行程序的差异抽象化了。
和一个完整的进程相比,应用程序域的CPU和内存占用要小的多。因此CLR加载和卸载应用程序域比起完整的进程来说也快的多。
应用程序域为承载的应用程序提供了深度隔离。如果进程中一个应用程序域失败了,其他的应用程序域也能保持正常。
AppDomain的主要成员:
CreateDomain():该静态方法在当前进程中创建一个新的应用程序域。由于CLR能够根据需要创建应用程序域,所以必须调用这个方法的机会很少。
CreateInstanceAndUnwrap ():在指定程序集文件中创建指定类型的新实例。
Unload(): 卸载指定的应用程序域。
AppDomain之间的通讯
(要么把远程对象复制本地操作,要么通过代理操作远程对象。)
(Pass by Value/ Pass by Reference)
序列化
序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。
常见的序列化的方法主要也有三个:BinaryFormatter、SoapFormatter、XML序列化
字段NonSerialize
*BinaryFormatter
*SoapFormatter
属性XmlIgnore
*XmlSerializer
//buffer,socket,connectstring不可以被序列化
public void Serialize(Book book)
{
using (FileStream fs = new FileStream(strFile, FileMode.Create))
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, book);
}
}
public Book DeSerialize()
{
Book book;
using (FileStream fs = new FileStream(strFile, FileMode.Open))
{
BinaryFormatter formatter = new BinaryFormatter();
book = (Book)formatter.Deserialize(fs);
}
return book;
}
3..NET Remoting
pass by value(do it self)
pass by reference
server-activted sao 远程类空构造,不可以带参
singlecall stateless 状态无
singleton state 状态共享
client-activted cao state 状态私有
<?xml version="1.0"?>
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown type="RemoteObject.TestObject,RemoteObject" objectUri="TestObject.soap" mode="SingleCall"/>
</service>
<channels>
<channel ref="http"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>"
*renewoncalltime 隐式续约,类似低保的概念
每次调用远程对象上的方法或属性时,自动进行。
*ILease lease=RemoteObj.getLifttimeService()
lease.Renew()
显式续约
*sponsorshiptime 自定义续约(自己写一个类) (仅用于CAO)
Isponsor,MarshalByRefObject
ILease lease=RemoteObj.getLifttimeService()
lease.Register/UnRegister
4.Web Service
UDDI统一描述、发现和集成协议。有了它我们的Web services 就可以注册到UDDI中心.供其客户查找使用.
WSDL
Types: 定义WSDL定义中所用到的数据类型,即XML Schema Types;
Message : 对一组消息的输入和输出参数的定义;
portType : 定义Web服务的操作;
Binding :描述特定服务接口的协议、数据格式、安全性和其它属性.
Services : 制定特定服务的URL和提供的调用接口,包含一组端口元素.
这样Web services 就实现了自我描述.
SOAP
SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;
SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;
SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;
SOAP绑定(binding),使用底层协议交换信息。
发布webservice使用
[WebMethod(MessageName = "HelloWorldWithInt")]
public string HelloWorld(int i)
{
return "Hello World";
}
代码手动命令行生成
wsdl /l:cs /o:hello.cs service.wsdl
自动带有异步操作
E:\Documents and Settings\Administrator\Desktop\Code>wsdl /l:cs /o:hello2.cs htt
p://localhost:2067/Service1.asmx?wsdl
E:\Documents and Settings\Administrator\Desktop\Code>wsdl /l:cs /n:OriginalNS /o
:Original.cs service.wsdl
通过CSC或者VBC编译工具,生成相应的Dll文件
csc /target:library /out:proxy.dll Original.cs
在并行开发的项目中,只要拿到service.wsdl就可以做事了。当然这个需要手动完成web引用的操作