我正处于一个项目中,我将创建一个Web服务,它将作为几个独立系统(通过API)和数据库的“外观”。 Web服务将是单独的Web应用程序用于与这些外部资源通信的唯一方法。
我知道一个事实,即Web服务必须与之通信的API之一的通信方法将在未来的某个未确定点发生变化。
我希望Web服务本身能够抽象出Web应用程序和外部API之间通信方法变化的细节。我主要关心的是如何设计Web服务的内部。使用OO设计创建适当的抽象级别的一些规定方法是什么,以便可以干净地处理通信方法的变化?是否有推荐的设计模式?
答案 0 :(得分:1)
如您所述,听起来您已经在使用外观模式了。事实上,Web服务是其他服务的外观。如果Web服务与其中一个外部资源之间的API发生更改,则关键是不要让它影响Web服务本身的API。 Web服务的用户不需要知道Web服务如何与外部资源通信的内部。
如果Web服务有doX和doY方法,那么doX和doY的调用者都不应该关心底层的内容。因此,只要您在Web服务的客户端和Web服务之间维护API,就应该进行设置。
答案 1 :(得分:0)
我经常遇到类似的问题,我会有一个新的门面(通常是一个Java类),然后是一些新的“中间件”,最终会与位于其他地方的服务进行通信。
我必须支持多种通信媒介,包括进程中和通过网络(通常使用加密)。
我通常的解决方案是定义数据包的概念,其子类型包含特定形式的数据(例如,特定响应,特定请求)等。重要的是所有数据包必须以某种形式进行序列化( Java对此有一个概念,我不确定C ++)。
然后我有一个代理商和一个提供商。代理程序接受程序域请求,创建packats。它将它们移动到仅负责通信的存根骨架。远程存根获取数据包并将其提供给提供者。提供程序将其转换回域对象,然后将其提供给实际服务。它接受响应,通过skeleton-stub等将其发送回代理。
这种方法的优点是我创建了几层抽象。代理/提供商专注于域级别并将其转换为数据包并返回。骨架 - 存根对负责来回传送和发送数据包。通过交换我的骨架 - 存根对子类型,我可以使用相同的程序以不同的方式进行通信(例如,通过JMS,直接通过套接字等嵌入到同一个JVM中)。
答案 2 :(得分:0)
这不应该影响您创建的服务(从用户的角度来看)。服务与合同有关 - 您的服务将与其用户签订合同 - 他们会向您发送特定请求并发回特定回复。您还与此其他API签订了合同。如果他们改变了他们想要沟通的方式,你可以在内部处理,但只要你与用户的合同没有改变,他们就不会注意到这一点。
实现此目的的一种方法是不要简单地传递从“真实”API获得的确切对象。您可以创建自己的对象,并将其作为响应发回。然后,将对象转换为对象。这样,如果“真正的”API改变了它们的结果,你可以选择如何将它发送回去。
作为中间人,您应该进行设置,以便最终用户无需了解原始API。