注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

My Unix World

不要迷恋Unix,Unix只是计算世界很小的一部分!

 
 
 

日志

 
 

【Copy】中间件入门  

2008-12-30 00:35:05|  分类: Middleware |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
文章1: 中间件技术概述
  中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必需要有一个通信中间件,即中间件=平台+通信,这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支撑软件和实用软件区分开来。

中间件定义及分类
   中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必需要有一个通信中间件,即中间件=平台+通信,这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支撑软件和实用软件区分开来。

  按照IDC的分类方法,中间件可分为六类。

  1.终端仿真/屏幕转换:用以实现客户机图形用户接口与已有的字符接口方式的服务器应用程序之间的互操作;

  2.数据访问中间件:是为了建立数据应用资源互操作的模式,对异构环境下的数据库实现联接或文件系统实现联接的中间件;在分布式系统中,重要的数据都集中存放在数据服务器中,它们可以是关系型的、复合文档型、具有各种存放格式的多媒体型,或者是经过加密或压缩存放的,这类中间件将为在网络上虚拟缓冲存取、格式转换、解压等带来方便。

  3.远程过程调用中间件:通过这种远程过程调用机制,程序员编写客户方的应用,需要时可以调用位于远端服务器上的过程;

  4.消息中间件:用来屏蔽掉各种平台及协议之间的特性,实现在不同平台之间通信,实现分布式系统中可靠的、高效的、实时的跨平台数据传输,实现应用程序之间的协同。这是中间件中唯一不可缺少的,是销售额最大的中间件产品,主要产品有国内东方通科技公司的TongLINK、BEA公司的BEA eLink 、IBM公司的MQSeries等,目前在Windows 2000操作系统中已包含了其部分功能。

  5.交易中间件:是在分布、异构环境下提供保证交易完整性和数据完整性的一种环境平台。在分布式事务处理系统中要处理大量事务,常常在系统中要同时做上万笔事务。在联机事务处理系统 (OLTP)中,每笔事务常常要多台服务器上的程序顺序地协调完成,一旦中间发生某种故障时,不但要完成恢复工作,而且要自动切换系统,达到系统永不停机,实现高可靠性运行;同时要使大量事务在多台应用服务器能实时并发运行,并进行负载平衡地调度,实现昂贵的可靠性机和大型计算机系统同等的功能,为了实现这个目标,要求系统具有监视和调度整个系统的功能。根据X/OPEN的DTP(Distributed Transaction Processing )模型规定,一个分布式交易处理系统应由事务处理、通信处理以及资源管理三部分组成。BEA公司的TUXEDO便是最著名的一个交易中间件产品,东方通科技公司的TongLINK 和TongEASY实现了DTP参考模型规定,另外还有IBM公司的TXSeriers是应用广泛的一个交易中间件产品。

  6.对象中间件:在分布、异构的网络计算环境中,可以将各种分布对象有机地结合在一起,完成系统的快速集成,实现对象重用,在这个方面遵循的标准是 CORBA。对象中间件将是未来的主流,目前产品如东方通的TONG BROKER,INPRICE公司的Borland Application Server。

  当然,IDC的分类并不能包含目前所有的中间产品,比较流行的还有:

Web服务器中间件
  浏览器图形用户界面已成为公认规范,然而它的会话能力差、不能作数据写入、受HTTP协议的限制等,就必需进行修改和扩充,形成了 Web服务器中间件,如 SilverStream公司的产品,BEA公司的BEA WEBLOGIC,东方通公司的TONG WEB。

安全中间件
  一些军事、政府和商务部门上网的最大障碍是安全保密问题,而且不能使用国外提供的安全措施(如防火墙、加密、认证等),必需用国产的产品。产生不安全因素是由操作系统引起的,但必需要用中间件去解决,以适应灵活多变的要求。如东方通公司的TONG SEC。

  为什么要中间件
   中间件是构件化软件的一种表现形式。中间件抽象了典型的应用模式,应用软件制造者可以基于标准的中间件进行再开发,这种操作方式其实就是软件构件化的具体实现。

  对于用户来说,选择中间件产品,主要是基于以下几个方面的好处:
   首先,中间件产品对各种硬件平台、操作系统、网络数据库产品以及Client端实现了兼容和开放。例如,曾有一位BEA的客户从IBM平台迁移到Sun 的平台,原来开发的200万行C语言代码仅仅花了3个小时就重新编译完成,没有遇到任何问题。如果没有中间件,这样的平台迁移势必将大费周折。

  其次,中间件保持了平台的透明性,使开发者不必考虑操作系统的问题。

  其三,中间件实现了对交易的一致性和完整性的保护,提高了系统的可靠性。

  其四,中间件产品可以降低开发成本,提高工作效率。The Standish Group分析了100个关键应用系统中的业务逻辑程序、应用逻辑程序及基础程序所占的比例,结果发现,业务逻辑程序、应用逻辑程序仅占总程序量的 30%,而基础程序却占了70%。如果以新一代的中间件系列产品进行组合应用,同时配合可复用的商务对象构件,则应用开发费用可望节省80%。

  其五,基础软件的开发还是一件耗时费力的工作,如果使用标准商业中间件,大部分的编程工作将得以节省,用户可以将注意力集中于个性化的增值应用方面,并缩短开发周期50%~75%,从而更快地将产品投放市场。


   中间件市场概况
   中间件是软件技术发展的一种潮流,被誉为发展最快的软件品种,近年来势头强劲,当然,这也是源于市场在全球范围内对中间件的支持。毫无疑问,中间件正在成为软件行业新的技术与经济增长点。
   1999年,Nasdaq股市上投资回报率最高的并非某些名声显赫的网站,而是全球最大的独立中间件厂商BEA公司,其股票升幅高达884.6%。时至今日,BEA的营业收入已连续18个季度保持高速增长。
   国际数据集团(IDC)在日前发表的一份报告中预计今后五年中间件市场将快速成长。IDC预计全球中间件和商业软件收入将从1999年的27亿美元增长到2004年的近97亿美元,增长255%。据GlobalSight公司预计,全球电子商务市场到2001年将达到1.2万亿美元。 ForresterResearch则估计,仅仅是BtoB电子商务,到2003年的年收入就将达到1.3万亿美元。而业内人士认为,未来基于 Internet的电子商务业务将有79%建筑在中间件的基础之上。无疑,这将带来一个潜力巨大的市场。
   在中国,有关数字同样让人兴奋,1998年中间件市场总值达12.34亿美元;1999年为17亿美元;预测到2004年将达到90.3亿美元,年增长率为39.7%,远远高于软件业的平均增长水平。

  几种流行中间件产品介绍

   IBM MQSeries
   IBM MQSeries是IBM的消息处理中间件。MQSeries提供一个具有工业标准、安全、可靠的消息传输系统。
   它的功能是控制和管理一个集成的系统,使得组成这个系统的多个分支应用(模块)之间通过传递消息完成整个工作流程。MQSeries基本由一个信息传输系统和一个应用程序接口组成,其资源是消息和队列。
   MQSeries的关键功能之一是确保信息可靠传输,即使在网络通信不可靠或出现异常时也能保证信息的传输。MQSeries的异步消息处理技术能够保证当网络或者通信应用程序本身处于“忙 "状态或发生故障时,系统之间的信息不会丢失,也不会阻塞。

   东方通科技 TongLINK/Q
   TongLINK/Q是面向消息的中间件。TongLINK/Q的主要功能是在不同的网络协议、不同的操作系统和不同的应用程序之间提供可靠的消息传送。
   * 高效、可靠、灵活的传输功能
   通过预建连接、多路复用、流量控制、压缩传输、断点重传、传输优先级管理、服务(类)驱动等机制来保证实现。
   * 事件代理机制
   事件代理机制提供了一种异步应用开发模型,用户只需要定义一个事件及怎么处理,TongLINK/Q自动完成操作。利用事件代理机制,可以实现事件订阅与发布,实现策略管理。
   * 会话管理
   TongLINK/Q通过一个简单的会话标识来描述一种复杂的通信关系,实现了更高层次、更抽象的通信服务。
   * 良好的易用性和可管理性
   TongLINK/Q实现了实时监控和管理,提供了日志机制、动态配置、远程管理功能。并提供多层次安全管理,支持多种开发工具。

   BEA Tuxedo 交易中间件
   BEA TUXEDO是目前最成功的中间件产品,它有以下特点:
   * 高速数据甬道机制,减少客户机与主机和数据库的联接,降低整个系统的负担
   * 提供名字服务和数据依赖路由机制,提高系统设计的灵活性
   * 提供7种客户机/服务器通讯方式,使应用开发灵活方便
   * 提供多个层面的系统负载均衡机制,能最有效地运用系统资源
   * 提供服务优先级机制,区分服务的不同级别,使重要服务得到最快的响应
   * 提供网络通讯压缩和加密机制,使通讯性能和安全性大大提高
   * 提供动态伸缩机制,方便应用系统的扩充和维护
   * 提供故障恢复等机制,保证应用的高可用性
   * 提供多个层面的安全机制,保证应用的安全性
   * 支持XA协议,保证涉及多场地、异构数据源交易和数据的一致性
   * 提供多个层面的应用管理机制,使应用管理方便容易
   * 提供网络调度功能,实现网络资源的充分利用并支持通讯失败的自动恢复
   * 与其他多种系统互联,保护用户投资
   * 支持异构系统数据格式的透明转换,方便系统扩展
   * 支持包括声音、图象在内的多种数据类型,不同编程语言数据格式的区别由TUXEDO自动转换(如C和COBOL),其中FML类型更支持网上只传输有效数据和可改变的多种数据类型组合等功能
   * 提供域的划分与管理功能,使超大规模应用成为可能
   * 提供DES(Data Entry System)功能,支持字符界面的开发
   * 支持国际化,可用中文显示诊断和系统消息
   BEA Tuxedo一个特色功能是能够保证对电子商务应用系统的不间断访问。它可以对系统组件进行持续的监视,查看是否有应用系统、交易、网络及硬件的故障。一旦出现故障,BEA Tuxedo会从逻辑上把故障组件排除,然后进行必要的恢复性步骤。
   BEA Tuxedo的另一个特色是提供多个层面的负载均衡。

=======================================================================================
  中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必需要有一个通信中间件,即中间件=平台+通信,这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支撑软件和实用软件区分开来。

  各种中间件和应用服务器产品一般都包括一个通信子系统,这个通信子系统的目的就是接受客户机和其它服务器实例的访问。由于应用范围和产品历史不同,这些通 信子系统也就千差万别。关于几种常用的中间件产品,比如IBM MQSeries,CICS/TXSeries和BEA Tuxedo的通信机制,是经常被软件工程师们讨论的话题,因为许多产品特性都是与此息息相关的。 我这里仅仅粗浅地介绍一下最表层的一些架构,希望能够抛砖引玉。

  首先,我想对比一下数据传输类中间件MQSeries与TPM类交易中间件CICS/TXSeries和BEA Tuxedo。MQSeries与CICS/TXSeries或BEA Tuxedo有很大的不同,因为MQSeries被设计为一个以异步数据通信为基础的中间件。MQSeries这类中间件的特点是“存储/转发”(对持久消息,直接保存到硬盘;对非持久消息,开始时 先保存到共享内存),而TPM中间件(包括TXSeries和Tuxedo)没有这个“存储”的功能 ,而侧重分布式的实时交易处理。数据传输类中间件MQSeries适于以下的应用场合:

  • 数据跨异种系统的可靠传输。
  • 高速地传送数据或请求,接收方一般不会因为工作量大而导致溢出或丢弃。
    这是因为数据传输中间件系统的接收器快速存储收到的数据而不急于进行处理和响应。
  • 消耗时间长的交易,或消耗时间长短不定的交易,或者是批处理作业。
    服务程序(MQ守护程序)可以高效率的执行批量交易和长时间交易,而完全不用考虑通信等待的问题,通信由相关的队列、通道和收听器来维护。
  • 工作量按时间分布不均匀的服务器系统。
    服务程序可以充分利用系统空闲的时间(比如夜间)工作。
  • 分布式的复杂系统
    分布式的复杂系统存在各种各样的意外事件和复杂情况,如果全部采用同步系统,一个工作点的失败可以导致整个系统的瘫痪。异步和“存储/转发”是解决相互等待的最佳途径。

  相对数据传输中间件MQSeries,TPM类交易中间件(CICS/TXSeries和BEA Tuxedo)有以下的优势:

  • 针对高速且有返回信息的交易,有极快的响应速度。
  • 强大的分布式事务处理的能力。
    MQSeries也支持两阶段提交,但异步的性质决定了它不能支持分布式应用的统一交易处理。
  • 完全屏蔽了通信层的工作,使开发更加简便,专注于业务系统。

  MQSeries的通信机制的核心是通道和收听器。通道设置决定了通信的协议、参数和相关方法。MQSeries的收听器有两种机制:基于inetd的 守护进程机制(amqcrsta),和基于线程响应的机制(runmqlsr)。这两种机制各有优缺点。runmqlsr的性能更出色, 但老版本的MQSeries在接收过多的连接时有一些问题。amqcrsta能支持更多的通道和客户访问,但可能造成系统资源更多的损耗。MQSeries v5.3以后,runmqlsr已经得增强 ,我个人认为这种方式更好。当然,无论如何,要接受更多客户机或通道的访问,必须调整qm.ini或Windows注册表的一些参数(MaxChannels, MaxActiveChannels, ListenerBacklog),以及一些相关的操作系统的内核参数。

  以客户机访问方式为例,MQSeries的每个客户机都与收听器(amqcrsta或runmqlsr)建立Socket连接,而MQSeries收听器通过IPC机制通知Queue Manager Agent (amqzlaa0)读写消息和队列。客户机访问方式采用的是短连接,而通道连接方式采用的是长连接。关于短连接和长连接的比较,后面还要加以讨论。

  CICS/TXSeries的通信处理与MQSeries的通道连接方式类似,使用长连接的方式。CICS/TXSeries的TCP/IP收听器 进程叫做cicsip,在v5.1以后,其功能大大增强。CICS/TXSeries使用一个LD:TCPProcessCount参数,其内部是用了 Socket的SO_REUSEADDR选项,支持多个收听器进程是用相同的IP和端口。这个特性大大简化了多并发情况的客户机设置,可以采用相同的服务 器收听器设置。当然这种特性会增加服务器收听器的设计难度。cicsip进程将请求写入请求队列,实际上是写入Region Pool中的共享内存。而每个应用服务器进程(cicsas)通过IPC机制读取请求,经过计算,返回信息到共享内存中的应答队列,再通过收听器返回客户 机。

  可以看出,CICS/TXSeries在内部使用了一个异步处理的方式,其目的是充分利用系统资源,达到最高的吞吐效率。但对外仍然是一个同步通信 的系统。但是与MQSeries不同,CICS/TXSeries没有任何存储数据或请求的操作,队列的容量和数据的生存期也远远小于MQSeries。 在这些方面,CICS/TXSeries与Tuxedo没有什么不同。

  但Tuxedo的通信机制还是有很多不同于CICS/TXSeries的方面:

  • CICS/TXSeries的通信设置很简单,只须设置一个收听器IP和端口就可以了。Tuxedo的通信设置可就多了,本地语言 (C, COBOL等)客户访问(WSL),Java Jolt访问(JSL),域连接(T/DOMAIN),集群等等都需要独立的网络设置,使用独立的收听器。而且还有很多看不见的端口被作为客户连接使用 (WSH),网络管理员在配置防火墙时要颇费一番脑筋。
  • Tuxedo使用短连接的方式,与MQSeries的客户机访问方式相似,但通信方式要复杂一些。以本地语言客户访问的收听器WSL为例:WSL在接收到客户请求后,立即释放连接,而客户机接着使用新建的连接与一个WSH进程继续通信。这种方式可以降低WSL的工作量。
  • Tuxedo的客户机程序直接与收听器建立Socket连接。CICS/TXSeries的客户机程序通过IPC与一个客户机守护程序(cclclnt)通信,该守护程序(cclclnt)与CICS/TXSeries的服务器建立一个Socket连接。

  目前MQSeries和Tuxedo的收听器还不支持复用IP地址和端口,所以如果有太多的客户访问或通道连接,需要增加新的收听器端口。

  从上面的讨论可以看出:MQSeries的通道连接方式以及CICS/TXSeries采用长连接的通信方式,MQSeries的客户机访问方式以 及Tuxedo采用短连接的通信方式。所谓长连接,就是一旦建立连接,一般的应用API不会中断该连接;所谓短连接,就是在一个完整的应用中先建立连接, 最后结束该连接,而且程序退出时必然切断连接。这两种通信方式对应用系统有着深刻的影响。

  短连接灵活方便,避免了下述很多长连接面临的棘手的问题:

  • 客户机异常中断,网络中断,包括Windows 9x之类的操作系统正常关闭,都不会通知服务器,造成服务器保持闲置无用的连接,长连接通常要等待“tcp_keepidle”之类的时间,这个时间默认 时一般是两个小时。这样会明显加重服务器的负载,无故占用相应的资源。MQSeries采用DISCINT和HBINT等通道参数来避免这个问题。
  • 如果仅仅是少量访问,建立长连接浪费过多的资源。MQSeries也是通过DISCINT和HBINT等通道参数来避免这个问题。
  • 网络相关的故障仅仅影响本次连接。短连接可以隔离故障的影响。

  当然,长连接也有自己的好处:

  • 长连接通信方式的好处是效率高,因为应用程序无须等待建立连接。
  • 诸如SNA之类的通信协议只能使用长连接方式。
  • 短连接是由应用建立的(例如MQSeries客户机的MQCONN调用,Tuxedo的tpinit调用)。短连接的关闭也许要等待2倍MSL (Maximum Segment Lifetime)的时间,大约1-4分钟。如果频繁地建立短连接,会在服务器造成大量暂时不能访问的等待关闭的socket连接(状态是TIME_WAIT),乃至造成客户机无法获得新的连接。
========================================================================================
  中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源;
  Web Services就是可以通过web描述、发布、定位和调用的模块化应用;
  组件就是对象;
  模式,即pattern。其实就是解决某一类问题的方法论;
  框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统;
  构件(component)是可复用的软件组成成份,可被用来构造其他软件。它可以是被封装的对象类、类树、一些功能模块、软件框架(framwork)、软件构架(或体系结构Architectural)、文档、分析件、设计模式(Pattern)等

  中间件作为一大类系统软件,与操作系统,数据库管理系统并称"三套车",其重要性是不言而语的.

那什么是中间件?

我们来看看以下的几种定义:
Middleware, is a layer of software between the network and the applications. This software provides services such as identification, authentication, authorization, directories, and security. In today's Internet, applications usually have to provide these services themselves, which leads to competing and incompatible standards. By promoting standardization and interoperability, middleware will make advanced network applications much easier to use.
同样,IDC给出的一个定义:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。

从这些定义中可以看出:
– 中间件是一类软件,而非一种软件;
– 中间件不仅仅实现互连,还要实现应用之间的互操作;
– 中间件是基于分布式处理的软件,最突出的特点是其网络通信功能。


  接着,我们再来看看什么是Web Services?
  Web Services就是可以通过web描述、发布、定位和调用的模块化应用。Web Services可以执行任何功能,从简单的请求到复杂的业务过程。一旦Web Services被部署,其他的应用程序或是Web Services就能够发现并且调用这个部署的服务。

  Web Services通过简单对象访问协议 (Simple Object Access Protocol,SOAP)来调用。SOAP是一种轻量级的消息协议,它允许用任何语言编写的任何类型的对象在任何平台之上相互通信。SOAP消息采用可扩展标记语言(XML)进行编码,一般通过HTTP进行传输。与其它的分布式计算技术不同,Web Services是松耦合的,而且能够动态地定位其他在internet上提供服务的组件,并且与它们交互。

  Web Services使用诸如SOAP消息这样的XML消息,通过一种良好定义的消息交换模式来调用。通过描述调用服务所必需的数据,Web Services描述语言 (WSDL)文档定义了消息交换模式。

一、组件概念
  简而言之,组件就是对象。C++ Builder中叫组件,Delphi中叫部件,而在Visual BASIC中叫控件。
组件是对数据和方法的简单封装。C++ Builder中,一个组件就是一个从TComponent派生出来的特定对象。组件可以有自己的属性和方法。属性是组件数据的简单访问者。方法则是组件的一些简单而可见的功能。
组件是C++ Builder环境中最令人激动的部分。使用组件可以实现拖放式编程、快速的属性处理以及真正的面向对象的设计。VCL和CLX组件是C++ Builder系统的核心。

二、组件应用
  使用现成的组件来开发应用程序时,组件工作在两种模式下:设计时态和运行时态。

  在设计时态下,组件显示在C++ Builder窗体编辑器下的一个窗体中。设计时态下组件的方法不能被调用,组件不能与最终用户直接进行交互操作,也不需要实现组件的全部功能。

  在运行状态下,组件工作在一个确实已经运行的应用程序中。组件必须正确地将自身表示出来,它需要对方法的调用进行处理并实现与其他组件之间有效的协同工作。

  设计时态下所有的组件在窗体中都是可见的,但在运行时态下不一定可见。如TTable、TQuery和TDataSet在运行时态下就不可见,但他们均完成了重要的功能。

三、组件创建

  创建组件就是自行设计制作出新的组件。
  设计组件是一项繁重的工作。自行开发组件与使用组件进行可视化程序开发存在着极大的不同,要求程序员熟知原有的VCL类库结构,精通面向对象程序设计。
设计组件是一项艰苦的工作。对于组件的开发者,组件是纯粹的代码。组件的开发不是一个可视化的开发过程,而是用C++或Object Pascal严格编制代码的工作。实际上,创建新组件使我们回到传统开发工具的时代。虽然这是一个复杂的过程,但也是一个一劳永逸的过程。
创建组件的最大意义在于封装重复的工作,其次是可以扩充现有组件的功能。

  组件创建过程包括设计、开发、调试(就是所谓的3D's)工作,然后是组件的使用。

  组件开发者应该掌握的三项主要内容是:属性、事件和方法。

模式,即pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。

Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。

模式有不同的领域,建筑领域有建筑模式,软件设计领域也有设计模式。当一个领域逐渐成熟的时候,自然会出现很多模式。

什么是框架?

框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。

构件(component)是可复用的软件组成成份,可被用来构造其他软件。它可以是被封装的对象类、类树、一些功能模块、软件框架(framwork)、软件构架(或体系结构Architectural)、文档、分析件、设计模式(Pattern)等。构件分为构件类和构件实例,通过给出构件类的参数,生成实例,通过实例的组装和控制来构造相应的应用软件,这不仅大大提高了软件开发者的开发效率,也大大提高了软件的质量。


  评论这张
 
阅读(361)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017