Wil*_*ill 17 java computer-science rmi anti-patterns software-design
为什么人们使用RMI,或者什么时候应该使用RMI?我在oracle的网站上阅读了关于RMI的那些教程.但它没有提供足够的实际例子.
根据我的理解,软件的模块应尽可能"无关和分离".RMI似乎是一个与我高度耦合的例子.为什么这不是一个糟糕的编码实践?我认为客户端应该只发出指令,而对象的所有实际操作都是由服务器完成的.
(我目前正在攻读计算机科学学士学位并且缺乏经验,所以如果我理解这些概念错误,请纠正我.)
提前致谢!
Ale*_*rey 17
你真的不应该将RMI用于你今天构建的任何应用程序,基本上是出于你刚才提出的原因.
在某些情况下(潜入遗留或"企业"应用程序),你别无选择.
但是,如果您要开始一个新项目,其他选项是:
与远程服务通信的事实标准.它具有的最大优点是它轻巧且易于掌握概念.
理论上它应该比RMI需要更多的工作,因为你必须在每个URL中手动制作可用的URL,接受的动词等.实际上,我会说RMI的样板并没有真正帮助任何人.
使用Java,Jersey是一个很棒的库,可以编写自己的RESTful Web服务.
如果你想要一个包含Java的RESTful Web服务的电池解决方案,Yammer的好人提供的Dropwizard为您提供了一个完整的服务器和框架,可以插入您的业务逻辑,并提供日志记录,数据库连接,序列化,请求路由和即使是开箱即用的指标.
以前用于与远程服务通信的标准.除非你有理由使用它,否则我会坚持使用REST.
Thrift将创建一个客户端和一个服务器存根,基本上可以完成大部分工作.通信采用有效的二进制协议.它在Java世界中越来越受欢迎,因为它被"大数据"领域的许多开源项目所使用.例如,Cassandra,HBase(切换到Avro).Scrooge是一个Twitter项目,用于为scala创建惯用的thrift存根.
Akka是实现Scala和Java 的Actor模型的框架.包括服务间通信的规定,并处理引擎盖下的许多细节.一世
根据您的需要,有些人会比其他人更合适.
Jas*_*ske 10
任何时候你有一个需要一些大型集中计算能力或一些昂贵的资源(例如一个巨大的数据库)的功能,但是你的输出需要在很多地方无法部署这样的工作负载那么你会看到远程方法调用.考虑一下网络,您在桌面上没有可能想要计算的任何搜索的Google副本,您可以在想要结果的时候远程调用Google的服务器.RMI是一种协议/系统,用于跨服务器分发应用程序并分离出需要访问该代码结果的客户端.
RMI还可以作为一种方法来保护应用程序的方面(如专有算法).RMI不是唯一的方法,您也可以使用HTTP,SOAP等.许多其他方法提供其他的东西,如真正的语言透明度,更容易和更有效的实现,以及更好的解耦.
以下是文档中RMI的既定目标
在Java编程语言中支持分布式对象的目标是:
- 支持对不同虚拟机中的对象进行无缝远程调用
- 支持从服务器到applet的回调
- 以自然的方式将分布式对象模型集成到Java编程语言中,同时保留大部分Java编程语言的对象语义
- 使分布式对象模型与本地Java平台的对象模型之间的差异明显
- 使编写可靠的分布式应用程序尽可能简单
- 保留Java平台运行时环境提供的类型安全性
- 支持远程对象的各种引用语义; 例如,实时(非持久)引用,持久引用和延迟激活
- 维护安全管理器和类加载器提供的Java平台的安全环境所有这些目标的基本要求是RMI模型既简单(易于使用)又自然(非常适合语言).
你是对的,RMI是服务提供者和服务消费者之间过于紧密耦合的一个例子.它乍看起来比它看起来更糟糕:你永远不知道你可能被推到客户端的异常,导致ClassNotFoundException掩盖了发生的真实错误.RMI,类似地,EJB,是过去的技术,过去相信"透明分布的对象"的错觉.
今天的远程服务基于RMI方法的完全相反:REST和JSON.