服务定位架构模式

1. 服务定位基本理念

系统集成(System Integration)是应用系统架构设计的一个重要课题,无论何种行业和应用,系统都可能需要集成对第三方服务的访问。这些第三方服务可能来自外部供应商,也可能来自于同一组织的不同团队,更广义上来讲,同一团队内部也可能需要进行服务的发现和整合,以便不同技术体系结构下的各个模块和组件之间的集成。

系统集成需要解决的主要问题是如何获取并管理第三方服务。第三方服务同样需要业务迭代和版本更新,当这些服务的实现发生了变化,那么涉及到集成部分的代码可能需要重构,如果有些用户层面的代码还不能被直接访问的话,整个重构的成本就会很大。服务定位(Service Locator)模式想要解决的问题就是解耦服务提供者(Service Provider)和用户,应用程序无需直接访问具体的服务提供者类,而解决方案就是服务注册(Registration)和发现(Discovery)机制。

下图中包含了服务定位模式的几个核心组件:

(1)服务(Service),实际处理请求的服务,可以包含不同的实现。对这种服务的引用可以在类似 JNDI 服务器的中央注册中心中查找。

(2)上下文(Context) ,上下文中带有对要查找的服务的引用,如JNDI使用InitialContext作为上下文容器。

(3)服务定位器(Service Locator),服务定位器是通过类似 JNDI 服务器的中央注册中心查找并获取服务,同时可以根据需要对服务进行缓存。

(4)缓存(Cache),缓存存储服务的引用以便复用。

(5)客户端(App),App是通过 Service Locator调用服务的对象。

服务定位模式本质上体现的还是解耦思想,支持服务动态升级,提高了系统的可维护性。与服务定位模式类似的还有业务代理(Business Delegate)模式(见下图)。我们可以看到在业务代理模式中,负责查找服务的称为BusinessLookup,而BusinessDelegate组合BusinessLookup以及BusinessService为App端提供稳定的第三方业务服务查找和集成方案。

2. 服务定位应用

在大型分布式系统中,由于涉及到服务的发布者和消费者之间大量的调用关系,服务的定位显得尤为重要,因此主流的分布式服务框架都提供了类似注册中心的机制作为服务提供者和服务消费者进行交互的媒介,充当着服务注册和发现(Registration&Discovery)服务器的作用。

一个典型的注册中心模型参考下图,图中的注册中心应该具备发布-订阅功能,体现在服务提供者可以根据服务的元数据发布服务,而服务消费者则通过对自己感兴趣的服务进行订阅并获取包括服务地址在内的各项元数据。发布-订阅的功能还体现在数据变更推送,即当注册中心服务定义发生变化时,主动推送变更到服务的消费者从而实现服务路由。由于服务提供者和服务消费者同时依赖于注册中心,就需要确保数据一致性,在任何时候服务提供者和消费者都应该看到同一份数据。同时服务消费者具备缓存功能,当注册中心不可用时,就可以同步本次缓存中的路由信息获取服务提供者的地址并实现远程调用。

再以Dubbo为例,其注册中心包含Multicast注册中心、Zookeeper注册中心、Redis注册中心和Simple注册中心等多种实现方式。无论使用何种实现方式,其基本的模型和工作流程与服务定位模式保持高度一致。

 

如果对文章感兴趣,可以关注我的微信公众号:程序员向架构师转型。

我出版了《系统架构设计:程序员向架构师转型之路》、《向技术管理者转型:软件开发人员跨越行业、技术、管理的转型思维与实践》、《微服务设计原理与架构》、《微服务架构实战》等书籍,并翻译有《深入RabbitMQ》和《Spring5响应式编程实战》,欢迎交流。

发布了92 篇原创文章 · 获赞 9 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/lantian08251/article/details/100046710
今日推荐