出自拉勾教育

相对于单体式架构的简单粗暴,微服务架构将应用打散,形成多个微服务进行独立开发、测试、部署与运维。虽然从管理与逻辑上更符合业务需要,但微服务架构也带来了诸多急需解决的核心问题:

  1. 如何发现新服务节点以及检查服务节点的状态?
  2. 如何发现服务及负载均衡如何实现?
  3. 服务间如何进行消息通信?
  4. 如何对使用者暴露服务 API?
  5. 如何集中管理众多服务节点的配置文件?
  6. 如何收集服务节点的日志并统一管理?
  7. 如何实现服务间调用链路追踪?
  8. 如何对系统进行链路保护,避免微服务雪崩?

可以发现,上述这些问题并不是针对某种语言或某种技术的,任何软件厂商要构建微服务架构就必须面对这些问题,要么独立开发要么将已有多种技术整合形成整体解决方案。好在经过多年沉淀,业内已经有了标准答案,下图清晰的说明微服务架构需要的标准组件。
image.png
微服务架构标准组件
下面我来介绍每种组件的职责。

注册中心(Service Registry)

注册中心是微服务架构最核心的组件。它起到新服务节点的注册与状态维护的作用,通过注册中心解决了上述问题 1。微服务节点在启动时会将自身的服务名称、IP、端口等信息在注册中心中进行登记,注册中心会定时检查该节点的运行状态。注册中心通常会采用心跳机制最大程度保证其持有的服务节点列表都是可用的。
image.png
服务注册流程

负载均衡(Load Balance)

负载均衡器解决了问题 2。通常在微服务彼此调用时并不是直接通过IP、端口直接访问,而是首先通过服务名在注册中心查询该服务拥有哪些可用节点,然后注册中心将可用节点列表返回给服务调用者,这个过程称为“服务发现”。因服务高可用的要求,服务调用者会接收到多个可用节点,必须要从中进行选择,因此在服务调用者一端必须内置负载均衡器,通过负载均衡策略选择适合的节点发起实质的通信请求。
image.png
服务发现与负载均衡

服务通信(Communication)

  1. 服务通信组件解决了问题 3。在微服务定义中阐述服务间通信采用轻量级协议,通常是 HTTP RESTful 风格。但因 RESTful 风格过于灵活,必须加以约束,通常在应用时对其进行上层封装,例如在 Spring Cloud 中就提供了 Feign RestTemplate 两种技术屏蔽底层实现 RESTful 通信细节,所有开发者是基于封装后统一的SDK进行开发,这有利于团队间协作。

API 服务网关(API Gateway)

服务网关解决问题 4。对于最终用户来说,微服务的通信与各种实现细节应该是透明的,用户只需关注他要使用的 API 接口即可。因此微服务架构引入服务网关控制用户的访问权限。服务网关是外部环境访问内部微服务的唯一途径,在这个基础上还可以扩展出其他功能,例如:用户认证与授权、容错限流、动态路由、A/B测试、灰度发布等。
image.png
API 服务网关

配置中心(Config Management)

配置中心解决问题 5。微服务架构下,微服务节点都包含自己的各种配置文件,如JDBC地址、自定义配置、环境配置等。要知道互联网公司微服务节点可能是成千上万个,如果这些配置信息分散存储在节点上,如发生配置变更就必须逐个调整,这必将给运维人员带来巨大的工作量。配置中心便因此而生,通过部署配置中心服务器,将原本分散的配置文件从应用中剥离,集中转存到配置中心。一般配置中心会提供 UI 界面,可以方便快捷的实现大规模集群的配置调整。
image.png
庞杂而重复的配置文件
image.png
引入配置中心集中管理配置

集中式日志管理(Centralized Logging)

集中式日志解决问题 6。因为微服务架构默认将应用日志分散保存在每一个微服务节点上,当系统进行用户行为分析、数据统计时必须收集所有节点日志数据。那如何有效收集所有节点的运行日志,并对其进行分析汇总呢?业内常见的方案有 ELK、EFK,通过搭建独立的日志收集系统,定时抓取增量日志形成有效的统计报表,为决策提供数据支撑。
image.png
ELK 日志手机系统

分布式链路追踪(Distributed Tracing)

分布式追踪解决问题 7。一个复杂的业务流程可能需要连续调用多个微服务,我们需要记录一个完整业务逻辑涉及的每一个微服务的运行状态,再通过可视化链路图展现,帮助软件工程师在系统出错时分析解决问题。
image.png
微服务链路追踪
image.png
Zipkin 链路图

服务保护(Service Protection)

服务保护解决问题 8。在服务间通信过程中,如果某个微服务出现响应高延迟可能会导致线程池满载,严重时会引起系统崩溃。这里就需要引入服务保护组件实现高延迟服务的快速降级,避免系统崩溃。
以上是在微服务架构过程中派生的新问题以及对应的解决方案,这些组件是微服务架构设计时必须考虑的事情。在实现层面,Java 是目前对微服务生态支持最好的编程语言,下面我们就来介绍在Java中如何实现微服务架构的。