一、分布式微服务的整体架构
以商城系统为例,整体架构一般如下图所示:

客户端: 这是用户与系统之间的接口,用户在这里可以浏览商品信息,并且对商品下单。为了提升用户体验,会利用HTTP 缓存 手段将部分静态资源缓存下来,同时也可以将这部分静态资源缓存到 CDN 中,因为 CDN 服务器通常会让用户从比较近的网络节点获取静态数据。
**负载均衡器(以下称接入层):**负载均衡器可以将用户的请求路由到不同的服务器集群,还可以进行流量控制和身份验证等操作。
**应用服务器(以下称应用层):**这一层用于部署主要的应用服务,例如商品服务、订单服务、支付服务、库存服务和通知服务。
当请求从外网进入内网后,需要通过 API 网关进行再次路由,特别是微服务架构中服务拆分得比较细,就更需要 API 网关了。API 网关还可以起到内网的负载均衡、协议转换、链式处理、异步请求等作用。
由于应用服务(一个或者多个)部署在多个服务器上,这些服务器要想互相调用,就要考虑各服务间的通信、协调等问题(分布式事务问题,分布式锁技术),因此加入了服务注册中心、消息队列消息中心等组件。
同时由于商品服务会经常被用户调用,因此加入了缓存机制。
**数据服务器(以下称存储层):**由于商品信息比较多,所以对其进行分片操作,分别存放到商品表 1 和商品表 2 这两张表中来保证数据库的可用性。这里加入了主、备数据库的设计,这两个数据库服务器会进行同步,当主数据库服务器挂掉的时候,备数据库服务器就会接管它的一切。(分布式存储技术、读写分离与主从同步技术)
二、分布式架构的特征
1、分布性。
分"指的是拆分,可以理解为服务的拆分、存储数据的拆分、硬件资源的拆分。
布"指的是部署,也指资源的部署。既有计算资源,例如订单服务、库存服务,它们被部署到不同的容器或者应用服务器中,也有存储资源,例如将商品数据水平分布到不同的数据库服务器。
2、自治性
自治性就是每个应用服务都有管理和支配自身任务和资源的能力。
订单服务拥有自己的硬件资源,包括容器或者应用服务器,同时还处理商品下单的任务。对内,它可以采用自己的技术来实现,并不受其他服务的影响,业务上专注于处理订单业务;对外的沟通则使用服务注册中心和消息队列,与其他服务是平等关系。
3、全局性
多个分布在不同网络节点的服务应用在共同完成一个任务时,需要有全局性的考虑。
例如,商品服务在调用支付服务时,需要通过服务注册中心感知支付服务的存在;多个库存服务对商品库存进行扣减时,需要考虑临界资源的问题;
订单服务在调用支付服务和库存服务的时候需要考虑分布式事务问题;
当主数据库服务器挂掉的时候,需要及时切换到从数据库服务器,这些都是全局性的问题。
4、并行性
各个服务之间并行,服务集群内各个服务器并行。
提高性能和可用性。
三、分布式架构需要关注的问题
主要需要关注以下8个问题:应用服务拆分、 分布式调用、分布式协同、 分布式计算、分布式存储、分布式资源管理与调度、高性能与可用性、指标与监控
各个问题结构如图所示:

(1) 应用服务拆分
● 领域驱动设计的模型结构:包括领域、领域分类、子域、领域事件、聚合、聚合根、实体和值对象。
● 分析业务需求形成应用服务:包括业务场景分析、抽象领域对象、划定限界上下文。
● 领域驱动设计分层架构:包括分层原则、每层内容和特征,以及分层实例。
(2) 分布式调用
在不同架构层面有不同的处理方式:
在用户请求经过互联网进入应用服务器之前,需要通过负载均衡和反向代理;
在内网的应用服务器之间需要API 网关调用;
服务与服务之间可以通过服务注册中心、消息队列、远程调用等方式互相调用。
因此可以将分布式调用总结为两部分,第一部分是感知对方,包括负载均衡、API 网关、服务注册与发现、消息队列;第二部分是信息传递,包括 RPC、RMI、NIO 通信。
主要内容:
● 负载均衡分类:接入层硬件和软件负载均衡的实现原理和算法。
● API 网关:介API 网关的技术原理和具体功能,了解流行的 API 网关。
● 服务注册与发现:相关的原理和概念,以及它与发布/订阅模式的区别。
● 服务间的远程调用: RPC 调用过程、RPC 动态代理、RPC 序列化、协议编码和网络传输,以及Netty 是如何实现 RPC 的。
(3) 分布式协同
主要内容:
● 分布式系统的特性与互斥问题:集中互斥算法、基于许可的互斥算法、令牌环互斥算法。
● 分布式锁:分布式锁的由来和定义、缓存实现分布式锁、ZooKeeper 实现分布式锁、分段加锁。● 分布式事务:分布式事务的原理和解决方案。包括 CAP、BASE、ACID 等的原理;DTP 模型;2PC、TCC 方案。
● 分布式选举:介绍分布式选举的几种算法,包括 Bully 算法、Raft 算法、ZAB 算法。
● 分布式系统的实践:ZooKeeper 的基本原理和组件。
(4) 分布式计算
主要了解:
● MapReduce 模式:熟悉其特点、工作流程和示例。
● Stream 模式:通过 Storm 的最佳实践了解其要素和流程。
(5) 分布式存储
存储的分布式也可以提高存储的性能和可用性,因此需要考虑分布式存储的问题。
主要内容:
● 数据存储面临的问题和解决思路:RAID 磁盘阵列。
● 分布式存储概念:分布式存储的要素和数据类型分类。
● 分布式关系数据库:分表分库、主从复制、数据扩容。
● 分布式缓存:缓存分片算法、Redis 集群方案、缓存节点之间的通信、请求分布式缓存的路由、缓存节点的扩展和收缩、缓存故障的发现和恢复。
(6) 分布式资源管理与调度
所有的服务与存储都可以看作资源,因此需要考虑分布式资源管理和调度。
主要了解以下内容:
● 分布式调度的由来与过程。
● 资源划分和调度策略。
● 分布式调度架构。
● 中心化调度的特点是由一个网络节点参与资源的管理和调度。
● 两级调度在单体调度的基础上将资源的管理和调度从一层分成了两层,分别是资源管理层和任务分配层。
● 共享状态调度,通过共享集群状态、共享资源状态和共享任务状态完成调度工作。
● 资源调度的实践:了解Kubernetes 的架构及其各组件的运行原理。
(7) 高性能与可用性
设计分布式架构的目的是实现高性能和可用性。
主要内容:
● 缓存的应用:HTTP 缓存、CDN 缓存、负载均衡缓存、进程内缓存、分布式缓存。
● 可用性的策略:请求限流、服务降级、服务熔断。
(8) 指标与监控
系统上线以后需要对性能指标进行有效的监控才能保证系统稳定运行,指标与监控就是我们需要关注的问题。
主要内容:
● 性能指标:延迟、流量、错误、饱和度。
● 分布式监控系统:创建监控系统的步骤、监控系统的分类、监控系统的分层。
● 流行监控系统的最佳实践:包含Zabbix、Prometheus。