精华内容
下载资源
问答
  • RFID系统中间件组成

    2021-10-18 14:47:12
    RFID系统中间件组成 读写适配器 事件管理器 应用程序接口

    RFID系统中间件的组成

    1. 读写适配器
    2. 事件管理器
    3. 应用程序接口
    展开全文
  • 该笔记大部分搬运B站学相伴的RabbitMQ,顺便把图文合并记录,便于回顾,仅用于学习! 视频地址:https://www.bilibili.com/video/BV1dX4y1V73G 作者真的非常好,记得三连 如有侵权,请联系删除! 1. 什么是中间件 ...

    该笔记大部分搬运B站学相伴的RabbitMQ,顺便把图文合并记录,便于回顾,仅用于学习!
    视频地址:https://www.bilibili.com/video/BV1dX4y1V73G 作者真的非常好,别白嫖,记得三连
    如有侵权,请联系删除!

    1. 什么是中间件

    • 我国企业从20世纪80年代开始就逐渐进行信息化建设,由于方法和体系的不成熟,以及企业业务和市场需求的不断变化,一个企业可能同时运行着多个不同的业务系统,这些系统可能基于不同的操作系统、不同的数据库、异构的网络环境。现在的问题是,如何把这些信息系统结合成一个有机地协同工作的整体,真正实现企业跨平台、分布式应用。中间件便是解决之道,它用自己的复杂换取了企业应用的简单。

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

    举例:

    1. RMI(Remote Method Invocations, 远程调用)
    2. Load Balancing(负载均衡,将访问负荷分散到各个服务器中)
    3. Transparent Fail-over(透明的故障切换)
    4. Clustering(集群,用多个小的服务器代替大型机)
    5. Back-end-Integration(后端集成,用现有的、新开发的系统如何去集成遗留的系统)
    6. Transaction事务(全局/局部)全局事务(分布式事务)局部事务(在同一数据库联接内的事务)
    7. Dynamic Redeployment(动态重新部署,在不停止原系统的情况下,部署新的系统)
    8. System Management(系统管理)
    9. Threading(多线程处理)
    10. Message-oriented Middleware面向消息的中间件(异步的调用编程)
    11. Component Life Cycle(组件的生命周期管理)
    12. Resource pooling(资源池)
    13. Security(安全)
    14. Caching(缓存)

    2. 为什么需要使用消息中间件

    具体地说,中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担,中间件带给应用系统的,不只是开发的简便、开发周期的缩短,也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。

    为什么要使用MQ消息中间件?它解决了什么问题?
    https://www.jianshu.com/p/2820561158c4

    3. 中间件特点

    为解决分布异构问题,人们提出了中间件(middleware)的概念。中间件是位于平台(硬件和操作系统)和应用之间的通用服务,如下图所示,这些服务具有标准的程序接口和协议。针对不同的操作系统和硬件平台,它们可以有符合接口和协议规范的多种实现。

    在这里插入图片描述
    也许很难给中间件一个严格的定义,但中间件应具有如下的一些特点:
    (1)满足大量应用的需要
    (2)运行于多种硬件和OS平台
    (3)支持分布计算,提供跨网络、硬件和OS平台的透明性的应用或服务的交互
    (4)支持标准的协议
    (5)支持标准的接口

    由于标准接口对于可移植性和标准协议对于互操作性的重要性,中间件已成为许多标准化工作的主要部分。对于应用软件开发,中间件远比操作系统和网络服务更为重要,中间件提供的程序接口定义了一个相对稳定的高层应用环境,不管底层的计算机硬件和系统软件怎样更新换代,只要将中间件升级更新,并保持中间件对外的接口定义不变,应用软件几乎不需任何修改,从而保护了企业在应用软件开发和维护中的重大投资。

    简单说:中间件有个很大的特点,是脱离于具体设计目标,而具备提供普遍独立功能需求的模块。这使得中间件一定是可替换的。如果一个系统设计中,中间件时不可替代的,不是架构、框架设计有问题,那么就是这个中间件,在别处可能是个中间件,在这个系统内是引擎。

    4. 在项目中什么时候使用中间件技术

    在项目的架构和重构中,使用任何技术和架构的改变我们都需要谨慎斟酌和思考,因为任何技术的融入和变化都可能人员,技术,和成本的增加,中间件的技术一般现在一些互联网公司或者项目中使用比较多,如果你仅仅还只是一个初创公司建议还是使用单体架构,最多加个缓存中间件即可,不要盲目追求新或者所谓的高性能,而追求的背后一定是业务的驱动和项目的驱动,因为一旦追求就意味着你的学习成本,公司的人员结构以及服务器成本,维护和运维的成本都会增加,所以需要谨慎选择和考虑。

    但是作为一个开放人员,一定要有学习中间件技术的能力和思维,否则很容易当项目发展到一个阶段在去掌握估计或者在面试中提及,就会给自己带来不小的困扰,在当今这个时代这些技术也并不是什么新鲜的东西,如果去掌握和挖掘最关键的还是自己花时间和花精力去探讨和研究。

    5. 中间件技术及架构的概述

    知识图谱
    在这里插入图片描述

    6. 什么是消息中间件

    6.1 单体架构

    在实际的项目中,大部分的企业项目开发中,在早起都采用的是单体的架构模式
    在这里插入图片描述
    在企业开发当中,大部分的初期架构都采用的是单体架构的模式进行架构,而这种架构的典型的特点:就是把所有的业务和模块,源代码,静态资源文件等都放在一个工程中,如果其中的一个模块升级或者迭代发生一个很小的变动都会重新编译和重新部署项目。这种这狗存在的问题是:

    1. 耦合度太高
    2. 不易维护
    3. 服务器的成本高
    4. 以及升级架构的复杂度也会增大

    这样就有后续的分布式架构系统。 如下:

    6.2 分布式架构

    在这里插入图片描述
    何谓分布式系统:
    通俗一点:就是一个请求由服务器端的多个服务(服务或者系统)协同处理完成
    和单体架构不同的是,单体架构是一个请求发起 jvm调度线程(确切的是 tomcat线程池)分配线程 Thread来处理请求直到释放,而分布式系统是:一个请求时由多个系统共同来协同完成,jvm和环境都可能是独立。如果生活中的比喻的话,单体架构就像建设一个小房子很快就能够搞定,如果你要建设一个鸟巢或者大型的建筑,你就必须是各个环节的协同和分布,这样目的也是项目发展到后期的时候要去部署和思考的问题。我们也不难看出来:分布式架构系统存在的特点和问题如下:

    存在问题:

    1. 学习成本高,技术栈过多
    2. 运维成本和服务器成本增高
    3. 人员的成本也会增高
    4. 项目的负载度也会上升
    5. 面临的错误和容错性也会成倍增加
    6. 占用的服务器端口和通讯的选择的成本高
    7. 安全性的考虑和因素逼迫可能选择 RMI/MQ相关的服务器端通讯

    好处:

    1. 服务系统的独立,占用的服务器资源减少和占用的硬件成本减少,确切的说是:可以合理的分配服务资源,不造成服务器资源的浪费
    2. 系统的独立维护和部署,耦合度降低,可插拔性
    3. 系统的架构和技术栈的选择可以变的灵活(而不是单纯地选择 java)
    4. 弹性的部署,不会造成平台因部署造成的瘫痪和停服的状态

    6.3 基于消息中间件的分布式系统的架构

    没有加一层解决不了的事情!
    在这里插入图片描述

    从上图中可以看出来,消息中间件的是

    1. 利用可靠的消息传递机制进行系统和系统直接的通讯
    2. 通过提供消息传递消息的派对机制,它可以在分布式系统环境下扩展进程间的通讯

    7. 消息中间件应用的场景

    1. 跨系统数据传递
    2. 高并发的流量削峰
    3. 数据的并发和异步处理
    4. 大数据分析与传递
    5. 分布式事务

    比如你有一个数据要进行迁移或者请求并发过多的时候,比如你有10 W的并发请求下订单,我们可以在这些订单入库之前,我们可以把订单请求堆积到消息队列中,让它稳健可靠的入库和执行

    在这里插入图片描述
    在这里插入图片描述

    8. 常见的消息中间件

    ActiveMQ、RabbitMQ、Kafka、RocketMQ等

    9. 消息中间件的本质及设计

    它是一种接受数据、接受请求、存储数据、发送数据等功能的技术服务

    MQ消息队列:负责数据的传接受,存储和传递,所以性能要高于普通服务和技术
    在这里插入图片描述
    谁来生产消息,存储消息和消费消息呢?
    在这里插入图片描述

    10. 消息中间件的核心组成部分

    1. 消息的协议
    2. 消息的持久化机制
    3. 消息的分发策略
    4. 消息的高可用,高可靠
    5. 消息的容错机制

    11. 小结

    其实不论选择单体架构还是分布式架构都是项目开发的一个阶段,在什么阶段选择合适的架构方式,而不能盲目追求,最后造成的后果和问题都需要自己买单。但作为一个开发人员学习和探讨新的技术使我们每个程序开发者都应该去保持和思考的问题。当我们没办法去改变社会和世界的时候,我们为了生活和生存那就必须要迎合企业和市场的需求,发挥你的价值和所学的才能,创造价值和实现自我。

    展开全文
  • 中间件

    2021-03-17 07:57:51
    中间件(英语:Middleware),又译中间件、中介层,是一类提供系统软件和应用软件之间连接、便于软件各部件之间的沟通的软件,应用软件可以借助中间件在不同的技术架构之间共享信息与资源。中间件位于客户机服务器的...

    中间件的定义

    中间件(英语:Middleware),又译中间件、中介层,是一类提供系统软件和应用软件之间连接、便于软件各部件之间的沟通的软件,应用软件可以借助中间件在不同的技术架构之间共享信息与资源。中间件位于客户机服务器的操作系统之上,管理着计算资源和网络通信。 – 维基百科

    个人理解:

    将具体业务和底层逻辑解耦的组件,非业务的技术类组件非业务的技术类组件。是一种应用于分布式系统的基础软件,位于应用与操作系统、数据库之间,为上层应用软件提供开发、运行和集成的平台。中间件解决了异构网络环境下软件互联和互操作等共性问题,并提供标准接口、协议,为应用软件间共享资源提供了可复用的“标准件”。

    大致的效果是:

    介于操作系统和应用程序之间的产品,中间件简单解释,你可以理解为面向信息系统交互,集成过程中的通用部分的集合,屏蔽了底层的通讯,交互,连接等复杂又通用化的功能,以产品的形式提供出来,系统在交互时,直接采用中间件进行连接和交互即可,避免了大量的代码开发和人工成本。其实,理论上来讲,中间件所提供的功能通过代码编写都可以实现,只不过开发的周期和需要考虑的问题太多,逐渐的,这些部分,以中间件产品的形式进行了替代。需要利用服务的人(前端写业务的),不需要知道底层逻辑(提供服务的)的具体实现,只要拿着中间件结果来用就好了。
    

    举个例子:

    比如常见的消息中间件,即系统之间的通讯与交互的专用通道,类似于邮局,系统只需要把传输的消息交给中间件,由中间件负责传递,并保证传输过程中的各类问题,如网络问题,协议问题,两端的开发接口问题等均由消息中间件屏蔽了,出现了网络故障时,消息中间件会负责缓存消息,以避免信息丢失。相当于你想给美国发一个邮包,只需要把邮包交给邮局,填写地址和收件人,至于运送过程中的一系列问题你都不需要关心了。再比如我开了一家炸鸡店(业务端),然而周边有太多屠鸡场(底层),为了成本我肯定想一个个比价,再综合质量挑选一家屠鸡场合作(适配不同底层逻辑)。由于市场变化,合作一段时间后,或许性价比最高的屠鸡场就不是我最开始选的了,我又要重新和另一家屠鸡场合作,进货方式、交易方式等等全都要重来一套(重新适配)。然而我只想好好做炸鸡,有性价比高的肉送来就行。于是我找到了一个专门整合屠鸡场资源的第三方代理(中间件),跟他谈好价格和质量后(统一接口),从今天开始,我就只需要给代理钱,然后拿肉就行。代理负责保证肉的质量,至于如何根据实际性价比,选择不同的屠鸡场,那就是代理做的事了。

    链接:https://www.zhihu.com/question/19730582/answer/140527549

    评判关键从定义可以总结出评判的几个地方

    1. 性质:中间件是软件。
    2. 作用层级:系统软件和应用软件之间、软件各部件之间;管理客户机与系统软件之间的计算资源和网络通信。
    3. 服务对象:中间件为应用软件服务,应用软件为最终用户服务,最终用户并不直接使用中间件。
      在这里插入图片描述

    分类

    在这里插入图片描述

    中间件可以分为基础中间件、集成中间件和行业领域应用平台。其中,基础中间件是构建分布式应用的基础,也是集成中间件和行业领域应用平台的基础,包括应用服务器、消息中间件和交易中间件等。
    在这里插入图片描述

    三大基础中间件分别为交易中间件、消息中间件和应用服务器中间件,其中:

    交易中间件是:专门针对联机业务处理系统而设计的

    是所有中间件类型中理论较为成熟、功能和性能界定比较清晰的中间件产品。在联机业务处理系统中,需处理大量并发进程,涉及到操作系统、文件系统、数据通讯、数据库管理、应用软件等,通过交易中间件,可降低联机业务处理系统的开发难度,提高系统运行的安全稳定性。交易中间件主要应用在金融、财税、运输、电力、电信等行业中,如银行业务系统、电信计费系统等。

    消息队列(Message Quequing)是在消息传输过程中保存消息的容器,消息中间件即为消息队列的承载形式。

    消息是两台计算机间传送的数据单位,消息队列在将消息从它的源中继到它的目标时充当中间人,主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它,主要解决传统结构耦合性问题、系统异步性问题以及缓解大数据量并发的问题等。

    消息队列有较多的型号,较为常用的为ActiveMQ、Rabbit MQ、RocketMQ和Kafk a。由于消息队列使用消息将应用程序连接起来,这些消息通过像Rabbit MQ的消息代理服务器在应用程序之间路由。

    应用服务器中间件位于客户浏览器和数据库之间,为应用程序提供业务逻辑的代码。

    应用服务器通过组件的应用程序接口将商业应用逻辑曝露给客户端的程序,同时为应用提供运行平台和系统服务,并管理对数据库的范围。对于高端需求,应用服务器具有高可用性监视、集群化、负载平衡、集成冗余和高性能分布式应用服务,以及对复杂的数据库访问的支持等功能。目前,市场上应用服务器平台中有J2EE,WebLogic,Glassfish,JBoss企业应用平台,以及Apache Tomcat和Apache Geronimo等。
    中间件技术发展的初衷是以适应网络技术应用的复杂性及跨平台特性为基础,是在软件产业不断发展过程中自然产生的。

    云服务

    云计算产业自下而上大体分为基础设施即服务(IaaS)、平台即服务(PaaS)、软件即服务(SaaS)三大部分,对应传统IT架构中的操作系统、中间件和应用软件。传统中间件服务一般使用专有API和专有协议,PaaS服务的特点在于开放开源,基于标准通用的API在异构系统之间实现互通互操作。根据Gartner分类,PaaS分为iPaaS(集成平台即服务)和aPaaS(应用部署和运行平台),前者侧重于PaaS与IaaS之间,实现跨多个云、云与传统应用程序之间以及公共云和私有云之间的缝集成;后者侧重于PaaS与SaaS之间,支持应用程序在云端的开发、部署和运行等。iPaaS和MWaaS成为全球中间件行业热点。根据Gartner于2018年6月发布的报告显示,企业对iPaaS(集成平台即服务)和MWaaS(中间件即服务)的投入将超越传统市场。2017年,传统中间件产品增速仅有个位数增长,而基于云和基于开源的应用集成(iPaaS)产品将继续保持两位数的增长(2017年iPaaS营收首次突破10亿美元,同增72%),是挑战者们角力的重点领域。而iPaaS的成功催生了MwaaS(中间件即服务)业务,MWaaS套件可以视为一组基于云的混合集成服务,包括云集成(iPaaS)、基于云的API平台(提供开发、运行、管理和保护API服务)、基于云的B2B集成(提供除API之外的其他服务,如EDI和MFT集成)、移动后端集成(MBaaS),、物联网集成等。以华为举例,华为重视云中间件市场,将其作为白皮书中重要细分行业。在其《鲲鹏计算产业白皮书》中测算,到2023年,全球中间件市场空间434亿美元,5年复合增长率10.3%。中国中间件市场空间13.6亿美元,5年复合增长率15.7%。且用户对于基于云的分布式应用服务、消息队列等中间件工具的需求不断增长,将会促进中间件市场的快速发展。目前,华为云中间件产品主要包括应用中间件系列产品和分布式数据库中间件(DDM)。其中,应用中间件系列产品主要包括应用管理与运维平台ServiceStage、微服务引擎CSE、分布式缓存服务Redis和Memcached、分布式消息服务(包括DMS、Kafka、RabbitMQ)、API网关APIG和云性能测试服务CPTS等。

    常见种类

    中间件是什么

    中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。

    执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或 OS 环境。

    中间件是介于操作系统和应用软件之间,为应用软件提供服务功能的软件,有消息中间件,交易中间件,应用服务器等。由于介于两种软件之间,所以,称为中间件。

    为什么使用中间件

    具体地说,中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担。

    中间件带给应用系统的,不只是开发的简便、开发周期的缩短,也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。

    主要中间件的分类

    1. Hadoop
      当一个大的任务由一台机器在规定的时间内不能完成时,人们就要采用分布式计算,即很多台机器联合起来共同完成任务。换句话说,就是把大任务拆分成许多个小任务,然后再把这些小任务分配给多台计算机去完成。参与计算的多台计算机组成一个分布式系统,需要运行一系列的分布式基础算法。

    Hadoop 就是一个分布式计算平台,用 Java 语言开发,包含 Common、MapReduce 和 HDFS 三个核心部件(HDFS 和 MapReduce 是最核心的两个部件)。其中:
    Common 为 Hadoop 的其他项目提供了一些常用工具,主要包括系统配置工具 Configuration、远程过程调用 RPC、序列化机制和 Hadoop 抽象文件系统等。
    MapReduce 是处理海量数据的计算模型。
    而 HDFS 用于存储海量数据,它具备高度容错性,能在低成本的通用硬件机器上稳定运行。

    Hadoop 实现了分布式计算中的基础算法(如一致算法、选举算法、故障检测、快照等),同时为用户提供了编程和命令接口。程序员调用这些函数能轻松写出分布式应用程序,我们都知道,如果一切从头开始,要完成一个分布式程序的编写是异常艰难的。

    Hadoop 在海量非结构化数据处理方面能充分展示它的优势,如消费者购买行为分析、商品推荐、关键词检索、信贷风险评估等。

    如图 1 所示,Hadoop 其实就是一个分布式计算平台,它“覆盖”在操作系统之上,向上提供函数调用(API)和命令接口,在水平方向完成分布式系统的基础算法。作为编程人员和用户,只要了解 API 和命令即可。
    在这里插入图片描述
    图 1 Hadoop

    基于 Hadoop 平台衍生出来的开源项目主要有 Yarn、HBase、Hive、ZooKeeper、Avro、Sqoop、Mahout、Crossbow 等。

    以 Hadoop 为基础的生态目前已经成为大数据的标准方案,被广泛用于金融、市场、电信、交通等行业的海量数据分析,在即将到来的大数据时代,它将会发挥更大的作用。

    在中国,很多行业(如银行、电信、移动、电力、石油、交通等)沉淀了大量的业务数据,对这些海量数据进行挖掘和分析,将会带来巨大的价值。

    用 Hadoop 构建的应用实例对于计算资源的消耗具备两个明显的特征:
    资源需求大:表明 Hadoop 需要大量的存储、计算和网络带宽。
    资源需求具备季节性:表明除存储需求是经常性占用外,在运行 Mapreduce 时才需要大量的计算和网络资源,而分析大量数据的工作并不是经常性的——称为季节性

    因此,云计算是大数据天生的计算资源供应途径,云计算的资源弹性很好地满足了大数据的季节性计算资源需求。也就是说,大数据是云计算经典的应用案例。当然,也可以按照大数据对计算资源的波峰需求静态配给计算资源,但是这种方案会造成资源的巨大浪费。
    2. LVS
    LVS 是 Linux Virtual Server 的首字母缩写,意为 Linux 虚拟服务器,即把许多台物理 Linux 计算机逻辑上整合成一台超级计算机,对用户来说感觉只有一台计算能力很强的服务器,如图 2 所示。

    LVS 就是一个由软件实现的负载均衡器,工作在网络 OSI 的第四层(应用层),是中国人章嵩开发的,代码已经并入了 Linux 内核。利用它,再加上一台廉价的计算机,就能构建一台企业级的负载均衡器。而那些外国大公司的负载均衡器,售价都要十几万元,甚至几十万元,便宜的也要几万元,LVS 出来后,这些产品都不得不降价。

    负载均衡器的作用就是把任务分配给最合适的服务器。比如一个大型购物网店,有 100 台同样配置的服务器在运行,如果某一时刻有 10 万用户在线购物,那么通过负载均衡器,每台服务器差不多承担 1000 个在线购物用户。

    LVS 的官网网站是 http://www.linuxvirtualserver.org。另外,两个较为流行的第七层负载均衡器是 Nginx 和 HAProxy,针对应用做均衡,所以能适应的负载种类没有 LVS 多。
    在这里插入图片描述
    LVS原理图

    1. Linux-HA
      也许有读者会问:“负载均衡器本身故障怎么办?”是的,如果负载均衡器出现故障,那么整个系统(如网店)将会瘫痪。所以人们开发了各种集群软件,如 Linux-HA 和 Keepalive 等,而微软干脆就在 Windows 服务器版中集成故障转移集群软件。

    集成故障转移集群软件的核心思想是,实时检测故障机器并及时让好的机器接管工作,对外提供高可用性。Linux-HA 意为 Linux 高可用性项目,此项目具体包含如下几个组件。
    在这里插入图片描述

    通过心跳信号(Heartbeat)检测故障,一台好的计算机会不断向其他计算机发送心跳信号,也会接收其他计算机发送过来的心跳信息。当在规定的时间内没有收到对方计算机的心跳信号时,就启动应急预案,进一步确认故障并准备接管那台计算机的任务。

    例如,我们采用两台 LVS 计算机,并分别安装和配置 Linux-HA,一台 LVS 计算机作为工作机,另一台作为备份机,两台 LVS 计算机互相监督对方的运行状态。当工作机故障时,备份机接管负载均衡任务并报警。相反,当备份机出故障时,只报警,提醒技术员维修备份机。

    两台LVS计算机同时出故障是比较糟糕的情况,不过这种情况发生的概率很小,除非机房断电或者遭到雷击。对于一些非常关键的应用,可以增加参与负载均衡的服务器数量来提高可靠性,如民航飞机上采用 5 台服务器。
    4. 静态网站服务器
    我们浏览一家公司的网站时,很可能就是跟那家公司服务器上的 Apache 程序打交道,网页浏览器与 Apache 成了标准的 C/S 模式,浏览器是客户端,而 Apache 是服务端。Apache 首先把主页对应的文件 index.html 发给我们,我们看到主页内容后,点击主页上的某个链接,它又把该链接对应的文件发给我们,过程如图 3 所示。
    访问静态网页的过程
    在这里插入图片描述

    图 3 访问静态网页的过程

    配合 PHP 引擎,Apache 也支持 PHP 动态网页。过程为:

    1)当 Apache 收到用户要浏览的 PHP 文件后,把这个 PHP 文件发给 PHP 执行引擎。

    2)PHP 执行引擎执行该 PHP 文件,产生一个临时的静态网页文件并发回给 Apache。

    3)最后 Apache 把这个临时的静态网页文件发给用户。

    采用 Perl、Python 和 Ruby 脚本语言编写的动态网页,其工作过程与 PHP 类似。

    Apache 是最流行的开源网站服务器,在世界排名前 100 万的网站中,有 60.6% 的网站采用 Apache;在排名前 1000 的大型网站中,Apache 占到了 34.5%,而 Ngnix 占到了 34.9%,略胜于 Apache。
    5. 动态应用服务器
    开源的动态应用服务器有 JBoss、Tomcat、Geronimo、JOnAS,关于这些项目更详细的介绍,请参考相应的官方网站。

    推荐

    常见的中间件有哪些
    1.一般本地开发的话,小项目,或者是个人开发建议使用tomcat。
    2.linux系统建议使用jetty或apache hpptd
    3.大型的项目就用JBOSS或webloigc

    4.大项目或者商业项目一般采用:weblgoic/webshere,其他的还有jboss、glasshfish等
    5.一些示例项目或者小项目常采用jetty

    6.tomcat , jboss, weblogic, websphere 一般项目tomcat就可以了

    Tomcat是Sun的JSWDK(JavaServer Web Development Kit)中Servlet的运行环境(servlet容器)。Tomcat是Apache Jakarta软件组织的一个子项目,Tomcat是一个JSP/Servlet容器,它是在SUN公司的JSWDK(Java Server Web Development Kit)基础上发展起来的一个JSP和Servlet规范的标准实现,使用Tomcat可以体验JSP和Servlet的最新规范。经过多年的发展,Tomcat不仅是JSP和Servlet规范的标准实现,而且具备了很多商业Java Servlet容器的特性,并被一些企业用于商业用途。

    JBoss是一个运行EJB的J2EE应用服务器。它是开放源代码的项目,遵循最新的J2EE规范。从JBoss项目开始至今,它已经从一个EJB容器发展成为一个基于的J2EE的一个web 操作系统(operating system for web),它体现了J2EE规范中最新的技术

    WebLogic服务器是企业级的应用服务器,支持EJB, 集群以及 ERP(企业资源计划)的连通性 ,开发公司:BEA。

    WebSphere产品系列是IBM公司一套典型的电子商务应用开发工具及运行环境

    Tomcat 介绍 如今,基于Web的应用越来越多,传统的Html已经满足不了如今的需求。我们需要一个交互式的Web,于是便诞生了各种Web语言。
    如Asp,Jsp,Php等。当然,这些语言与传统的语言有着密切的联系,如Php基于C和C++语言,Jsp基于Java语言。Tomcat即是一个Jsp和Servlet
    的运行平台。
    Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发
    而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在Tomcat中得到体现。Tomcat被JavaWorld杂志的编辑选为2001年度最具创新
    的java产品,可见其在业界的地位。
    Tomcat最新版本是4.0x.4.0x与3.x的架构不同,而是重新设计的。Tomcat4.0x中采用了新的Servlet容器:Catalina,完整的实现了Servlet2.3
    和Jsp1.2规范。Tomcat提供了各种平台的版本供下载,可以从http://jakarta.apache.org上下载其源代码版或者二进制版。由于Java的跨平台
    特性,基于Java的Tomcat也具有跨平台性。
    与传统的桌面应用程序不同,Tomcat中的应用程序是一个WAR(WebArchive)文件。WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许
    多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有
    一个WEB-INF目录,这个目录很重要。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而
    classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)。通常这些所依赖的类也可以打包成JAR放到WEB-INF
    下的lib目录下,当然也可以放到系统的CLASSPATH中,但那样移植和管理起来不方便。
    在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器
    中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译。编译以后,访问将会很快。另外Tomcat也提
    供了一个应用:manager,访问这个应用需要用户名和密码,用户名和密码存储在一个xml文件中。通过这个应用,辅助于Ftp,你可以在远程通
    过Web部署和撤销应用。当然本地也可以。
    Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Html的能力就不如
    Apache.我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet.这种集成只需要修改一下Apache和
    Tomcat的配置文件即可。
    另外,Tomcat提供Realm支持。Realm类似于Unix里面的group.在Unix中,一个group对应着系统的一定资源,某个group不能访问不属于它的资
    源。Tomcat用Realm来对不同的应用(类似系统资源)赋给不同的用户(类似group)。没有权限的用户则不能访问这个应用。Tomcat提供三种
    Realm,1:JDBCRealm,这个Realm将用户信息存在数据库里,通过JDBC获得用户信息来进行验证。2:JNDIRealm,用户信息存在基于LDAP的服
    务器里,通过JNDI获取用户信息。3:MemoryRealm,用户信息存在一个xml文件里面,上面讲的manager应用验证用户时即使用此种Realm.通过
    Realm我们可以方便地对访问某个应用的客户进行验证。
    在Tomcat4中,你还可以利用Servlet2.3提供的事件监听器功能,来对你的应用或者Session实行监听。Tomcat也提供其它的一些特征,如与SSL
    集成到一块,实现安全传输。还有Tomcat也提供JNDI支持,这与那些J2EE应用服务器提供的是一致的。说到这里我们要介绍一下通常所说的应
    用服务器(如WebLogic)与Tomcat有何区别。应用服务器提供更多的J2EE特征,如EJB,JMS,JAAS等,同时也支持Jsp和Servlet.而Tomcat则功
    能没有那么强大,它不提供EJB等支持。但如果与JBoss(一个开源的应用服务器)集成到一块,则可以实现J2EE的全部功能。既然应用服务器
    具有Tomcat的功能,那么Tomcat有没有存在的必要呢?事实上,我们的很多中小应用不需要采用EJB等技术,Jsp和Servlet已经足够,这时如果
    用应用服务器就有些浪费了。而Tomcat短小精悍,配置方便,能满足我们的需求,这种情况下我们自然会选择Tomcat.
    基于Tomcat的开发其实主要是Jsp和Servlet的开发,开发Jsp和Servlet非常简单,你可以用普通的文本编辑器或者IDE,然后将其打包成WAR即
    可。我们这里要提到另外一个工具Ant,Ant也是Jakarta中的一个子项目,它所实现的功能类似于Unix中的make.你需要写一个build.xml文件,
    然后运行Ant就可以完成xml文件中定义的工作,这个工具对于一个大的应用来说非常好,我们只需在xml中写很少的东西就可以将其编译并打包
    成WAR.事实上,在很多应用服务器的发布中都包含了Ant.另外,在Jsp1.2中,可以利用标签库实现Java代码与Html文件的分离,使Jsp的维护更
    方便。
    Tomcat也可以与其它一些软件集成起来实现更多的功能。如与上面提到的JBoss集成起来开发EJB,与Cocoon(Apache的另外一个项目)集成起
    来开发基于Xml的应用,与OpenJMS
    集成起来开发JMS应用,除了我们提到的这几种,可以与Tomcat集成的软件还有很多。
    Tomcat确实是一个很好的工具,不仅仅因为其免费,功能强大,更因为其开放性。如今,开源软件越来越收到人们的重视,Linux就是一个成功
    的典型。

    多种中间件(Tomcat, Apache, Nginx, MQ,等)各项性能参数设置、监控及优化;

    特点

    一、中间件是什么?
    中间件(英语:Middleware)顾名思义是系统软件和用户应用软件之间连接的软件,以便于软件各部件之间的沟通,特别是应用软件对于系统软件的集中的逻辑,是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件在客户服务器的操作系统、网络和数据库之上,管理计算资源和网络通信。总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。

    也就是说,关于中间件,我们可以理解为:是一类能够为一种或多种应用程序合作互通、资源共享,同时还能够为该应用程序提供相关的服务的软件。中间件是一类软件统称,而非一种软件;中间件不仅仅实现互连,还要实现应用之间的互操作。
    在这里插入图片描述 中间件示意图

    中间件的特点:

    满足大量应用的需要;
    运行于多种硬件和OS平台;
    支持分布计算,提供跨网络、硬件和OS平台的透明性的应用或服务的交互;
    支持标准的协议;
    支持标准的接口。

    展开全文
  • web中间件

    千次阅读 2021-01-29 08:55:38
    中间件是什么 中间件(英语:Middleware)是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更高一级应用程序之间。他充当的功能是:将应用程序运行环境与操作系统隔离,...

    1 中间件是什么

    中间件(英语:Middleware)是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更高一级应用程序之间。他充当的功能是:将应用程序运行环境与操作系统隔离,从而实现应用程序开发者不必为更多系统问题忧虑,而直接关注该应用程序在解决问题上的能力 。容器就是中间件的一种。
    也就是说,关于中间件,我们可以理解为:是一类能够为一种或多种应用程序合作互通、资源共享,同时还能够为该应用程序提供相关的服务的软件。(注意:中间件是一类软件的总称,不是单独的一个软件)
    我们经常管web中间件叫做web服务器或者web容器
    正常情况下一次web的访问顺序是:web浏览器---服务器(硬件)---web容器---web应用服务器---数据库服务器。

    2 常见中间件简述

    Tomcat
    Tomcat 是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Java Web 应用服务器(Servlet 容器)。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。Tomcat默认使用 8080 号端口

    WebLogic 是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。Weblogic默认端口是 7001。

    Jboss 是一个基于Java EE的开放源代码的应用服务器。 它不但是Servlet容器,而且也是EJB容器,从而受到企业级开发人员的欢迎,从而弥补了Tomcat只是一个Servlet容器的缺憾。JBoss是一个管理EJB的容器和服务器。但JBoss核心服务不包括支持 servlet/JSP 的WEB容器,一般与 Tomcat 或 Jetty 绑定使用。Jboss默认端口号是8080。

    Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用JAVA编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。

    WebShere 是 IBM 的软件平台。它包含了编写、运行和监视全天候的工业强度的随需应变 Web 应用程序和跨平台、跨产品解决方案所需要的整个中间件基础设施,如服务器、服务和工具。WebSphere 提供了可靠、灵活和健壮的软件。WebSphere 是一个模块化的平台,基于业界支持的开放标准。可以通过受信任和持久的接口,将现有资产插入 WebSphere,可以继续扩展环境。WebSphere 可以在许多平台上运行,包括 Intel、Linux 和 z/OS。Webshere默认端口号是 9080。

    GlassFish 是一款强健的商业兼容应用服务器,达到产品级质量,可免费用于开发、部署和重新分发。开发者可以免费获得源代码,还可以对代码进行更改。

    3 常见WEB中间件细节

    3.1Tomcat

    3.1.1概念

        Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。

    3.1.2 原理

        Tomcat结构图:

        Tomcat主要组件:服务器Server,服务Service,连接器Connector、容器Container。连接器Connector和容器Container是Tomcat的核心。

        一个Container容器和一个或多个Connector组合在一起,加上其他一些支持的组件共同组成一个Service服务,有了Service服务便可以对外提供能力了,但是Service服务的生存需要一个环境,这个环境便是Server,Server组件为Service服务的正常使用提供了生存环境,Server组件可以同时管理一个或多个Service服务。

    3.1.3两大组件

    1、Connector

        一个Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理Engine(Container中的一部分),从Engine出获得响应并返回客户。 
    Tomcat中有两个经典的Connector,一个直接侦听来自Browser的HTTP请求,另外一个来自其他的WebServer请求。HTTP/1.1 Connector在端口8080处侦听来自客户Browser的HTTP请求,AJP/1.3 Connector在端口8009处侦听其他Web Server(其他的HTTP服务器)的Servlet/JSP请求。 
    Connector 最重要的功能就是接收连接请求然后分配线程让 Container 来处理这个请求,所以这必然是多线程的,多线程的处理是 Connector 设计的核心。

    2、Container

     

    Container是容器的父接口,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。通常一个Servlet class对应一个Wrapper,如果有多个Servlet定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container,如Context。 
    Context 还可以定义在父容器 Host 中,Host 不是必须的,但是要运行 war 程序,就必须要 Host,因为 war 中必有 web.xml 文件,这个文件的解析就需要 Host 了,如果要有多个 Host 就要定义一个 top 容器 Engine 了。而 Engine 没有父容器了,一个 Engine 代表一个完整的 Servlet 引擎。

    • Engine 容器 
      Engine 容器比较简单,它只定义了一些基本的关联关系
    • Host 容器 
      Host 是 Engine 的子容器,一个 Host 在 Engine 中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是 Context,它除了关联子容器外,还有就是保存一个主机应该有的信息。
    • Context 容器 
      Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的,还有一点就是 Context 如何才能找到正确的 Servlet 来执行它呢? Tomcat5 以前是通过一个 Mapper 类来管理的,Tomcat5 以后这个功能被移到了 request 中,在前面的时序图中就可以发现获取子容器都是通过 request 来分配的。
    • Wrapper 容器 
      Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。 
      Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道。

    3、其他组件

        Tomcat 还有其它重要的组件,如安全组件 security、logger 日志组件、session、mbeans、naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务。

    3.1.4 HTTP请求过程

    Tomcat Server处理一个HTTP请求的过程

    1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得。 
    2、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。 
    3、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。 
    4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。 
    5、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。 
    6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。 
    7、Context把执行完之后的HttpServletResponse对象返回给Host。 
    8、Host把HttpServletResponse对象返回给Engine。 
    9、Engine把HttpServletResponse对象返回Connector。 
    10、Connector把HttpServletResponse对象返回给客户Browser。

     

    3.2 Jetty

    3.2.1 什么是jetty?

    简单来讲jetty就是一个开源HTTP服务器和Servlet引擎,它可以为JSP和Servlet提供运行时环境。比如Java web应用最常用的Servlet容器和Tomcat。由于其轻量、灵活的特性,jetty也被应用于一些知名产品中,例如ActiveMQ、maven、spark、gooleAppEngine、Eclipse、Hadoop等。


    3.2.2 为什么使用jetty?


    1.异步的Servlet,支持更高的并发量。
    2.模块化的设计,更灵活,更容易定制,也意味着更高的资源利用率。
    3.在面对大量长连接的业务场景下,jetty默认采用的NIO模型是更好的选择。

    将jetty嵌入到应用中,使一个普通应用可以快速支持HTTP服务。

    3.2.3 与tomcat的对比

    jetty比较容易贴合第三方框架,比如你可以直接用Spring配置一个jetty服务器
    直接将jetty作为提供HTTP服务的组件,嵌入到应用中
    jetty是面向Handler的架构,而tomcat是面向容器的架构
    jetty默认采用NIO技术,而tomcat默认是BIO
    jetty高度模块化,可以很灵活的管理拓展组件,而tomcat对其他组件的管理则相对困难

    3.2.4 jetty的基本架构

     

    3.2.5 jetty的项目结构

     

    3.3 Nginx

    3.3.1代理服务器

    Nginx就是反向代理服务器。

    首先我们先来看看什么是代理服务器,代理服务器一般是指局域网内部的机器通过代理服务发送请求到互联网上的服务器,代理服务器一般作用于客户端。比如GoAgent,FQ神器。

    一个完整的代理请求过程为:客户端首先与代理服务器创建连接,然后根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或则获得目标服务器的指定资源。Web代理服务器是网络的中间实体。代理位于Web客户端和Web服务器之间,扮演“中间人”的角色。 
    HTTP的代理服务器既是Web服务器又是Web客户端。

    代理服务器是介于客户端和Web服务器之间的另一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页,而是通过向代理服务器发送请求,信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。

    正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取的内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端,客户端必须要进行一些特别的设置才能使用正向代理。

    反向代理服务器:在服务器端接收客户端的请求,然后把请求分发给具体的服务器进行处理,然后再将服务器的响应结果反馈给客户端。Nginx就是其中的一种反向代理服务器软件。
    Nginx:Nginx(“engine x”),Nginx是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器。也是一个IMAP/POP3/SMTP代理服务器,也就是说,Nginx本身就可以托管网站,进行HTTP服务处理,也可以作为反向代理服务器使用。

    正向代理客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
    反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将判断向哪个原始服务器转交请求,并将获得的内容返回给客户端。

     

    用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实际上反向代理服务器接受用户A的应答,
    从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。

    简单的说:
    正向代理:客户端知道服务器端,通过代理端连接服务器端。代理端代理的是服务器端。
    反向代理:所谓反向,是对正向而言的。服务器端知道客户端,客户端不知道服务器端,通过代理端连接服务器端。代理端代理的是客户端。代理对象刚好相反,所以叫反向代理。

    3.3.2.Nginx的应用现状


    Nginx 已经在俄罗斯最大的门户网站── Rambler Media(www.rambler.ru)上运行了很多年,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。
    在国内,已经有 淘宝、新浪博客、新浪播客、网易新闻、六间房、56.com、Discuz!、水木社区、豆瓣、YUPOO、海内、迅雷在线 等多家网站使用 Nginx 作为Web服务器或反向代理服务器。

    3.3.3.Nginx的特点


    (1)跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有Windows的移植版本。
    (2)配置异常简单,非常容易上手。配置风格跟程序开发一样,神一般的配置
    (3)非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数.(这得益于Nginx使用了最新的epoll模型)
    (4)事件驱动:通信机制采用epoll模型,支持更大的并发连接。
    (5)master/worker结构:一个master进程,生成一个或多个worker进程
    (6)内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M) 
    (7)成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
    (8)内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。
    (9)节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
    (10)稳定性高:用于反向代理,宕机的概率微乎其微

    如何使用事件驱动呢?

    Nginx的事件处理机制:
    对于一个基本的web服务器来说,事件通常有三种类型,网络事件、信号、定时器。 
    首先看一个请求的基本过程:建立连接---接收数据---发送数据 。
    再次看系统底层的操作 :上述过程(建立连接---接收数据---发送数据)在系统底层就是读写事件。

    1)如果采用阻塞调用的方式,当读写事件没有准备好时,必然不能够进行读写事件,那么久只好等待,等事件准备好了,才能进行读写事件。那么请求就会被耽搁 。阻塞调用会进入内核等待,cpu就会让出去给别人用了,对单线程的worker来说,显然不合适,当网络事 件越多时,大家都在等待呢,cpu空闲下来没人用,cpu利用率自然上不去了,更别谈高并发了 。           

    2)既然没有准备好阻塞调用不行,那么采用非阻塞方式。非阻塞就是,事件,马上返回EAGAIN,告诉你,事件还没准备好呢,你慌什么,过会再来吧。好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事 件好了没。虽然不阻塞了,但你得不时地过来检查一下事件的状态,你可以做更多的事情了,但带来的开销也是不小的 

    小结:非阻塞通过不断检查事件的状态来判断是否进行读写操作,这样带来的开销很大。 

    3)因此才有了异步非阻塞的事件处理机制。具体到系统调用就是像select/poll/epoll/kqueue这样的系统调用。他们提供了一种机制,让你可以同时监控多个事件,调用他们是阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。这种机制解决了我们上面两个问题。 

    以epoll为例:当事件没有准备好时,就放入epoll(队列)里面。如果有事件准备好了,那么就去处理;如果事件返回的是EAGAIN,那么继续将其放入epoll里面。从而,只要有事件准备好了,我们就去处理她,只有当所有时间都没有准备好时,才在epoll里面等着。这样 ,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理 解为循环处理多个准备好的事件,事实上就是这样的。 

    4)与多线程的比较:
    与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级。并发数再多也不会导致无谓的资源浪费(上下文切换)。

    小结:通过异步非阻塞的事件处理机制,Nginx实现由进程循环处理多个准备好的事件,从而实现高并发和轻量级。

    3.3.4.Nginx的不为人知的特点


    (1)nginx代理和后端web服务器间无需长连接;
    (2)接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送后后端web服务器,极大的减轻后端web服务器的压力
    (3)发送响应报文时,是边接收来自后端web服务器的数据,边发送给客户端的
    (4)网络依赖型低。NGINX对网络的依赖程度非常低,理论上讲,只要能够ping通就可以实施负载均衡,而且可以有效区分内网和外网流量
    (5)支持服务器检测。NGINX能够根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障,并及时返回错误的请求重新提交到其它节点上

    3.3.5.Nginx的内部(进程)模型

    nginx是以多进程的方式来工作的,当然nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是nginx的默认方式。nginx采用多进程的方式有诸多好处 .

    (1) nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控 worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网 络事件,则是放在worker进程中来处理了 。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的 。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。 worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的 。

    (2)Master接收到信号以后怎样进行处理(./nginx -s reload )?首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的进程,并向所有老的进程发送信号,告诉他们可以光荣退休了。新的进程在启动后,就开始接收新的请求,而老的进程在收到来自 master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出 .

    (3) worker进程又是如何处理请求的呢?我们前面有提到,worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master 进程fork(分配)过来,在master进程里面,先建立好需要listen的socket之后,然后再fork出多个worker进程,这样每个worker进程都可以去accept这个socket(当然不是同一个socket,只是每个进程的这个socket会监控在同一个ip地址与端口,这个在网络协议里面是允许的)。一般来说,当一个连接进来后,所有在accept在这个socket上面的进程,都会收到通知,而只有一个进程可以accept这个连接,其它的则accept失败,这是所谓的惊群现象。当然,nginx也不会视而不见,所以nginx提供了一个accept_mutex这个东西,从名字上,我们可以看这是一个加在accept上的一把共享锁。有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,这样就不会有惊群问题了。accept_mutex是一个可控选项,我们可以显示地关掉,默认是打开的。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

    (4)nginx采用这种进程模型有什么好处呢?采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。当然,好处还有很多,大家可以慢慢体会。

    (5)有人可能要问了,nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发数很有限啊,多少个worker就能处理多少个并发,何来高并发呢?非也,这就是nginx的高明之处,nginx采用了异步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理成千上万个请求的 .对于IIS服务器每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战,线程带来的内存占用非常大,线程的上下文切换带来的cpu开销很大,自然性能就上不去了,而这些开销完全是没有意义的。我们之前说过,推荐设置worker的个数为cpu的核数,在这里就很容易理解了,更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。而且,nginx为了更好的利用多核特性,提供了cpu亲缘性的绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效

    3.3.6.Nginx是如何处理一个请求

    首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到指定的ip地址端口,再listen),然后再fork(一个现有进程可以调用fork函数创建一个 新进程。由fork创建的新进程被称为子进程 )出多个子进程出来,然后子进程会竞争accept新的连接。此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后,此时,某一个子进程会accept成功,得到这个建立好的连接的 socket,然后创建nginx对连接的封装,即ngx_connection_t结构体。接着,设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后,nginx或客户端来主动关掉连接,到此,一个连接就寿终正寝了。

    当然,nginx也是可以作为客户端来请求其它server的数据的(如upstream模块),此时,与其它server创建的连接,也封装在ngx_connection_t中。作为客户端,nginx先获取一个ngx_connection_t结构体,然后创建socket,并设置socket的属性( 比如非阻塞)。然后再通过添加读写事件,调用connect/read/write来调用连接,最后关掉连接,并释放ngx_connection_t。

    nginx在实现时,是通过一个连接池来管理的,每个worker进程都有一个独立的连接池,连接池的大小是worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个worker_connections大小的一个ngx_connection_t结构的数组。并且,nginx会通过一个链表free_connections来保存所有的空闲ngx_connection_t,每次获取一个连接时,就从空闲连接链表中获取一个,用完后,再放回空闲连接链表里面。 

    在这里,很多人会误解worker_connections这个参数的意思,认为这个值就是nginx所能建立连接的最大值。其实不然,这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。当然 ,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • java中间件

    2021-02-06 14:31:00
    中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中...
  • scrapy中间件详解

    2021-07-17 16:40:18
    scrapy中间件是scrapy框架的重要组成部分 分为两大种类:下载器中间件(DownloaderMiddleware)和爬虫中间件(SpiderMiddleware) 图中4、5为下载器中间件 图中6、7为爬虫中间件 下载器中间件是Scrapy请求/响应...
  • 常用中间件

    千次阅读 2021-10-24 22:26:40
    中间件(Middleware)顾名思义是系统软件和用户软件之间连接的软件,以便于软件各部分之间的沟通,特别是应用软件对于系统软件的集中逻辑,是一种独立的系统或者服务程序,分布式应用软件借助这种软件在不同的技术...
  • RabbitMQ的核心组成部分 核心概念: Server:又称Broker ,接受客户端的连接,实现AMQP实体服务。 安装rabbitmq-server Connection:连接,应用程序与Broker的网络连接 TCP/IP/ 三次握手和四次挥手 Channel:网络...
  • 中间件概述

    千次阅读 2021-11-30 16:50:39
    1.中间件 1.1中间件基础 平台+通信,通过遵循协议和规范和底层操作系统硬件打交道。 特性:跨平台 举例: 1,RMI(Remote Method Invocations, 远程调用) 2,Load Balancing(负载均衡,将访问负荷分散到各个...
  • 常见的中间件以及什么是中间件

    千次阅读 2021-11-19 12:43:32
    常见的中间件以及什么是中间件1. 中间件是什么2. 为什么要用中间件3. 中间件的使用场景4. 主要的中间件的分类 1. 中间件是什么 中间件顾名思义就是系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通,...
  • 数据库中间件---详解

    千次阅读 2021-11-15 16:50:45
    一、业务场景 1、当一张表进行水平分库分表之后,可能会影响已有产品功能,同时想要进行多张分表的搜索结果数据聚合在一起,在sql上会比较麻烦(只能不断 join),而且如果不...引进数据库中间件,例如:Cobar、M...
  • 中间件的协议笔记

    2021-09-13 20:07:37
    我们知道消息中间件负责数据的传递,存储,和分发消费三个部分,数据的存储和分发的过程中肯定要遵循某种约定成俗的规范,你是采用底层的TCP/Ip.UDP协议还是其他的自己取构建等,而这些约定成俗的规范就称之为:协议...
  • redux中间件详解

    2021-07-30 11:33:13
    1、redux中间件简介 1.1、什么是redux中间件 redux 提供了类似后端 Express 的中间件概念,本质的目的是提供第三方插件的模式,自定义拦截 action -> reducer 的过程。变为 action -> middlewares -> ...
  • 通信中间件DDS介绍(一)

    千次阅读 2021-04-08 21:32:33
    DDS是分布式实时的网络通信中间件。用于屏蔽操作系统、底层硬件、体系架构的差异性,以帮助应用人员在开发、维护、升级等阶段缩短时间和人力成本,简化应用程序的开发与调度操作等。DDS能在多种传输网络环境中对即时...
  • 消息中间件简介 消息中间件的使用场景 消息中间件的产生背景、特点和常用协议 常用消息中间件介绍(RabbitMQ、Kafka 、RocketMQ、ActiveMQ) 常用消息中间件的对比 常用消息中间件,如何技术选型?
  • 中间件简介

    2021-10-17 16:32:33
    文章目录中间件中间件是什么为什么使用中间件主要中间件的分类1. Hadoop2. LVS3. Linux-HA4. 静态网站服务器常见的中间件tomcatjettyJBossweblogicWebSphere中间件特点: 中间件是什么 中间件是一种独立的系统软件或...
  • 消息中间件知识点

    2021-03-15 15:34:04
    消息中间件常见知识点一:消息队列的主要作用是什么?1.消息队列的特性:业务无关,一个具有普适性质的消息队列组件不需要考虑上层的业务模型,只做好消息的分发就可以了,上层业务的不同模块反而需要依赖消息队列所...
  • 一、是什么中间件(Middleware)在计算机中,是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共...
  • 中间件漏洞汇总

    千次阅读 2021-11-26 20:56:02
    目录一些地址什么是中间件iis6x篇PUT漏洞漏洞描述漏洞复现防御方式解析漏洞-基于文件名原理复现防御解析漏洞-基于文件夹原理复现防御IIS短文件漏洞介绍原理复现防御RCE-CVE-2017-7269介绍影响范围复现防御iis7x篇...
  • 1、redux中间件简介 1.1、什么是redux中间件 redux 提供了类似后端 Express 的中间件概念,本质的目的是提供第三方插件的模式,自定义拦截 action -> reducer 的过程。变为 action -> middlewares -> ...
  • 其系统架构由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。第二部分将详细介绍这5个部分。下面自底向上分析各层。Android架构1、Linux...
  • 消息中间件的比较与选用概述ActiveMQKafkaRocketMQRabbitMQ 概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一...
  • 消息中间件选型,看这一篇就够了!!
  • 基于消息中间件的分布式系统的架构 消息中间件的考察点 是否有通讯能力 是否高可用 是否支持跨平台 是否有持久化 … 从上图可以看出,消息的中间件是 1.利用可靠的消息传递机制进行系统和系统之间的直接通讯 。 ...
  • 最近在看redux相关的东西,发现redux也有中间件一说。之前接触的express、koa也有中间件的概念,而axios中也有拦截器这种相似的机制,那就正好梳理下这些概念的原理。 阅读本篇文章之前,读者应该对axios、koa、...
  • 基于接口实现 强类型中间件需要实现 IMiddleware 接口,该接口定义了 InvokeAsync 的方法,请求的处理代码就是写在该方法中,该方法第一个参数是 HttpContext,第二个参数代表着后续中间件组成的管道委托。...
  • 全称(Advanced Message Queuing Protocol)是高级消息队列协议,由摩根大通集团列和其他公司共同设计,是个提供消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为响应消息中间件设计,基于...
  • 一般Java中间件监控技术分为2种:JMX与ByteCode,在HP的方案中,SiteScope完全基于JMX技术,通过对MBean状态的获取来了解J2EE容器内部性能指标(Counter),可以方便整合JNDIJDBC JTS及其它技术,特别是能够使用JNDI的...
  • 中间件,顾名思义存在于两个系统之间的,起到连接的设备。 (1)为什么是设备? 硬件和软件在一定程度上可以互用,中间件既可以是硬件,也可以是软件,所以我说是设备,而不定义为,硬件或者软件的一种。 (2)起到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,010
精华内容 23,204
关键字:

中间件组成部分