分布式系统(二)

实现分布式服务应该具备哪些核心技术组件呢?

问题背景

分布式服务是构建分布式系统的基础,可以认为,任何一个分布式系统都是有若干个独立的服务所构成,这些服务通过网络通信实现相互调用,从而完成复杂的业务处理流程。

问题分析

分布式服务的技术组件之间是有一定的逻辑关系的,组件与组件之间的定位也有所区别。

  • 必备组件:缺少了它们系统就无法运行
  • 扩展性组件:比较典型的就是前面提到的配置中心,原则上我们不使用配置中心也照样可以构建分布式系统
  • 通用型组件:这些组件并不局限于只能用于构建分布式服务,例如动态代理组件

其他问法

  • 如果想实现一套远程过程调用机制,你会重点设计哪几个技术组件?
  • 负载均衡机制是如何与集群容错机制整合在一起的?
  • 想要实现服务容错,有哪些技术手段?
  • 微服务架构中,配置中心是如何与注册中心进行交互的?
  • 为什么在分布式系统中,处处是代理?
  • 在分布式服务构建过程中,经常用到的架构模式有哪些?

难点在于我们要回答的概念有很多,而这些概念却又比较零散,要具备完整的技术认知,然后能够用自己的语言对各个组件的组成结构和基本原理做一定的展开

技术体系

  • 远程过程调用组件
  • 微服务构建组件
  • 通用技术组件

远程过程调用组件

最基础的实现技术

网络通信

网络通信是一切分布式操作的基础。

当客户端和服务器端建立网络连接之后就可以相互发送消息。但围绕网络通信整个过程,事情并没有那么简单。

我们需要考虑网络通信的性能、可靠性以及在通信过程中实现数据传输的方式,这就涉及到 IO 模型、可靠性设计以及序列化方式等一系列技术主题。

远程调用

远程调用 解决的问题是 如何发布远程服务以及如何引用远程服务

在服务调用过程中,远程调用本地化是基本要求,即远程调用过程的实现对于开发人员而言应该是透明化的。

同时,我们也需要考虑同步调用异步调用以及同步转异步调用等一系列具体的调用实现策略。

负载均衡

负载均衡,简单讲就是将请求按照一定的策略分摊到多个服务实例上进行执行

负载均衡在实现上可以使用硬件、软件或者两者兼有。在分布式服务构建过程中,我们主要的讨论对象是基于软件的客户端负载均衡机制。

负载均衡算法:可以分成静态和动态两个大类,它们之间的区别在于动态算法依赖于当前服务的运行时状态,这些状态信息通常包括服务过去一段时间的平均调用时延和所承接的连接数等。

服务容错

在分布式环境中,服务访问出错了该怎么办?这就涉及到服务可靠性问题

常见的服务容错技术包括:

  • 集群容错
  • 服务熔断(Circuit Breaker)
  • 服务回退(Fallback)等

服务降级

一旦我们实现了对服务的针对性分级,那么就可以对那些处于业务链路最外围、等级最低的服务开始执行降级。

微服务构建组件

这些组件扩展了分布式技术能力,为构建大规模分布式系统提供了技术保障。

注册中心

服务发现和调用构成了服务交互的基础,整体流程下图所示,其中实线部分代表服务调用流程,而虚线部分则包含了服务的注册(Registration)发现(Discovery)过程。

服务网关

我们可以根据需要 在服务提供者和消费者之间架设这层服务网关

当然,并不是所有的服务调用链路上都需要添加这层网关,我们也可以根据具体场景直接通过负载均衡器进行服务访问。
在实际应用过程中,这种混合式的服务调用管理方式也是一种常见的做法。

配置中心

面对不断增长的服务实例数量,传统的配置信息管理方式就显得无能为力。为此,在分布式服务构建过程中,一般都需要引入配置中心(Configuration Center)的设计思想和相关工具。

消息通信

降低服务与服务之间的耦合度是分布式系统设计的一大目标,为此,我们可以引入事件驱动架构,基本组成如下图所示:

基于事件驱动架构,每一个服务既可以作为事件的发布者也可以作为事件的消费者,或者两者兼之。而事件也可以在不同的服务之间进行传播,从而满足各种特定的应用场景。

链路跟踪

服务之间的调用不可避免会出现各种问题,这时候就需要引入分布式链路跟踪体系来定位和解决这些问题。

服务调用链路跟踪是分布式系统的基础需求之一,业界关于分布式链路跟踪也有统一的规范以及代表性的实现框架。

通用技术组件

这些技术组件在多个场景中(不仅限于分布式系统)都能发挥作用。

动态代理

在日常开发过程中,动态代理可以说是一种通用性非常高的实现机制,它是面向切面编程的基础,也在主流的分布式服务开源框架中得到了广泛的应用。

应用缓存

对于分布式服务而言,缓存应用非常广泛,开发人员可以使用位于应用程序内部的本地缓存,也可以使用位于独立服务器上的分布式缓存。

在日常开发中,缓存的应用通常都是分层级的,我们会综合使用多级缓存来提高目标对象访问的效率和性能

资源管理

相信你对线程池数据库连接池等技术并不陌生。这里的池(Pool)是一种对资源的抽象方法,代表一组可以随时使用的资源,但这些资源的创建和释放过程则基于一定的管理策略。资源池的应用非常广泛,存在多种具体的池化组件

框架集成

这里所说的框架集成,指的是 Dubbo、MyBatis、Spring Cloud 等主流的分布式开发框架与 Spring 框架之间的集成。我们可以基于命名空间以及自定义 starter 等机制完成与 Spring 之间的有效集成。

理解框架集成的实现过程,有利于掌握主流的分布式服务框架的运行原理。

架构模式

架构模式描述某一特定应用领域中系统组织和表现的惯用方式

在分布式系统开发过程中,也大量应用了诸如

  • 微内核架构
  • 管道-过滤器架构等架构模式

这些模式能够为开发人员提供具有高度扩展性的技术组件。

源码解析

解题要点

  • 我们在解释这些名词时需要做一些扩展,多提及技术组件的关联关系,从而确保回答过程具备较好的逻辑性。
  • 回归现实中的实践
  • 技术判断力,你需要对各个技术组件背后的实现复杂度有一定的认识。

对于那些复杂度较高的技术组件,可以更为细化地进行阐述,并在一定程度上显现出自己所具备的设计思想和对实现原理的理解能力,这样就能达到一定的深度。