【发布时间】:2012-03-16 18:45:32
【问题描述】:
我目前正在为一个工作项目开发分布式服务架构。本质上,我们管理着超过 200 台机器。这些机器中的每一个都有一个运行在其上的服务实例,允许我们以特定方式与机器交互。
在中心,我有一个控制应用程序,它需要与这 200 个相同的服务通信。我希望通过 Spring Remoting 使用 RMI 来实现这一点,允许我将我的远程服务 @Autowire 到我的 @Controller 中,并将其视为具有异常传播的本地服务,并且可能在未来通过钩子传播事务/安全上下文。
这对于单台机器上的单一服务非常有用,我可以在 Spring 配置中对远程服务进行硬编码,但我无法弄清楚如何动态选择我使用的服务(也就是哪台机器)想要在运行时与之交谈并以“Spring”方式提供远程服务。
我希望能够从数据库表动态配置它并使用相同的表信息进行服务查找,同时仍然利用依赖注入。
我想过可能注入某种服务管理器来进行某种服务查找,但希望其他人能够优雅地解决这个(或类似的)问题。
硬编码的单个服务实例的示例如下:
第一个 XML sn-p 在机器服务本身上,告诉 Spring 通过 RMI 公开它
<!-- Expose DeviceService via RMI -->
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="DeviceService" />
<property name="service" ref="deviceService" />
<property name="serviceInterface"
value="com.example.service.DeviceService" />
<property name="registryPort" value="1199" />
</bean>
第二个 XML sn-p 在客户端(控制应用程序)上,让我可以访问公开的服务
<!-- Proxy our remote DeviceService via RMI -->
<bean id="remoteDeviceService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://machineurl:1199/DeviceService"/>
<property name="serviceInterface" value="com.example.service.DeviceService"/>
</bean>
这是我想要动态化的第二个配置。如您所见,要创建此服务代理,我需要在创建 bean 时知道服务 URL。服务 URL 可以是 200 多种变体中的一种,具体取决于我要与之交谈的机器。我正在与之交谈的服务是相同的接口,但取决于当前的请求上下文,直到运行时我才会知道哪台机器。
【问题讨论】:
-
那么你的控制应用是客户端?硬编码的版本是什么样的?
-
我试图让它尽可能通用,但在这种情况下,“控制”应用程序实际上是另一个服务层,它本身就是这些远程服务的客户端。我将添加一个硬编码的 XML 配置示例。
标签: java spring rmi soa spring-remoting