服务器的设计与开发涉及到诸多技术和问题,归纳一下大致可以分为以下几种:
服务器启动和接收数据过程
多线程策略
NIO
长连接
同步与异步
配置化支持
责任链模式
集群与负载均衡
数据包设计
服务端连接协议
客户端连接技术
服务器启动和数据请求过程
各种服务器所提供的功能和实现机制都不尽相同,但在启动和数据请求这块都长得差不多,遵循固定的一些流程和模式,启动过程一般按一下流程:
1)以main方法的形式提供由外部脚本触发的入口
2)载入配置文件,解析并构建上下文
3)初始化各个组件和资源
4)注册和启动监控和管理组件
5)启动连接监听
数据请求过程一般按一下流程:
1)侦听Socket
2)包装Connection
3)解析并包装数据
4)请求处理
5)向client发送处理结果
多线程策略
多线程的策略一般可以采取两种方式,一种是每一个线程负责监听、处理和返回结果所有事情,另外一种是把监听、接收、处理分开,各自都有独立的线程去处理。第一种策略比较简单,适用于处理不复杂的场景,图示如下:
第二种方式把一个较长的请求处理过程分割开,区分对待,这样能提高系统的吞吐量,比较适用与较为复杂的请求处理场景,图示如下:
apache perfork在此基础上还有个main进程对这些work子进程进行管理,会根据请求的繁忙程度来调整work进程的数目,这也是可以借鉴的。
NIO
NIO的特性非常适用于网络服务器的接收数据这块,因为不是每时每刻都有数据请求,因此没必要搞一堆Accept线程在那里监听等待,以Tomcat6的NIO接收数据为例:
Amoeba也是采用NIO来接收数据流:
长连接
长连接顾名思义就是客户端与服务端保持连接,而不是每次请求都新建连接并在请求完后关闭连接,好处有以下几点:
减少新建和销毁线程所带来的代价
减少线程上下文切换带来的代价
适用与服务端需要监控客户端状态的场景,不需要通过客户端定时轮询来完成
建立了服务器主动向客户端推的通道
性能上与短连接的差异可以见以前的博文 构建高性能web之路------web服务器长连接
同步与异步
一般的情况下服务器端处理客户端请求都是同步的,客户端请求提交后会在一定的超时时间里等待服务器的response,这比较适用于短时间里能处理完的请求,但如果一些请求,比如文件上传,在规定的超时时间里没法处理完,这样异步的处理就比较合适了,所谓异步就是客户端的请求提交后就可以结束这次请求,不用等待response返回,在服务端处理完后主动把结果通知给客户端。Tomcat6推出的Comet技术即就是异步处理的典型,通过Comet技术,客户端所需要的response信息不再需要主动的去索取,而是在服务器端以event的形式推至客户端。更多Comet的信息可见Tomcat官方文档
配置化支持
服务器的各种参数,比如线程池大小、连接协议等等,需要暴露出来可以配置,因此需要有配置管理机制。一般说来配置文件多以xml或properties形式提供。对于properties比较简单,只是很难体现层次化结构,解析起来比较简单,通过Properties类就能很方便地进行解析。而xml体现的信息更友好、更清晰,解析xml的方法比较多,一般用以下几种:
SAX
DOM
JDOM、DOM4j、Digester等
前面两种比较原生态,SAX和DOM的区别就不再累述,JDOM、DOM4j和Digester都是基于前两种以上的开源框架,可以更加方便地调用。个人感觉如果xml不够复杂,不必使用太多的框架,原生态的东西就够用了。
解析完配置文件后,一般可以用更加有语义化的java bean来存储这些配置信息,这样可以更加方便其他模块的调用
责任链模式
责任链模式在服务器设计开发中比较常用,责任链模式的类图如下所示:
责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。Tomcat主要的架构pipeline-valve就是基于责任链模式。
通过责任链模式可以比较方便扩展对每次请求的处理,并且能很清新地明确各种处理之间的顺序和依赖关系
集群与负载均衡
为了保持集群实现简单,并更容易地实现横向扩展,尽量做到服务器之间无状态性,若需要状态可以参考Darkstar用集中式的Data service来抽象,保持逻辑处理的服务器是独立和平等的。在负载均衡这块可以采用硬负载(如F5)或软负载(LVS),这些都是比较成熟的方案,但如果负载均衡仍然是系统的瓶颈,可以采用客户端负载均衡的做法,客户端做路由的机理如下图所示:
1)当服务端ready后,会和配置中心建立连接,把自身状态信息发送到配置中心
2)当客户端ready后,会和配置中心建立连接,把所需要服务的相关信息和路由策略同步到本地
3)服务端有变动时,比如有机器宕机或迁移,配置中心会感知,并把改动立刻同步到客户端
4)客户端依据本地的路由信息直接与服务端通信
这种机制的最大优点就是客户端与服务端直接通信,消除了loadBalance单点,但也具有明显的缺点,也就是很难做到按照服务器空闲情况进行很智能的均衡负载,并且服务端的变动也很难立刻同步到客户端。
一般有以下实现措施:
1)客户端、服务端和配置中心彼此之间保持长连接,保障通信的即时性
2)路由策略以业务为维度,如按方法、接口或者参数来路由。或者就是简单的随机和轮询
3)通过配置中心做一些监控的工作,保障服务端的可用性
4)在客户端做容错,比如连接不上服务端(服务端状态同步延迟)时,做重试处理
数据包设计
Tomcat是基于HTTP的服务器,因此它接收和发送的数据都是基于HTTP协议的。如果自己设计的服务器不是基于HTTP,比如是原始的socket,那么就需要设计一套数据协议,例如:
数据协议的设计关键在于简单方便并容易扩展,数据协议就是客户端和服务器端交流的手段,功能越复杂数据协议就越复杂,数据包就会越来越大,因此在设计上需要有所权衡
服务端连接协议
当客户端多样化后就会有多种连接协议共存的需求,比如activeMQ和tomcat就支持多种connector,以activeMQ为例就支持openwire、ssl、stomp、xmpp等不同协议。支持多种协议无非就是在连接模块多开启几个端口的监听和相应协议的解析,做得更好的话最好是插件的模式,实现可插拔,这样就不会因为多种协议搞得整个系统实现过于复杂和混乱
客户端连接技术
客户端连接方案可以有多种选择,如果支持http协议,可以使用jdk提供的HttpClient工具,也可以直接使用网页。如果是socket,使用java net里TCP或UDP相关的类即可。这里需要提一下,最近看到很多人采用flash作为客户端来和服务端通信,并取得很不错的效果,flash提供了这么一些工具和API来支持网络连接和数据传送:
Flash Socket API:通过这类API,使ActionScript代码可以建立套接字连接并读取和写入原始的二进制数据,其没有指定接收或发送的数据格式。
External Interface API:通过这类API,可以实现javascript与actionscript之间的通信,当然这里还有安全沙箱的存在。
Shared Object API:通过这类API,可以实现在本地或服务器上面存储数据。当数据保存在本地的时候,其默认的可以存储的数据是每个域名100K,其与cookie还是有很大的不同点的。
LocalConnection API:通过这类API,可以实现swf文件之间的通信,这种通信是可以跨浏览器的。
以上API的具体使用可以参考一下Flash的文档,这里想说一下flash做为客户端的好处:
flash的通用性可以很方便地使客户端普及
flash可以很方便地实现跨域通信,不像js或ajax有那么多限制
flash可以借助Shared Object和LocalConnection实现浏览器之间的关联,并且是完全跨浏览器的。
以上是一些开发和设计服务常用到的技术或需要考虑的问题,在今后的学习深入中有待补充。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cutesource/archive/2010/08/10/5800420.aspx
- 大小: 24.7 KB
分享到:
相关推荐
本实验的主题是“多线程Web服务器的设计与实现”,这涉及到并发处理和网络通信的核心概念。下面将详细讨论相关知识点。 1. **多线程**:多线程是指在一个程序中可以同时执行多个独立的线程。在Web服务器中,多线程...
嵌入式WEB服务器设计报告是计算机科学与技术专业学生在完成嵌入式系统课程设计时的一项任务,旨在通过实践操作来提升对嵌入式WEB开发的理解。报告的主要目标包括在ARM开发板上实现一个简单的WEB服务器,学习SOCKET...
在本文中,我们将探讨一个基于Java实现的Web服务器的设计与实现。这个项目是作为本科毕业论文的一部分,旨在理解和掌握Web服务器的基本工作原理以及如何利用编程技术来构建这样的系统。主要涉及的技术包括HTTP协议、...
此外,多线程技术在web服务器的设计中是提升性能的关键,它能够允许web服务器同时处理多个客户端请求,有效利用系统资源,提高响应速度。CGI(Common Gateway Interface)技术则是Web服务器与外部扩展应用程序之间的...
当涉及多线程Web服务器时,这个概念更进一步,它利用多线程技术来并发处理多个客户端请求,从而提高服务器的性能和响应速度。在Java中实现多线程Web服务器是一项常见的实践,因为Java提供了强大的多线程支持。 首先...
基于ARM-Linux的嵌入式WEB服务器设计和实现涉及到多个方面的知识和技能。本文将详细解析嵌入式WEB服务器原理,远程设备监控方法,以及系统软硬件设计的关键细节。 首先,嵌入式WEB服务器是在物联网技术背景下产生的...
以上就是本文所介绍的基于Python Flask的Web服务器端设计中涉及的关键知识点。这些知识点不仅包括了Web服务器端设计的理论基础,还包含了实际的部署和管理策略,对于想要学习或改进Web开发实践的开发者具有很高的...
Web服务器和应用程序服务器是两种不同的服务类型,它们在互联网应用中扮演着各自的关键角色。本文将详细解释这两者的概念、功能以及它们之间的差异。 首先,Web服务器主要负责处理HTTP协议,它的核心任务是接收来自...
在本教程中,我们将深入探讨如何使用STM32构建一个简单的Web服务器,主要涉及以下几个关键知识点: 1. **TCP/IP协议栈**:在嵌入式设备上实现Web服务器,首要任务是搭建TCP/IP协议栈。LwIP(Lightweight IP)是一个...
Web课程设计报告主要探讨了基于JSP的新闻发布系统,这是一个常见的Web应用程序,用于实时发布、管理和更新在线新闻。在软件工程的学习过程中,这样的课程设计是培养学生实际开发能力的重要环节。 1. 引言 这部分...
嵌入式WEB服务器设计是将WEB服务功能集成到嵌入式设备中的技术,这使得嵌入式设备可以通过网页进行远程监控和管理。该设计主要应用于物联网(IoT)领域,实现设备与互联网的无缝连接,提高远程控制的精度和效率。 1.1...
通过研究C-Web-Server的源码,我们可以了解到一个基础Web服务器的架构设计,以及如何使用C语言实现这些功能。这对于想要深入理解Web服务器工作原理的开发者来说,是一份非常宝贵的教育资源。此外,对于希望扩展或...
在互联网技术领域,WEB服务器设计是一项至关重要的任务,它直接影响着网站的性能、稳定性和安全性。本文将深入探讨WEB服务器的设计及其与浏览器交互的基本原理。 首先,我们要了解WEB服务器的基本功能。WEB服务器,...
在IT行业中,构建一个多线程Web服务器是一项基础但至关重要的任务,这涉及到网络编程、并发处理和HTTP协议的理解。本项目是用C++实现的一个简单Web服务器,它能够处理GET请求,是学习多线程技术和网络编程的典型实例...
在IT领域,构建一个基于Java的多线程Web服务器是一项重要的技术挑战,它涉及到网络编程、并发处理以及HTTP协议的理解。下面将详细讲解这个主题。 首先,Java是一种跨平台的编程语言,它提供了丰富的库和工具来支持...
【简单Web服务器设计与实现】 Web服务器是互联网基础设施的核心组件,它们负责响应来自Web浏览器的请求,提供HTML页面和其他资源。本课程设计旨在探讨并实现一个简单的Web服务器,使用Java编程语言,运行在Windows ...
在本课程设计中,我们将深入探讨“基于Java的web服务器”的构建与实现。这是一个适合大学生进行的项目,尤其是对计算机科学和技术专业感兴趣的学生。通过这个项目,你可以学习到如何使用Java语言来创建一个基本的web...
8. **性能优化**:除了基本功能,优化也是Web服务器设计的重要部分。这可能涉及到缓存策略、连接复用、异步I/O等技术,以提升服务器的响应速度和并发能力。 综上所述,"linux下c语言实现多线程web服务器"项目涵盖了...
总结来说,本文详述了基于STM32微控制器设计嵌入式Web服务器的技术路线和实现方法,这不仅涉及到了硬件平台的搭建、操作系统的移植,还涵盖了网络协议栈的实施以及应用程序的开发。通过研究,可以更好地理解和掌握...