ajs*_*sie 8 javascript ruby python rest node.js
我想知道让本地应用程序(在同一台服务器中)完全通过Restful API进行通信是一个好主意吗?
我知道这不是一个不寻常的事情,因为我们已经有像CouchDB这样的应用程序使用HTTP REST进行通信,即使是本地应用程序也是如此.
但是我希望通过创建类似于更大应用程序的模块的应用程序来将其提升到更高的级别,这些应用程序也可以是另一个应用程序的模块,等等.换句话说,将有许多本地应用程序/模块与Restful API进行通信.
通过这种方式,这些应用程序/模块可以使用任何语言,并且可以通过服务器之间的线路进行通信.
但我有一些问题:
当然,也许吧.
对!但相比什么呢?与本机内部呼叫相比,绝对是 - 它将是冰河.相比其他一些网络API,呃,不一定慢.
不,没有理由为每个模块分配一个端口.各种各样的方法来做到这一点.
这种成功的唯一方法就是你所谈论的服务是否足够粗糙.这些必须是大型的,黑色的四四方方的服务,这些服务使得称它们的费用值得.每笔交易都会产生连接成本,数据传输成本和数据编组成本.因此,您希望这些事务尽可能少,并且您希望有效负载尽可能大,以获得最佳效益.
您是在说实际使用REST架构还是仅通过HTTP来回发送内容?(这些是不同的东西)REST会产生自己的成本,包括嵌入式链接,普遍存在的和常见的数据类型等.
最后,您可能根本不需要这样做.它可能是"有点酷","很高兴","在白板上看起来很好",但如果,真的,不需要它,那么就不要这样做.只需遵循隔离内部服务的良好实践,以便您以后决定做这样的事情,您只需插入管理通信所需的粘合层等.添加远程分发会增加风险,复杂性和降低性能(扩展) !=表现)所以应该有一个很好的理由去做.
可以说,这是他们所有人的"最佳实践".
编辑 - 回复评论:
所以你的意思是我运行一个处理所有传入请求的Web服务器?但是这些模块不会是独立的应用程序,这会破坏整个目的.我希望每个模块都能够自行运行.
不,它没有打败目的.
这是交易.
假设您有3项服务.
一目了然,可以公平地说,这是三种不同的服务,在3台不同的机器上运行,运行在3个不同的Web服务器上.
但事实是,这些都可以在SAME机器上运行,在SAME Web服务器上运行,甚至可以运行完全相同的逻辑(以达到极限).
HTTP允许您映射各种事物.HTTP本身就是抽象机制.
作为客户端,您关心的是要使用的URL和要发送的有效负载.最终与之交谈的机器,或者它执行的实际代码,而不是客户端问题.
在架构层面,您已经实现了抽象和模块化的方式.URL让您组织系统是您想要的任何LOGICAL布局.PHYSICAL实现与逻辑视图不同.
这3个服务可以在由单个进程提供服务的单个机器上运行.另一方面,它们可以代表1000台机器.您认为有多少台机器响应"www.google.com"?
您可以轻松地在一台计算机上托管所有3种服务,而无需共享任何代码来保存Web服务器本身.使服务从原始机器移动到其他机器变得容易.
主机名是将服务映射到计算机的最简单方法.任何现代Web服务器都可以为任意数量的不同主机提供服 每个"虚拟主机"可以为该主机的名称空间内的任意数量的单个服务端点提供服务.在"主机"级别,如果需要,可以轻松地将代码从一台机器重新定位到另一台机器.
您应该探索更多现代Web服务器的功能,以将任意请求定向到服务器上的实际逻辑.你会发现它们非常灵活.
这是一个好主意吗?
是.它一直都在做.例如,这就是所有数据库服务器的工作方式.Linux充满了通过TCP/IP进行通信的客户端/服务器应用程序.
它们之间的数据传输会很慢吗?
不可以.TCP/IP localhost用作保存实际网络I/O的快捷方式.
HTTP协议不是专用连接的最佳选择,但它很简单且得到很好的支持.
如果我这样做,那么每个应用程序/模块都必须是HTTP服务器吗?
不必要.有些模块可以是客户端而没有服务器.
因此,如果我的应用程序使用100个应用程序/模块,则每个应用程序/模块必须是本地HTTP Web服务器,每个服务器运行在不同的端口上(http:// localhost:81,http:// localhost:82,http:// localhost) :83等等)对吗?
是.这就是它的工作方式.
我应该知道的任何最佳做法/陷阱?
不要"硬编码"端口号.
不要使用"特权"端口号(1024以下).
使用WSGI库,您将最快乐地将所有模块转换为WSGI应用程序.然后,您可以使用一个简单的2行HTTP服务器来包装您的模块.
读这个. http://docs.python.org/library/wsgiref.html#examples