精华内容
下载资源
问答
  • 1. 中间件的定义:中间件是一种软件,处于系统软件(操作系统网络软件)与应用软件之间,它能使应用软件之间进行跨网络的协同工作(也就是互操作),这时允许各应用软件之下所涉及的“系统结构、操作系统、通信协议...

    第一章 中间件产生背景与分布式环境

    1. 中间件的定义:中间件是一种软件,处于系统软件(操作系统网络软件)与应用软件之间,它能使应用软件之间进行跨网络的协同工作(也就是互操作),这时允许各应用软件之下所涉及的“系统结构、操作系统、通信协议、数据库和其他应用服务”各不相同。

    2.中间件分类:

        终端仿真/屏幕转换中间件

        数据库访问中间件

        远程过程调用中间件

        面向消息中间件

        事务(交易)中间件

        分布式对象中间件

    3.远程过程调用中间件:

    1). RPC:(远程过程调用中间件)

    定义:本地过程调用的扩展,通过这种调用机制,程序员编写客户方应用时,可根据需要透明地调用位于远端服务器上的过程。

    功能:它以“过程”为基本单位调用,采用C/S模型进行远程通讯,提供了数据表示、可靠传输、服务定位功能,实现了七层协议中会话层的功能,为实现分布式计算提供简单实现途径。是DCE,DCOM,CORBA的通信基础。

         工作原理:

    ①用中间件中的IDL对调用顺序加以描述;

    ②利用IDL编译器对这种定义和描述进行编译,从而生成支持客户机和服务器进行通信的管道;

    ③在服务器端,被调用的远端过程需单独编写,并被置入服务器端框架,同时要在远程过程调用中间件中进行注册,以备调用。

    ④启动本地客户端存根——〉存根捆绑远端过程名和参数——〉利用网络传输到服务器端框架,从而实现数据格式的转换和参数的传递

    ⑤采用调用/返回模式具体地完成远端过程调用

         RPC的语义:

    • Last-of-many:被调用的过程可能执行若干次,但规定其最后一次执行的结果作为返回结果。
    • At-most-once:若调用者收到了回复消息,则称被调用的过程正确地完成了它的一次(仅仅一次)执行。
    • At-least-once:远程调用过程至少执行一次,回复消息可能返回一次或多次。
    • Exactly-once:若服务器正常,则远程过程恰好执行一次,并返回一个调用结果。    

       桩的作用:1.初始化并与远程对象所在的虚拟机连接;2.将参数打包,传递到远程虚拟机;3.等待结果;4.解包返回值和异常;5.将返回值返回给调用者。

      框架的作用:1.解包客户端输入的远程方法参数;2.调用实际的远程对象方法;3.将结果打包返回给调用者。

        用C实现RPC过程:1.用IDL定义远程服务接口;2.用MIDL编译接口并产生 .h , _s.c , _c.c 为后缀三个文件;3.服务端发服务(server.c , .h , _s.c);4.客户端调用服务(client.c, .h , _c.c)。

    2). RMI(远程方法调用):在分布式程序中,其远程对象的方法能够被运行在不同主机上的其他Java虚拟机的方法调用

    特点:可以实现“对象”为基本单位调用,实现远程对象之间的无缝调用,为Java分布式计算提供简单而直接的途径,是EJB的通讯基础。

        桩的作用:与RPC中桩的作用一样。

        框架的作用: 与RPC中的作用一样。

        具体实现过程:1.定义远程服务接口;2.实现远程服务接口;3.用rmic编译产生桩/框架;4.服务端发布服务;5.客户端调用服务。

    第三章 COM相关技术

    COM:组件对象模型,是软件对象组件互相通信的一种方式,它是一种二进制和网络标准,允许任意两个组件相互通信,而不管它们是在什么计算机上。 

    它既提供了组件之间的交互规范(组件模型),也提供了实现交互的环境(COM库)。

    组件:具有一定逻辑功能的可执行代码,是组成应用程序的构件。

    接口:对其他软件和组件能使用的公用功能的定义,是组件与外界的交互通道。

    COM库的实现在os层,其中的函数名通常以Co开头。

    IUnknown接口:所有的的COM组件都必须实现IUnknown接口

    IDispatch接口:从IUnknown接口派生,有了这个接口,COM可以通过一个标准的接口来提供它所支持的服务,而无需提供多个特定与服务的接口。

    COM接口:由128位全局唯一标识符(GUID)标识,称为IID。客户通过GUID获得接口指针,通过此指针,调用接口成员函数,实现服务功能,GUID标识组件时为CLSID。

    接口的特点:二进制特性、接口不变性、继承性、多态性

    使用Microsoft的IDL来定义接口

    类工厂:就是一个能够创建其他组件的组件。

    一个类工厂只能创建某个特定的CLSID相对应的组件。而类工厂实现时并没有为它分配一个唯一标识符CLSID。它也没有在系统的注册表中注册。

    进程内组件——DLL,进程外组件——EXE

    DCOM(分布式组件对象模型):是分布式应用环境中的COM技术,是COM的无缝扩展,处理了底层网络协议的所有细节,支持不同计算机上组件对象与客户程序之间或者组件对象之间的相互通信。

    进程和组件处于不同机器时,DCOM仅仅是用网络协议代替本地进程之前的通信。

    把进程的透明性转换为了位置的透明性

    MTS:COM组件的一致管理系统,为COM技术的企业应用提供基本的组件管理与配置环境,一方面为组件提供新的服务,另一方面代表一种编程模型。

    COM+:是一个面型应用的高级COM运行环境,他在COM这一编程模型的基础上实现了许多面向企业应用的分布式应用所需的服务,并将它们与操作系统集成在一起。

    第四章 J2EE技术

    EJB定义了服务端组件的编写规则、组件之间的交互规则和应用服务器对组件的管理规则。

    RMI:Java远程方法调用,提供跨进程的组件通信和相关的通信服务。

    RMI-IIOP:扩展了RMI,提供与CORBA的继承,用于J2EE的正式API。

    JNDI:Java名称和目录接口,用于网络中定位组件和其他资源。

    JDBC:提供关系数据库的连接和相应的数据库操作。

    JTA和JTS:使组件支持事务处理的规范。

    JMS:用于分布式对象的异步通信。

    Java Servlets和JSP:适用于请求/应答模式分布式计算的网络组件。

    Java IDL:用于基于Java的CORBA实现,使Java与其他编程语言集成。

    Connectors:是J2EE可以运行高端事务处理的主机系统集成。

    JCA/JCE/JSSE/JAAS:安全服务体系,专门处理身份验证及权限控制的标准服务。

    EJB的定义:用于开发和部署多层结构的、分布式的、面向对象的Java应用系统的跨平台的构件体系结构。

    显式中间件:调用服务时,需要手工编写代码开实现调用服务的中间件。

    隐式中间件调用服务时,不需要手工编写一行代码就可以调用该服务的中间件。

    EJB容器通过请求拦截器(EJB对象)实现隐式中间件。请求拦截器通过EJB在部署描述文件中描述的需求信息,知道怎样去使用中间件。

    EJB容器的定义:是EJB组件的运行环境,是一层代替bean执行相应服务的接口。

    作用:EJB容器负责将客户端程序连接到Beans,执行事务协调,提供数据存储,管理Bean的生命周期,透明地管理分布式组件体系结构的系统开销,无论是Bean还是调用Bean的客户程序都不显式地对EJB容器的API进行编码,从本质上讲,EJB容器是客户端程序和Bean之间看不见的中间人。

    HOME接口:允许客户建立或者删除EJB

    REMOTE接口:由Bean提供商编写的一个特殊的接口,复制对应的Bean类公开的所有商务方法。EJB容器依据这些信息自动生成对应的EJB对象

    第五章 CORBA

    OMA对象模型体系结构:包括对象模型和参考模型

    对象模型:定义如何描述分布式异质环境中的对象;

    参考模型:描述对象之间的交互

    CORBA公共对象请求代理体系结构,是由OMG提出的应用软件体系结构和对象技术规范,器核心是一套标准的语言、接口和协议,以支持易购分布应该程序见的互操作性及独立于平台和编程语言的对象重用。

    ORB核心(软总线,跨平台):对象请求代理,是对象总线,它能使对象透明地向其他本地或远程对象发出请求或获得应答。而客户方并不需要了解服务对象的通信、激活或存储机制

    CORBA体系结构

    ORB规范包含的内容:

    1、ORB 核心——软总线(跨平台)

    2、OMG界面定义语言——IDL(跨语言)

    3、语言映射——C++ 或Java

    4、界面仓库和实现仓库——动态调用

    5、静态存根和框架——静态调用

    6、动态存根和框架——动态调用

    7、对象适配器——适配层

    8、ORB之间的互操作——GIOP/IIOP

    ORB运行过程:

    ⑴客户通过某种方式找到特定对象实现的对象引用;

    ⑵如果该对象实现有相应的静态存根,则客户可以通过该静态存根向对象实现发送请求,否则,在界面仓库的协助下,客户可以使用动态调用界面DII来向对象实现发出请求;

    ⑶当对象调用请求通过静态存根或动态调用界面DII到达ORB核心以后,ORB核心负责请求的传送,将其送给相应的对象适配器,其具体的请求传递方式由ORB的具体实现决定;

    ⑷对象适配器接到请求后,判断一下所请求的对象实现是否有静态框架存在,如果有,则对象适配器通过静态框架调用执行对象实现中的操作,否则,对象适配器将通过动态框架界面DSI中的动态实现例程来调用对象实现中的操作;

    ⑸对象实现的特定操作方法执行完成后,结果将按照对象请求传递和执行路径逆向返回给客户对象;

    OMG IDL IDL是一个纯说明性语言,非编程语言,从而将界面与对象实现分离。不能用OMG IDL语言直接实现分布式应用,所以要把IDL的特性映射为具体语言的实现,这就是语言映射的人物。

    静态存根和框架(静态调用):存根代表客户创建并发出请求;框架则把请求交给CORBA对象实现。

    存根负责接收客户程序的请求、对请求的参数进行封装和发送以及对返回结果的接收和解封装;框架负责将请求参数解封装,识别客户所请求的服务,调用对象实现,并把执行结果封装然后返回客户方。

    动态存根和框架(动态调用)

    动态调用界面(DII)——通用存根,支持客户方的动态请求调用。

    动态框架界面(DSI)——通用框架,支持服务方的动态对象调用。

    对象适配器OA(适配层):联系对象实现和ORB本身的纽带,提供了服务器端对象实现和ORB核心直接的适配层,为对象实现大部分所需的ORB功能。

    ORB之间的互操作(GIOP/IIOP):有两种方式:直接互操作和基于桥的互操作。

    GIOP:是互操作体系结构的基础,定义了用于ORB间通信的一种标准传输语法和一组消息格式;IIOP:互联网ORB互通协议,是GIOP的一种映射,说明如何在TCP/IP网络上交换GIOP消息。

    IOR:可操作对象引用,对象的IOR所提供的信息可用于在多个不同的ORB间确定对象的位置。

    静态调用:通过存根和框架的调用(在请求真实发生之前,存根和框架早已分别被直接连接到客户程序和对象实现中去);

    动态调用:构造并发送一个请求,请求中的参数说明只有在运行时才能知道

    CORBA基本服务:名字服务、事件服务、交易器服务、负载均衡、容错服务

    CORBA核心服务:对象定位、消息传输、安全服务

    第七章 分布式事务处理

    事务:是指对特定的共享资源的一组不可分割的操作,具有ACID性 

    原子性(Atomicity)事务中多有操作是一个不可分割的整体。

    一致性(consistency)事务中涉及的资源从一个合法状态转变成另外一个合法状态,中间不能出现数据不一致的情况。

    孤立性(Isolation):一个事务只有在结束后才对其他事务产生影响,期中间结果对其他事务是不可见的。

    持久性(Durability):事务一旦完成,其影响是持久的。

    分布式事务处理:在分布的、异构的环境中,数据是分布的,一个事务的执行涉及对分布在多个不同结点的数据的更改。

    X/Open DTP模型是一个用于规范在分布、异构的环境下应用程序与不同资源之间相互协调进行事务处理的标准。

    分布事务处理模型X/Open DTP模型的组成:

    ⑴应用程序(AP):事务的使用者,它发出开始、提交或回滚事务的请求。它规定了一个事务的界限,并给出事务所包含的操作

    ⑵资源管理器(RM):提供对共享资源的访问。

    ⑶事务管理器(TM:AP与RM之间的协调员。它给每个事务分配标识符,监视它们的进展,保证事务处理的顺利进行,并负责事务在失败情况下的恢复。

    X/Open DTP模型各组成部分之间的作用关系:

    AP-RM之间采用RM的特有API接口,X/Open对这部分的规范较少。

    AP-TM之间采用TX接口。AP利用这个接口向TM发出开始和结束一个事务的请求,进行全局事务的管理。

    TM-RM之间采用XA双向接口(RM->TM为xa 反之为ax)。TM利用这个接口使各个RM合作完成一个全局事务。

    分布事务处理模型X/Open DTP——事务处理过程:

    ①AP首先通过TX接口告诉TM要开始一个新事务

    ②TM分配全局事务ID,调用XA接口通知各RM新事务开始;

    ③AP访问RM

    ④操作完成后,AP要求TM提交事务

    ⑤TM调用XA接口协调各RM进行事务提交

    事务类型:平坦事务,链式事务,嵌套事务

    作用域的角度,事务划分成:全局事务和本地事务

    两阶段提交协议:

    思路:在TM向所有RM发出正式提交请求之前,先询问所有的RM是否已准备好提交仅当所有的RM都给出肯定的回答时,TM才发出提交的请求;如果有一个RM给出否定的回答,TM就指示所有的RM进行回滚

    两阶段提交协议(2PC)的两个阶段:

    阶段一:准备阶段

    TM询问所有的RM是否已经准备好提交

    阶段二:提交阶段

    TM检查所有RM的回答,只要有一个RM给出否定的回答,TM就指示所有的RM进行回滚。否则TM将指示所有的RM提交。

    第九章 无线、移动中间件

    无线CORBA的核心技术:

    终端域:移动终端活动的区域,处于移动网络中,一般为客户端,是整个服务的发起者。CORBA服务代理:实现命名服务绑定的自动更新和迁移;移动事件提供者:提供消息响应机制;终端桥:终端域与访问域之间的接口,主要完成终端启动自举、初始化访问、迁移和访问的恢复以及GIOP/UDP、GIOP/WAP的映射。

    访问域: CORBA服务提供域,一般存在于固定网络环境中,但在特定场合下也会移动。服务:安全服务、交易服务、持久服务、通知服务等;访问桥:终端桥的对应部分,负责初始化访问、提供透明的IOR、完成连接迁移和访问的恢复以及为止相关的一下函数;GIOP隧道:实现系统的透明通信。

    宿主域:位置向导,提供位置透明服务,一般存在于固定网络环境中,且不会移动,具有较强的容错能力,命名服务:提供基本的名字服务、交易器服务;宿主位置代理:在命名服务的基础上,提供位置向导代理,从而实现位置的透明性。

    移动IOR:用来发送请求道宿主域。先让客户请求传送到宿主域;宿主域将服务所属的访问桥、移动终端信息等返回给客户;客户收到消息后,得知服务所在的访问桥,进而将请求转发到该服务。移动IOR是实现移动透明性的基础

    移动客户调用移动服务流程:P169

    第十章 反射中间件

    反射:既然一个过程,借助于包含一个组成过程(解释器)来形式化地操纵外部世界的表示,从而可以推理外部世界;那么这个计算过程也可以设计为能推理期自身,同样借助于包含一个组成过程(解释器)来操纵其自身的操作和结构。

    反射的实现:虚拟机的存在。虚拟机根据对该类的了解封装成一个对象,这个对象可供其他程序访问。

    通过反射,一个程序可以访问、推理和改变其自身的解释。

    反射中间件:通过适当的因果相联的自表示,能够检查和调整期行为的中间件系统。1.检查系统的结构、状态和行为;2.灵活性和适应性;3.关注分离。

    第十一章 网络即插即用中间件

    Jini系统的目标:⑴提供一个能够帮助不同网络用户在任何网络群体自然地完成发现、加入和参与的基础设施。⑵提供一种基础设施,实现零安装和零配置。“即插即用”而非“即插即请求”。⑶通过把所有的对象都处理为服务,提供一种以服务网络为中心的体系结构。⑷提供一种能处理部分失败,实现自愈合的网络体系结构。

    Jini的组成:基础设施  编程模型  服务。

    第十二章 其他中间件技术

    Web服务:是在Internet上进行分布式计算的基本构造块。

    Web Service:一个通过URL识别的软件应该程序,期界面及绑定能用XML文档来定义、面述和发现,并且基于Internet协议上的消息传递,使用XML支持和其他软件应用程序的直接交互。

    Web三大模块:

    传输模块(SOPA协议):在线交互的标准

    描述模块(WSDL):用于描述服务个体或服务的收集

    发现模块(通用发现、说明和集成UDDI):用于服务的发现

    SOAP:Web服务的通信协议,SOAP用来定义消息的XML格式,包含在一对SOAP元素中的、结构正确的XML段就是SOAP消息L文件是一个XML文档,用于说明一组SOAP消息以及如何交换这些消息。

    UDDI:通用发现、说明和集成,是Web服务的黄页。可以搜索提供所需服务的公司,进行阅读以便了解其所提供的服务,然后再与某人联系以获得更多信息。

    消息中间件

    考其基本结构、工作模式及其特点。

     

    展开全文
  • 二、第l章中间件产生背景分布式计算环境 第2章面向对象中间件oDP 第3章com相关技术 第4章J2EE技术 第5章CORBA初步 第6章CORBA服务 第7章中间件中的事务处理 第8章coRBA高级技术 第9彦无线、移动中间件 第10章反射...
  • 中间件根本原理 : 对store.dispatch进行改造。 中间件出现的原因 :由于很多时候执行dispatch并不仅仅是立即去更新reducer,这时需要执行其他函数来满足项目需求,这些函数就是中间件,最后执行过一系列中间件后...
    • 首先看下redux执行流程:
      在这里插入图片描述
    redux设计思想:
    • (1)Reducer:纯函数,只承担计算 State 的功能,不合适承担其他功能,也承担不了,因为理论上,纯函数不能进行读写操作。
      *(2)View:与 State 一一对应,可以看作 State 的视觉层,也不合适承担其他功能。
    • (3)Action:存放数据的对象,即消息的载体,只能被别人操作,自己不能进行任何操作。
    • 想来想去,只有发送 Action 的这个步骤,即store.dispatch()方法,可以添加功能。
      中间件根本原理对store.dispatch进行改造。
      中间件出现的原因 :由于很多时候执行dispatch并不仅仅是立即去更新reducer,这时需要执行其他函数来满足项目需求,这些函数就是中间件,最后执行过一系列中间件后再去执行reducer
      • 举例来说,要添加日志功能,把 Action 和 State 打印出来,可以对store.dispatch进行如下改造。
      let next = store.dispatch;
    store.dispatch = function dispatchAndLog(action) {
      console.log('dispatching', action);
      next(action);
      console.log('next state', store.getState());
    }
    
    • 上面代码中,对store.dispatch进行了重定义,在发送 Action 前后添加了打印功能。这就是中间件的雏形。

    • 中间件就是一个函数,对store.dispatch方法进行了改造,在发出 Action 和执行 Reducer 这两步之间,添加了其他功能。


    applyMiddlewares的作用:它是 Redux 的原生方法,作用是将所有中间件组成一个数组,依次执行。
    • 源码
    const store=createStore(reducer,applyMiddleware(logger,thunk))
    export default function applyMiddleware(...middlewares) {
      return (createStore) => (reducer, preloadedState, enhancer) => {
        var store = createStore(reducer, preloadedState, enhancer);
        var dispatch = store.dispatch;
        var chain = [];
        var middlewareAPI = {
          getState: store.getState,
          dispatch: (action) => dispatch(action)
        };
        chain = middlewares.map(middleware => middleware(middlewareAPI));
        dispatch = compose(...chain)(store.dispatch);
     
        return {...store, dispatch}
      }
    }
     
    //执行顺序解析
    //中间件数组传入{getState: store.getState,dispatch: (action) => dispatch(action)} => 
    //compose合并新中间件数组 并传入dispatch=>
    //执行完所有中间件函数后返回store和dispatch
    
    applyMiddlewares调用实例:返回store对象
    let middlewares = [loggerMiddleware, thunkMiddleware, ...others];
    let store = applyMiddleware(middlewares)(createStore)(reducer, initialState);
    
    展开全文
  • 在线IDE开发入门之从零实现一个在线代码编辑器 基于React+Koa实现一个h5页面可视化编辑器-Dooring 如何实现后台管理系统的权限路由和权限菜单 前言 中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件...

    精彩回顾

    前言

    中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。

    在NodeJS中,中间件主要是指封装http请求细节处理的方法。我们都知道在http请求中往往会涉及很多动作, 如下:

    • IP筛选

    • 查询字符串传递

    • 请求体解析

    • cookie信息处理

    • 权限校验

    • 日志记录

    • 会话管理中间件(session)

    • gzip压缩中间件(如compress)

    • 错误处理

    当然还有很多自定义的处理动作. 对于Web应用而言,我们并不希望了解每一个细节性的处理工作,而是希望能够把主要精力集中在业务的开发上,以达到提升开发效率的目的, 所以引入了Node中间件来简化和封装这些基础逻辑处理细节.

    node中间件本质上就是在进入具体的业务处理之前,先让特定过滤器处理。如下图所示: 

    我们目前看到的主流nodejs框架, 比如connect, koa, express, egg, nest等, 都离不开中间件的设计概念, 所以为了能让大家更深入的窥探nodejs世界, 我们就非常有比较研究中间件的实现原理.

    正文

    在了解node中间件的概念之后, 我们就来手动实现一下中间件, 最后我们会简单分析一下koa中中间件的实现思路. 文章大纲如下:

    • node中间件核心原理实现

    • koa中间键实现方式

    • 利用koa中间件机制实现一个自己的koa中间件

    node中间件核心原理实现

    由上文介绍可知中间件是从http请求开始到响应结束过程中的处理逻辑,通常需要对请求和响应进行处理. 我们在实现node中间件模式时还需要考虑的一个问题就是多中间件共存的问题, 我们要思考如何将多个中间件的执行自动化, 不然在请求到响应的过程中只会执行最开始的中间件, 所以我们基本的中间件形式如下:

    const middleware = (req, res, next) => {
      // 请求处理逻辑
      next()
    }
    
    复制代码
    

    接下来我们先写个简单的案例来看看中间件是如何实现的.

    // 定义几个中间间函数
    const m1 = (req, res, next) => {
      console.log('m1 run')
      next()
    }
    
    const m2 = (req, res, next) => {
      console.log('m2 run')
      next()
    }
    
    const m3 = (req, res, next) => {
      console.log('m3 run')
      next()
    }
    
    // 中间件集合
    const middlewares = [m1, m2, m3]
    
    function useApp (req, res) {
      const next = () => {
        // 获取第一个中间件
        const middleware = middlewares.shift()
        if (middleware) {
          middleware(req, res, next)
        }
      }
      next()
    }
    
    // 第一次请求流进入
    useApp()
    
    复制代码
    

    由以上代码我们就不难发现next的作用了, 也就是实现自动调用中间件链的关键参数. 打印结果如下:

    m1 run
    m2 run
    m3 run
    
    复制代码
    

    以上即实现了基本中间件的执行模式, 但是我们还需要考虑异步的问题, 如果中间件还依赖第三发模块或者api的支持, 比如验证, 识别等服务, 我们需要在该异步中间件的回调里执行next, 才能保证正常的调用执行顺序, 如下代码所示:

    const m2 = (req, res, next) => {
      fetch('/xxxxx').then(res => {
    	next()
      })
    }
    
    复制代码
    

    还有一种中间件场景, 比如说日志中间件, 请求监控中间件, 它们会在业务处理前和处理后都会执行相关逻辑, 这个时候就要求我们需要能对next函数进行二次处理, 我们可以将next的返回值包装成promise, 使得其在业务处理完成之后通过then回调来继续处理中间件逻辑. 如下所示:

    function useApp (req, res) {
      const next = () => {
        const middleware = middlewares.shift()
        if (middleware) {
          // 将返回值包装为Promise对象
          return Promise.resolve(middleware(req, res, next))
        }else {
          return Promise.resolve("end")
        }
      }
      next()
    }
    
    复制代码
    

    此时我们就能使用如下方式调用了:

    const m1 = (req, res, next) => {
      console.log('m1 start')
      return next().then(() => {
        console.log('m1 end')
      })
    }
    
    复制代码
    

    以上我们就实现了一个基本可以的中间件设计模式, 当然我们也可以用async和await实现, 写法会更优雅和简单. 笔者这里上一份简单的例子:

    const m1 = async (req, res, next) => {
        // something...
        let result = await next();
      }
      
      const m2 = async (req, res, next) => {
        // something...
        let result = await next();
      }
      const m3 = async (req, res, next) => {
        // something...
        let result = await next();
        return result;
      }
    
    const middlewares = [m1, m2, m3];
    
    function useApp (req, res) {
        const next = () => {
          const middleware = middlewares.shift()
          if (middleware) {
            return Promise.resolve(middleware(req, res, next))
          }else {
            return Promise.resolve("end")
          }
        }
        next()
      }
    // 启动中间件
    useApp()
    
    复制代码
    

    在koa2框架中, 中间件的实现方式也是将next()方法返回值封装为Promise对象,实现了其提出的洋葱圈模型,如下图所示: 

    koa中间件实现方式

    koa2框架的中间件实现原理很优雅,笔者觉得很必要研究一下, 这里展示一下其核心思路:

    function compose (middleware) {
      // 提前判断中间件类型,防止后续错误
      if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')
      for (const fn of middleware) {
        // 中间件必须为函数类型
        if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')
      }
      return function (context, next) {
        // 采用闭包将索引缓存,来实现调用计数
        let index = -1
        return dispatch(0)
        function dispatch (i) {
          // 防止next()方法重复调用
          if (i <= index) return Promise.reject(new Error('next() called multiple times'))
          index = i
          let fn = middleware[i]
          if (i === middleware.length) fn = next
          if (!fn) return Promise.resolve()
          try {
            // 包装next()返回值为Promise对象
            return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));
          } catch (err) {
            // 异常处理
            return Promise.reject(err)
          }
        }
      }
    }
    
    复制代码
    

    利用koa中间件机制实现一个自己的koa中间件

    学习了中间件的设计机制和原理, 我们是不是想马上写一个中间件呢? 笔者这里给大家举一个例子. 在H5-Dooring项目的服务端代码中, 我们需要对用户登录权限进行分发, 此时我们提供统一个中间件来处理, 如下代码所示:

    // 模拟数据库操作
    const token = db.user();
    
    // router或者koa的中间件一定要用await处理next,否则将不能正常响应数据
    export default async (ctx, next) => {
      const t = ctx.request.header.authorization
      let uid = ctx.request.header['x-requested-with']
      let uidArr = uid.split(',')
      if(uidArr.length > 1) {
          uid = uidArr.pop().trim()
      }
        if(token[uid] && token[uid][1] === t) {
            await next()
        }else {
            ctx.status = 403;
            ctx.body = {
                state: 403,
                msg: '你没有权限操作'
            }
        }  
    }
    
    复制代码
    

    以上代码即实现用户登录态处理, 如果用户在没有登录的情况下防问任何需要登录的接口, 都将返回权限不足或则在请求库中让其重定向到登录页面.

    所以, 今天你又博学了吗?

    最后

    笔者最近在迭代开源项目H5-Dooring,大家感兴趣的也可以研究交流一下.

    如果想学习更多H5游戏, webpack,node,gulp,css3,javascript,nodeJS,canvas数据可视化等前端知识和实战,欢迎在《趣谈前端》一起学习讨论,共同探索前端的边界。

    点击左下角阅读原文, 为H5-Dooring投票!

    展开全文
  • 发送和接收是异步的,发送者无需等待,二者的生命周期也可以不必相同,而且发送者可以将消息间接传给多个接收者,大大提高了程序的性能、可扩展性健壮性,这使得异步处理模型在分布式应用上比起同步处理模型更具有...
  • 中间件技术原理应用ppt

    热门讨论 2012-03-05 00:16:36
    中间件技术原理应用ppt转pdf  中间件技术由于自身的互操作性、强大的服务功能、快速的开发能力等特性,目前已经成为诸如金融、电信等大型核心业务系统的支撑平台。围绕中间件的各种相关技术近几年来也成为研究...
  • 中间件技术原理及应用 清华大学出版社 老师上课时用的课件,很不错!
  • 技术看,应用程序的规模不断扩大,特别是Internet WWW 的出现,使计算机的应用范围更 为广阔,许多应用程序需在网络环境的异构平台上运行。这一切都对新一代的软件开发提出 了新的需求。在这种分布异构环境中,...
  • 清华大学版中间件技术原理及应用,内容比较详细,是一本不错的教材。
  • 本文实例讲述了Laravel的中间件实现原理。分享给大家供大家参考,具体如下: #1 什么是中间件? 对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才可以让它继续传递到更深层次...
  • 中间件技术原理应用课后习题 参考答案 S1.中间件产生背景分布式计算环境 1.比较开放系统与分布式系统的异同 分布式系统具备以下属性远程性并发性异步性异质性自主性联合性伸缩性发展性移动性 开放系统具备以下...
  • 中间件原理

    千次阅读 2018-01-06 11:32:46
    中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件 IDC的定义是:中间件是一种独立的系统软件或服务...

    是什么?

    中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件 
    IDC的定义是:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。


    解决了什么?

    在中间件产生以前,应用软件直接使用操作系统、网络协议和数据库等开发,这些都是计算机最底层的东西,越底层越复杂,开发者不得不面临许多很棘手的问题,如操作系统的多样性,繁杂的网络程序设计、管理,复杂多变的网络环境,数据分散处理带来的不一致性问题、性能和效率、安全,等等。这些与用户的业务没有直接关系,但又必须解决,耗费了大量有限的时间和精力。于是,有人提出能不能将应用软件所要面临的共性问题进行提炼、抽象,在操作系统之上再形成一个可复用的部分,供成千上万的应用软件重复使用。这一技术思想最终构成了中间件这类的软件。中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担。


    种类有哪些?

    种类作用
    消息中间件适用于任何需要进行网络通信的系统,负责建立网络通信的通道,进行数据或文件发送。消息中间件的一个重要作用是可以实现跨平台操作,为不同操作系统上的应用软件集成提供服务。
    交易中间件适用于联机交易处理系统,主要功能是管理分布于不同计算机上的数据的一致性,保障系统处理能力的效率与均衡负载。交易中间件所遵循的主要标准是x/open dtp模型。
    对象中间件基于corba标准的构件框架,相当于软总线,能使不同厂家的软件交互访问,为软件用户及开发者提供一种即插即用的互操作性,就像现在使用集成块和扩展板装配计算机一样。
    应用服务器用来构造internet/intranet应用和其它分布式构件应用,是企业实施电子商务的基础设施。应用服务器一般是基于j2ee工业标准的。
    安全中间件以公钥基础设施(pki)为核心的、建立在一系列相关国际安全标准之上的一个开放式应用开发平台,向上为应用系统提供开发接口,向下提供统一的密码算法接口及各种ic卡、安全芯片等设备的驱动接口。
    应用集成服务器把工作流和应用开发技术如消息及分布式构件结合在一起,使处理能方便自动地和构件、script 

    展开全文
  • 消息传输中间件JWMQ原理应用.pdf
  • 在初级Django开发项目中,你大概率用不到中间件(Middleware)。...本文着重分析中间件(middleware)的工作原理应用场景,并提供一些使用自定义中间件的简单例子。注意:本文示例所使用Django版本为D...
  • 中间件产生背景分布式计算环境 1.比较开放系统与分布式系统的异同 分布式系统具备以下属性远程性并发性异步性异质性自主性联合性伸缩性发 展性移动性 开放系统具备以下属性开放的集成的灵活的模块化的可联合的可...
  • 消息中间件原理及架构框架

    千次阅读 2018-07-29 22:57:05
    消息中间件就是在消息的传输过程中保存消息的容器。消息中间件再将消息从它的源中继到它的目标时充当中间人的作用。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,...
  •  以前的网络主要是客户端与服务器(C/S)结构或浏览器/服务器(B/S) 形式的两层结构,随着企业信息的不断扩大,企业级应用不再满足于简单的两层系统,而是向着三层和多层体系结构发展。中间件就是在其中加入一个...
  • 消息中间件原理

    2021-04-08 06:34:51
    消息中间件原理一、中间件二、中间件种类三、分布式架构四、消息中间件五、消息中间件的核心组成部分六、网络协议七、AMQP协议八、Kafka协议九、消息的持久化十、消息的分发策略十一、消息队列高可用和高可靠 ...
  • 中间件技术原理应用课后习题参考答案 S1.中间件产生背景分布式计算环境 1.比较开放系统与分布式系统的异同 分布式系统具备以下属性远程性并发性异步性异质性自主性联合性伸缩性 发展性移动性 开放系统具备以下...
  • 实验一 远程过程调用中间件及数据访问中间件 实习二 消息中间件应用开发 实习三 IoCDI和RPC框架实现 实习四 Web Services 开发 说明一下这个是2020年西北农林科技大学的中间件实验,可能针对性比较强,外校的慎下...
  • 最近在学习laravel框架的时候,发现框架实现了中间件,闲着没事就顺藤摸瓜,研究了其实现原理,有分析不对的请留言指正。 百度百科解读中间件 中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的...
  • 在初级Django开发项目中,你大概率用不到中间件(Middleware)。但随着项目需求越来越复杂,你就需要开始编写自己的中间件了。当你了解到Djan...
  • TUXEDO中间件介绍及应用

    千次阅读 2017-07-26 09:27:21
    中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。 中间件屏蔽了底层操作系统的复杂性,使程序开发...
  • 中间件的实现原理

    万次阅读 2017-10-10 10:23:38
    Express 应用的请求-响应循环里,下一个内联的中间件通常用变量 next 表示。  那么现在我先上一道我面试中遇到的一道题,考的就是中间件的一个实现思路。当然如果你知道express,会更好地帮助你理解。  
  • Redux中间件原理详解

    2018-10-12 21:09:08
    目录1、中间件是什么样子的1.2 thunk中间件1.2promise中间件1.3logger中间件2、怎么使用中间件3、中间件运行原理3.1 中间件的内部逻辑3.2 触发一个action时,执行逻辑附录compsoe 为了解析中间件,先看一下几个...
  • 符合哪些条件的应用程序可以称为中间件,求高手们解答!!!!!
  • 嵌入式系统原理及应用课后习题答案

    千次阅读 多人点赞 2021-09-03 16:20:02
    嵌入式系统原理及应用-基于ARM Cortex-M3内核的STM32F103系列微控制器第1篇 系统篇第1章嵌入式系统概述第2章嵌入式系统开发第2篇 内核篇第3章ARMCortex-M3处理器第4章基于ARMCortex-M3的STM32微控制器第3篇 片内外设...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,175
精华内容 29,270
关键字:

中间件原理及应用