假设有一个电子商务系统由粒度RESTfull API组成,这些API互连以协调和组成业务逻辑。(类似于Amazon中的SOA架构,OrderAPI,InventoryAPI,MerchantAPI,ItemAPI等) 有必要更改域模型对象,以便随着时间实现新功能/增强功能。
为了保持高可用性,可以在服务运行时利用OSGi更新对域模型的修改。 (没有任何下城服务)?
如果使用缓存技术(如Oracle Coherence)来存储这些Domain对象,如何处理这种情况?
答案 0 :(得分:1)
我建议您查看Blueprint OSGi规范,该规范旨在使OSGi能够轻松地实现动态服务,就像您似乎需要的那样。
不要查看IBM指南(如果你谷歌的话,它会先出现),请先查看本指南,这很容易理解:
http://www.javabeat.net/2011/11/blueprint-and-service-dynamism-in-osgi/
使用Blueprint,您的上下文与Spring上下文非常相似。当您启动捆绑包时,Blueprint扩展程序会自动创建捆绑包的上下文。
任何OSGi包都可以发布服务(通常只是一个POJO)。这是与其他捆绑包共享功能的标准方法。只需确保您要共享的功能在一个或多个通用API包中声明,以便以后可以随时动态更改API的实际实现,而无需停机。
声明导出服务的简单蓝图上下文可能如下所示:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<!-- Exported service declaration -->
<service interface="com.package.api.SomeServicePojo" ref="beanId" />
<bean id="beanId" class="com.package.impl.ServicePojoImpl" />
<!-- ... lots of beans here -->
</blueprint>
另一个包可以像这样导入该服务:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<!-- Import service declaration -->
<reference interface="com.package.api.SomeServicePojo" id="service" />
<bean id="otherBean" class="com.package.client.ServiceUser">
<property name="service" ref="service" >
</bean>
<!-- ... lots of beans here -->
</blueprint>
如您所见,该服务被注入ServiceUser。请注意,实际注入的实例是代理!通过在运行的OSGi环境中安装/启动新的Blueprint软件包,可以随时交换服务的实际实现!
虽然我们将导出/导入的东西称为“服务”,但请注意它们确实可以是任何东西!一个字符串,例如!!因此,您可以使用导出的工厂以这种方式动态更改域模型的实现。
更改API 定义捆绑包但是,需要重新启动OSGi环境...如果您仔细设计API以使其灵活,您可能仍然可以修改某些方面只需交换API 实现捆绑包,而不是API本身,这样就不需要重启。
这也是处理缓存问题的唯一方法...如果你将缓存放在与你期望交换的单独的捆绑包中,那么事情应该可以正常工作......如果不这样做,状态不会丢失卸载缓存保持包...但很明显,如果你的缓存包含与你新安装的API实现不兼容的对象,世界上没有任何技术可以神奇地处理你的差异...你可以做也许是你自己,但是在我看来,这会带来巨大的复杂性而没有什么好处...只需编程你的缓存,当你进行修改时可以清除它,如果使用旧的缓存对象可能会破坏!