何为django middlewaree

更多公众号:gh_7eOSChina 开源中国 官方微信账号最新文章热门文章对这篇文章不满意?您可以继续搜索:百度:搜狗:感谢您阅读理解 Rack 应用及其中间件,本文由网友投稿产生,如果侵犯了您的相关权益,请联系管理员。什么是中间件?_百度知道
什么是中间件?
中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。在众多关于中间件的定义中,比较普遍被接受的是IDC表述的:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。
IDC对中间件的定义表明,中间件是一类软件,而非一种软件;中间件不仅仅实现互连,还要实现应用之间的互操作;中间件是基于分布式处理的软件,最突出的特点是其网络通信功能。
最早具有中间件技术思想及功能的软件是IBM的CICS,但由于CICS不是分布式环境的产物,因此人们一般把Tuxedo作为第一个严格意义上的中间件产品。Tuxedo是1984年在当时属于AT&&T的贝尔实验室开发完成的,但由于分布式处理当时并没有在商业应用上获得像今天一样的成功,Tuxedo在很长一段时期里只是实验室产品,后来被Novell收购,在经过Novell并不成功的商业推广之后,1995年被现在的BEA公司收购。尽管中间件的概念很早就已经产生,但中间件技术的广泛运用却是在最近10年之中。BEA公司1995年成立后收购Tuxedo才成为一个真正的中间件厂商,IBM的中间件MQSeries也是90年代的产品,其它许多中间件产品也都是最近几年才成熟起来。国内在中间件领域的起步阶段正是整个世界范围内中间件的初创时期。东方通科技早在1992年就开始中间件的研究与开发,1993年推出第一个产品TongLINK/Q。而中科院软件所、国防科技大学等研究机构也对中间件技术进行了同步研究。可以说,在中间件领域,国内的起步时间并不比国外晚多少。
其他类似问题
为您推荐:
就是帮助你软件正常运行的
中间件的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁什么是中间件?
什么是中间件?
中间件就是程序中可织入的,可重用的,与业务逻辑无关的各种组件。中间件( middleware )是基础软件的一大类,属于可复用软件的范畴。顾名思义,中 间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上, 应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户 灵活、高效地开发和集成复杂的应用软件。在众多关于中间件的定义中,比较普遍被接受的是 IDC 表述的:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件 位于客户机服务器的操作系统之上,管理计算资源和网络通信。分类:数据访问中间件,远程调用中间件,消息中间件,交易中间件,对象中间件。举例:1 , RMI ( Remote Method Invocations, 远程调用)2 , Load Balancing( 负载均衡,将访问负荷分散到各个服务器中 )3 , Transparent Fail-over( 透明的故障切换 )4 , Clustering( 集群 , 用多个小的服务器代替大型机)5 , Back-end-Integration( 后端集成,用现有的、新开发的系统如何去集成遗留的系统 )6 , T ransaction 事务(全局 / 局部)全局事务(分布式事务)局部事务(在同一数据库联 接内的事务)7 , Dynamic Redeployment ( 动态重新部署 , 在不停止原系统的情况下,部署新的系统)8 , System Management( 系统管理 )9 , Threading( 多线程处理 )10 , Message-oriented Middleware 面向消息的中间件(异步的调用编程)11 , Component Life Cycle( 组件的生命周期管理 )12 , Resource pooling (资源池)13 , Security (安全)14 , Caching (缓存)
是本站开发的一款收藏记录创意分享 ,开启高效之门的在线应用。点击: 收藏此文
你可能对这些文章感兴趣.
Copyright & 2013 java面试题什么是物联网中间件技术 - 电气资讯 - 电工之家
- 电工之家-电工学习网站
当前位置: >
什么是物联网中间件技术
时间: 20:37
来源:电工之家
作者:编辑部
1.中间件定义
  是独立的系统软件或服务程序,分布式应用软件借助中间件在不同的技术之间实现资源共享。
  应用于客户机、服务器的操作系统,管理计算机资源和网络通信。
  主要功能是连接两个独立应用程序或独立系统的软件,使相连接的系统即使具有不同的接口,利用中间件仍然能相互交换信息。
  执行中间件的关键途径是信息传递。
  2.中间件示意图
  3.中间件发展史
  最早具有中间件技术思想及功能的软件是IBM的CICS(Customer Information Control System),而CICS不是分布式环境的产物,因此人们一般把Tuxedo作为第一个严格意义上的中间件产品。
  Tuxedo是1984年在当时属于AT&T的贝尔实验室开发完成的,由于分布式处理当时并没有在商业应用上获得像今天一样的成功,Tuxedo在很长一段时期里只是实验室产品,后来被Novell收购,在经过Novell并不成功的商业推广之后,1995年被现在的BEA公司收购。
  BEA公司1995年收购Tuxedo才成为一个真正的中间件厂商。IBM的中间件MQSeries也是20世纪90年代的产品,其他许多中间件产品也都是最近几年才成熟起来。
  4.中间件主要特点
  满足大量应用的需要;
  运行于多种硬件和OS平台;
  支持分布计算,提供跨网络、硬件和OS平台的透明的应用或服务的交互;
  支持标准的协议;
  支持标准的接口;
  对于应用软件开发,中间件远比操作系统和网络服务更为重要;中间件提供的程序接口定义了一个相对稳定的高层应用环境,不管底层的计算机硬件和系统软件怎样更新换代,只要将中间件升级更新,并保持对外接口定义不变,应用软件几乎不需要任何修改,从而保护企业在应用软件开发和维护中的重大投资。
  5.什么是物联网中间件
  在物联网中采用中间件技术,以实现多个系统和多种技术之间的资源共享,最终组成一个资源丰富、功能强大的服务系统。
  6.物联网中间件的分类
  基于目的和实现机制的不同,业内将中间件分为以下几类:
  远程过程调用中间件(Remote Procedure Call)
  面向消息的中间件(Message-Oriented Middleware)
  对象请求代理中间件(Object Request Brokers)
  几类中间件可向上提供不同形式的通信服务,在这些基本的通信平台之上,可构筑各种框架,为应用程序提供不同领域内的服务,如事务处理监控器、分布数据访问、对象事务管理器等。
  平台为上层应用屏蔽了异构平台的差异,而其上的框架又定义了相应领域内应用的系统结构、标准的服务组件等,用户只需告诉框架所关心的事件,然后提供处理这些事件的代码。当事件发生时,框架会调用用户的代码。
  用户代码不用调用框架,用户程序也不必关心框架结构、执行流程、对系统级API的调用等,所有这些由框架负责完成。因此,基于中间件开发的应用具有良好的可扩充性、易管理性、高可用性和可移植性。
  7.物联网中间件发展的三个阶段
  应用程序中间件阶段(Application Middleware)
  架构中间件阶段(Infrastructure Middleware)
  解决方案中间件阶段(Solution Middleware)。
  物联网中间件最主要的代表是RFID中间件,其他的还有嵌入式中间件、数字电视中间件、通用中间件、M2M物联网中间件等。
  RFID中间件扮演RFID标签和应用程序之间的中介角色,从应用程序端使用中间件所提供一组通用的应用程序接口(API),即能连到RFID读写器,读取RFID标签数据。
  使用中间件后即使存储RFID标签数据的数据库软件或后端应用程序增加或改由其他软件取代,或者读写RFID读写器种类增加等情况发生时,应用端不需修改也能处理,省去多对多连接的维护复杂性问题。
  8.RFID中间件的三大类发展阶段
  (1)应用程序中间件发展阶段aa多以整合、串接RFID读写器为目的,RFID厂商提供简单API,以供用户将后端与RFID读写器串接。用户需要花费许多成本处理前后端系统连接问题。
  (2)基础架构中间件发展阶段aa是关键阶段,不但已经具备基本数据搜索、过滤等功能,同时也满足企业多对多的连接需求,并具备平台的管理与维护功能。
  (3)解决方案中间件发展阶段aa未来在RFID标签、读写器与中间件发展成熟过程中,各厂商针对不同领域提出各项创新应用解决方案,如Manhattan Associates提出的RFID in a Box,企业不需为前端RFID硬件和后端应用系统的连接而烦恼,该公司与Alien Thchnology Corp在RFID硬件端合作,发展中间件,针对该公司的900多家已有的供应链客户群发展供应链执行方案。
更多电气资讯从express源码中探析其路由机制 - 推酷
从express源码中探析其路由机制
在web开发中,一个简化的处理流程就是:客户端发起请求,然后服务端进行处理,最后返回相关数据。不管对于哪种语言哪种框架,除去细节的处理,简化后的模型都是一样的。客户端要发起请求,首先需要一个标识,通常情况下是URL,通过这个标识将请求发送给服务端的某个具体处理程序,在这个过程中,请求可能会经历一系列全局处理,比如验证、授权、URL解析等,然后定位到某个处理程序进行业务处理,最后将生成的数据返回客户端,客户端将数据结合视图模版呈现出合适的样式。这个过程涉及到的模块比较多,本文只探讨前半部分,也就是从客户端请求到服务器端处理程序的过程,也可以叫做路由(其实就是如何定位到服务端处理程序的过程)。
为了作为对比,先简单介绍一下asp.net webform和asp.net mvc是如何实现路由的。
asp.net webform比较特殊,由于是postback原理,定位处理程序的过程与mvc是不一样的,对URL的格式没有严格的要求,url是直接对应后台文件的,aspx中的服务器表单默认是发送到对应的aspx.cs文件,它的定位是借助aspx页面中的两个隐藏域(__EVENTTARGET和__EVENTARGUMENT)以及IPostBackEventHandler接口来实现的,通过这两样东西就可以直接定位到某个具体方法中,通常是某个控件的某个事件处理程序。也就是说,在webform中,url仅能将请求定位到类中,要定位到真正的处理程序(方法)中,还需借助其他手段。
asp.net mvc与webform不同,url不再对应到后台文件,那么就必须通过某种手段来解析url,mvc中的后台处理程序称为Action,位于Controller类中,为了使url能够定位到action,mvc中的url有比较严格的格式要求,在url中需要包含controller和action,这样后台就可以通过反射来动态生成controller实例然后调用对应的action。也就是说,在mvc中完全依靠url来实现后台处理程序的定位。
通过上面两种方式的分析,我们发现url是不是指向文件是无所谓的,但最终都是要根据其定位到某个具体的处理程序,也就是url到handler有个路由处理过程,只不过不同的框架有不同的处理方法。在express框架的使用过程中,隐隐约约感觉其路由过程如下图所示:
到底是不是这样呢?
我们知道,在使用express的时候,我们可以通过如下的方式来注册路由:
app.get(&/&,function(req,res){
res.send(&hello啊&);
从表面上看,get方法可以将url中的path与后台处理程序关联起来,为了弄清楚这个过程,我们可以到application.js文件中查看源码。第一次看了一眼,发现里面居然没有这个方法,app.get(),app.post()等都没找到,仔细再一看,发现了如下方法:
methods.forEach(function(method){
app[method] = function(path){
if ('get' == method && 1 == arguments.length) return this.set(path);
//get的特殊处理,只有一个参数时会获取app.settings[path]
this.lazyrouter();
var route = this._router.route(path);
route[method].apply(route, slice.call(arguments, 1));
//取出第二个参数,即:处理程序,传入route[method]方法中
return this;
原来,这些方法都是动态添加的。methods是一个数组,里面存放了一系列web请求方法,以上方法通过对其进行遍历,给app添加了与请求方法同名的一系列方法,即:app.get()、app.post()、app.put()等,在这些方法中,首先通过调用lazyrouter实例化一个Router对象,然后调用this._router.route方法实例化一个Route对象,最后调用route[method]方法并传入对应的处理程序完成path与handler的关联。
在这个方法中需要注意以下几点:
lazyrouter方法只会在首次调用时实例化Router对象,然后将其赋值给app._router字段
要注意Router与Route的区别,Router可以看作是一个中间件容器,不仅可以存放路由中间件(Route),还可以存放其他中间件,在lazyrouter方法中实例化Router后会首先添加两个中间件:query和init;而Route仅仅是路由中间件,封装了路由信息。Router和Route都各自维护了一个stack数组,该数组就是用来存放中间件和路由的。
这里先声明一下,本文提到的路由容器(Router)代表“router/index.js”文件的到导出对象,路由中间件(Route)代表“router/route.js”文件的导出对象,app代表“application.js”的导出对象。
Router和Route的stack是有差别的,这个差别主要体现在存放的layer(layer是用来封装中间件的一个数据结构)不太一样,
由于Router.stack中存放的中间件包括但不限于路由中间件,而只有路由中间件的执行才会依赖与请求method,因此Router.stack里的layer没有method属性,而是将其动态添加(layer的定义中没有method字段)到了Route.stack的layer中;layer.route字段也是动态添加的,可以通过该字段来判断中间件是否是路由中间件。
可以通过两种方式添加中间件:app.use和app[method],前者用来添加非路由中间件,后者添加路由中间件,这两种添加方式都在内部调用了Router的相关方法来实现:
//添加非路由中间件proto.use = function use(fn) {
/* 此处略去部分代码 */
callbacks.forEach(function (fn) {
if (typeof fn !== 'function') {
throw new TypeError('Router.use() requires middleware function but got a ' + gettype(fn));
// add the middleware
debug('use %s %s', path, fn.name || '&anonymous&');
////实例化layer对象并进行初始化
var layer = new Layer(path, {
sensitive: this.caseSensitive,
strict: false,
end: false
//非路由中间件,该字段赋值为undefined
layer.route =
this.stack.push(layer);
return this;
//添加路由中间件
proto.route = function(path){
//实例化路由对象
var route = new Route(path);
//实例化layer对象并进行初始化
var layer = new Layer(path, {
sensitive: this.caseSensitive,
strict: this.strict,
}, route.dispatch.bind(route));
//指向刚实例化的路由对象(非常重要),通过该字段将Router和Route关联来起来
layer.route =
this.stack.push(layer);
对于路由中间件,路由容器中的stack(Router.stack)里面的layer通过route字段指向了路由对象,那么这样一来,Router.stack就和Route.stack发生了关联,关联后的示意模型如下图所示:
在运行过程中,路由容器(Router)只会有一个实例,而路由中间件会在每次调用app.route、app.use或app[method]的时候生成一个路由对象,在添加路由中间件的时候路由容器相当于是一个代理,Router[method]实际上是在内部调用了Route[method]来实现路由添加的,路由容器中有一个route方法,相当于是路由对象创建工厂。通过添加一个个的中间件,在处理请求的时候会按照添加的顺序逐个调用,如果遇到路由中间件,会逐个调用该路由对象中stack数组里存放的handler,这就是express的流式处理,是不是有点类似asp.net中的管道模型,调用过程如下图所示:
我们可以做个测试,在终端执行&express -e expresstest&命令(需要先安装express和express-generator),然后在&expresstest/app.js&文件中添加下面代码:
//添加非路由中间件app.use('/test',function(req,res,next){console.log(&app.use('/test') handler1&);next()},function(req,res,next){console.log(&app.use('/test') handler2&);next()});
var r = app.route('/test'); //创建路由对象,并通过route[method]来添加路由中间件
r.get(function(req,res,next){
console.log(&route.get('/test') handler1&);
}).get(function(req,res,next){
console.log(&route.get('/test') handler2&);
});/* 还可以这么写,直接传入多个functionr.get(function(req,res,next){
console.log(&route.get('/test') handler1&);
next();},function(req,res,next){
console.log(&route.get('/test') handler2&);
next();});*//*
或者这么写,直接传入function数组,可以是多维数组
r.get([function(req,res,next){
console.log(&route.get('/test') handler1&);
next();},[function(req,res,next){
console.log(&route.get('/test') handler2&);
next();},function(req,res,next){
console.log(&route.get('/test') handler3&);
next();}]]);*/
app.get('/test',function(req,res,next){ //通过app[method]来添加路由中间件
console.log(&app.get('/test') handler1&);
}).get('/test',function(req,res){  console.log(&app.get('/test') handler2&);
res.end();});
在终端中输入&cd expresstest&、&npm start&来启动express,然后在浏览器中输入&http://localhost:3000/test&,我们发现在终端中输出的内容与我们之前分析的完全一致,如下图所示:
在示例中,我们通过app[method]和route[method]这两种方式来添加了路由中间件,从源码中可以看出这里有个很大的区别,app[method]方法中有这么一句代码: var route = this._router.route(path); ,this._router.route()方法内部会实例化一个Route并返回,也就是说,每次调用app[method]都会重新创建一个新的Route对象,后面的处理程序就会添加到这个新Route对象的stack中,虽然可以通过链式写法来添加路由中间件,但每个处理程序都不在一个stack中(不过这样也不影响程序的执行);而route[method]则不同,该方法添加完路由中间件后会返回自身,在路由对象上调用method方法会把所有的处理程序全部添加在该对象的stack中,不过在使用route[method]之前需要先手动实例化一个Route对象。route[method]方法的处理手段与app[method]有所不同,不仅可以同时处理多个function参数,并且通过这句代码: var callbacks = utils.flatten([].slice.call(arguments)); 可以将arguments中的多位数组转换为一维数组,这样就使得参数的传入变得非常灵活。
中间件的添加主要依靠application.js、router/index.js和router/route.js这三个文件的导出对象(app,Router,Route)相互调用完成的,从三个文件的require上来看,app依赖Router,Router依赖Route,下面是app.use的代码:
app.use = function use(fn) {
var offset = 0;
//该变量用来在arguments中定位handler的起始位置,在没有传入path的时候,handler是arguments的第一个元素,所以为0
var path = '/';
//没有传入path参数的时候,默认为&/&
// default path to '/'
// disambiguate app.use([fn])
if (typeof fn !== 'function') {
while (Array.isArray(arg) && arg.length !== 0) { //如果第一个参数是数组的话,取出数组第一个元素
arg = arg[0];
// first arg is the path
if (typeof arg !== 'function') {
//如果arg不是function,将其作为path来处理
offset = 1;
var fns = flatten(slice.call(arguments, offset)); //从参数中取出处理函数列表
if (fns.length === 0) {
throw new TypeError('app.use() requires middleware functions');
// setup router
this.lazyrouter();
//实例化Router,并将其赋值给this._router
var router = this._
fns.forEach(function (fn) {
//遍历参数中的function,逐个调用router.use,从这个地方可以看出,app.use()中可以传入多个function,将其都添加到stack中
// non-express app
if (!fn || !fn.handle || !fn.set) {
return router.use(path, fn);
debug('.use app under %s', path);
fn.mountpath =
fn.parent = this;
// restore .app property on req and res
router.use(path, function mounted_app(req, res, next) {
var orig = req.
fn.handle(req, res, function (err) {
req.__proto__ = orig.
res.__proto__ = orig.
next(err);
// mounted an app
fn.emit('mount', this);
return this;
从代码中可以看出,调用app.use的时候可以传入多个function,如果给指定路径添加function的话,路径要作为第一个参数,比如:
app.use('/test',function(req,res,next){console.log(&use1&);next()},function(req,res,next){console.log(&use2&);next()});
app.use通过调用this._router.use来实现非路由中间件的添加。this._router.use的代码上面已经贴出,path的判断与app.use前面部分一样,在该该方法中实例化layer并赋值,然后加入this._router.stack中。
app[method]的代码上面已经说过,这里就不再说了,下面是app.use和app[method]的执行流程,从图中可以看出三个文件的联系:
对于Router还有一点需要说明一下,在其构造函数中有这么一句代码: router.__proto__ = ,通过router的__proto__属性将其原型指向了proto对象,从而获得了proto中定义的各个方法。
啰啰嗦嗦了这么多,最后总结一下吧。
首先对于引言中的那个路由图,基本上是对的,只不过express要面临各种中间件的添加,所以将path与handler做了进一步的封装(Layer),然后将layer保存在Router.stack数组中。
app.use用来添加非路由中间件,app[method]添加路由中间件,中间件的添加需要借助Router和Route来完成,app相当于是facade,对添加细节进行了包装。
Router可以看做是一个存放了中间件的容器。对于里面存放的路由中间件,Router.stack中的layer有个route属性指向了对应的路由对象,从而将Router.stack与Route.stack关联起来,可以通过Router遍历到路由对象的各个处理程序。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 middleware 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信