首页 > 代码库 > 第十一章 分布式应用程序
第十一章 分布式应用程序
第十一章分布式应用程序
使用网络的应用程序,称为分布式应用程序(distributed applications),现在,已经越来越重要。幸运的是,.NETBCL 和其他的库提供了许多结构,使得通过网络通信变得容易,进而,用 F# 创建分布式应用程序也是很简单。
网络概述
已有几类分布式应用程序,通常分为:客户端-服务器(client-server)应用程序,其中客户端向中央服务器的请求;点对点应(peer-to-peer)用程序,萨满教这里,计算机之间相互交换数据。这一章,我们将重点学习客户端-服务器应用程序,由于这是目前更常见的。
不管你想创建哪种分布式应用程序,计算机之间的数据交换都是由协议控制的。协议(protocol)是一种标准,定义了通过网络进行通信的规则。
构建网络应用程序通常考虑的一项最具挑战性的任务,程序员有好的理由才可以执行。当创建应用程序时,必须考虑三个重要需求:
可伸缩性(Scalability):应用程序被许多用户并行使用时,必须保持响应。通常,这就需要广泛地测试与分析服务器代码,保证能在高负载下的执行。
容错(Fault tolerance):网络本来就不可靠,因此,写的代码不应该假定网络永远是好的;如果你这样做了,应用程序对于最终用户来说可能是令人沮丧的。每个应用程序都应尽力保证通信错误能够顺利处理,给用户适当的反馈,显示出错信息,也可提供诊断和重试的机会,不要因为网络故障而使应用程序崩溃;还应该考虑数据的一致性(即,能够保证所有必须的更新在到达目标计算机时保持数据一致吗?),使用事务(transactions)和关系型数据库存储数据可以帮助做到这一点。根据应用程序的类型不同,也可以考虑种离线模式,为用户提供访问本地数据的能力,当网络以后可用时,再响应网络请求。是大多数的电子邮件的客户端都提供了这种离线模式。
安全(Security):每个应用程序都有安全的问题,但是,在网络编程中安全极其重要。这是因为,一理把应用程序公开到网络上,也就开放了,网络上的所有用户可以攻击;因此,如果应用程序公开到互联岗上,就会有数千甚至上百万的潜在攻击者。通常,需要考虑的包括,需要跨网络传输的数据安全,签名保证它不被篡改,或者加密确保只有适当的人可以读;也要保证连接到应用程序的人经过认证和授权,知道他是谁,想做什么。
幸运的是,现代程序员不需要自己动手,而是由网络协议帮助解决这些问题。例如,如果我们想发送的数据很重要,不希望网络其他人读取,我们并不需要自己来加密数据,相反,应使用网络协议提供的功能。这些协议以库中的组件形式公开,为我们实现了这些功能。协议的类型、使用的库,由应用程序的需求决定。有些协议提供了加密和认证,而有些则没有;有些是用于客户端服务器应用程序,而有些适用于点对点应用程序。在这一章,我们将学习下面的组件和库,以及它们所实现的协议:
TCP/IP 套接字(sockets:):为应用程序(客户端服务器、点对点)提供了大量的网络传递控制;
HTTP/HTTPS 请求:支持网页向服务器的请求,通常只为客户端服务器应用程序;
网站服务:公开应用程序,使其他应用程序可以请求服务,通常只为客户端服务器应用程序;
Windows 通信基础(WindowsCommunication Foundation,WCF):扩展网站服务,为现代程序员提供更多功能支持,包括但不限于,安全性、事务,同时为客户端服务器、点对点应用程序。
这些协议是彼此相接的,TCP/IP 是最低层的编程接口(API),Windows 通信基础是最高层的编程接口,网站服务是独立于Windows 通信基础的,但是,由于Windows 通信基础也实现了网站协议,因此,可以认为网络服务是Windows 通信基础的子集。图 11-1 是这些协议彼此关系的概览。
图 11-1 .NET 网络编程应用程序接口概览
尽管分布式编程天生具有挑战,不这,通常还是值得学习的,因为它可能够访问我们感兴趣的数据,与其他人共享我们程序的结果。到本章结束,我们就能写出这样的程序,包括客户端服务器式聊天程序,读 RSS(称为简易信息聚合,或聚合内容)订阅,访问保存在谷歌电子表格中的数据,在推特(Twitter)上找出所有的朋友,以及创建网站服务和Windows 通信基础服务。
在网络上提供用户界面的简单方法是开发网站应用程序,网站应用程序不在这里讨论,可以参考第八章的“ASP.NET”一节。