您是否曾经想过,为什么大多数Java框架中的依赖项注入仅用于本地进程内服务而不是分布式服务?
我最近在2013年EMC世界大会上遇到了Paul Maritz的主题演讲 (跳至第32分钟),这使我在云平台的背景下思考了这个问题。 主题演讲是关于Pivtol如何在新兴云平台市场中定位的极好的,深思熟虑的陈述。 他最有趣的观点之一是,随着移动和互连设备(通常称为物联网 )的激增,我们看到了一种新的应用程序类别,可以吸收,处理和分发大量数据。
Maritz通过一些有用的轶事证据来突出他的讲话:一次跨大西洋飞行会产生将近30TB的数据,需要通过新型应用程序进行记录,处理和分析。
云织物
这些类型的应用程序不能有效地建立在传统的Java EE应用程序服务器体系结构上。 取而代之的是,它们将在高度适应性强的动态互连基础架构云结构上运行。
云结构的动态性质对现有Java框架和容器提出了新要求。 例如,可以创建或迁移VM实例以满足不断增长的需求。 在此设置中,计算机(以及服务端点)的地址可能会更改。 这使得通常与Java EE应用程序服务器集群和消息代理相关联的静态体系结构难以管理和扩展
云结构基于硬件虚拟化构建,其中物理计算资源通过软件抽象。 需要将虚拟化扩展到Java编程模型的堆栈,以便可以更有效地运行应用程序。
Spring:服务虚拟化先驱
在这方面,Spring是早期的先驱。 它通过替换容器API来通过依赖关系注入来获取本地服务引用(JNDI),从而虚拟化了Java EE应用服务器的许多部分。 这样就可以在Java EE容器之外运行Spring应用程序代码,例如在单元测试中。
随着云结构的普及,我们将看到有必要将Spring的接线功能扩展到大型分布式服务-接线。 正如应用程序不需要容器API来获取对本地服务的引用一样,它们也不需要API来调用远程服务或向端点发送消息。 如果将远程服务连接到应用程序代码,则结构基础架构可以在迁移或创建VM时透明地传播端点地址更改,以响应不断变化的工作负载:
大型布线的另一个好处是通信 虚拟化。 应用程序代码不再依赖特定于传输的API发送消息或调用远程服务。 云结构负责将代码与管理通信的代理一起注入:
这将允许云结构采用和调整最合适的消息传递技术,而无需更改代码级。 除了大大简化代码外,通信虚拟化还使生产更多可移植的云应用成为可能。
在实践中进行大接线
那么,大型布线在实际中是什么样的呢? 好消息是它的许多概念早于现代云计算的出现。 OASIS SCA标准为我们提供了一种简单而熟悉的方式来连接非常适合云结构的远程服务:
<composite name="LoanComposite" ...><component name="Client"><implementation.java class="org.fabric3.sample.client.ClientImpl"/><reference name="service" target="Service"/> </component><component name="Service"><implementation.java class="org.fabric3.sample.service.ServiceImpl"/></component></composite>
可以通过JMS,ZeroMQ,AMQP,MQTT或其他某种通信技术连接上述服务-取决于SCA运行时或部署配置来选择一种。 应用程序代码将看起来相同:
public class ClientImpl implements Client {@Referenceprotected Service service;public void doSomething() {Message message = ...service.send(message); }}
Fabric3运行时(一致的SCA实现)以我们上面讨论的方式提供了透明的动态端点传播。
下一步是什么?
目前,Fabric3支持大尺寸布线需要将应用程序部署到Fabric3容器中。 Fabric3社区正在努力消除此限制,以便可以从任何JVM或Java运行时以无所不在的方式访问云服务。 这是一个例子:
Fabric fabric = Bootstrap.initialize();
fabric.start();Domain domain = fabric.getDomain();Service service = domain.getService(Service.class);
Message message = ...
service.send(message);fabric.stop();
该API可以集成到诸如Spring和Guice之类的框架中,以提供透明的远程服务注入。 基本上,应用程序代码将不再需要处理特定的传输API,或者对于Spring,则不再需要处理模板。
****
回到Maritz的大规模使用,处理和分发数据的下一代应用程序的图片,大型布线有望起到与本地依赖注入对公司数据中心中的Java EE相同的现代化作用。 如果您想进一步了解可能的技术,请查看Fabric3 。
翻译自: https://www.javacodegeeks.com/2013/12/wiring-in-the-large-the-missing-technology-for-java-cloud-applications.html