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:保守分布

调用不同进程上对象的方法要比调用进程内对象的方法慢数
百倍;将对象移动到网络中的另一台计算机上,这种方法调用又会慢数十倍。

image

image

原则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

image

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

image

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引用的操作

posted @ 2009-09-08 11:46  badapple  阅读(491)  评论(0编辑  收藏  举报