Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

一手资源尽在:666java.com

本文由 简悦 SimpRead 转码, 原文地址 kaiwu.lagou.com

实现微服务架构的第一步是进行技术选型,也就是选择一个合适的开发框架来实现上一课时中所介绍的
各个微服务技术体系。目前市面上并没有一个严格意义上的微服务架构开发工具,但还是存在一些可供
参考的框架。本课程将使用 Spring Cloud 作为实现微服务的主体框架。

从 Spring Boot 到 Spring Cloud


Spring Cloud 具备一个天生的优势,因为它是 Spring 家庭的一员,而 Spring 在 Java EE 开发领域的强
大地位,给 Spring Cloud 起到很好的推动作用。同时,Spring Cloud 所基于的 Spring Boot,已经成
为 Java EE 领域中最流行的开发框架,用来简化 Spring 应用程序的框架搭建和开发过程。

在微服务架构中,我们将通过 Spring Boot 来开发单个微服务。同样作为 Spring 家族的新成员,


Spring Boot 提供了令人兴奋的特性,这些特性主要体现在开发过程的简单化,包括支持快速构建项
目、不依赖外部容器独立运行、开发部署效率高,以及与云平台天然集成等。而在微服务架构中,
Spring Cloud 构建在 Spring Boot 之上,继承了 Spring Boot 的多项功能特性,使得开发微服务变得简
单而高效。

在设计思想上,Spring Boot 充分利用约定优于配置(Convention over Configuration)的自动化配置


机制。与传统的 Spring 应用程序相比, Spring Boot 在启动依赖项自动管理、简化部署并提供应用监
控等方面对开发过程做了优化。关于 Spring Boot 的全面介绍不是课程的重点,我们会在后续的课程中
结合案例分析来穿插介绍相关的各项功能特性。

Spring Cloud 中的核心组件


技术组件的完备性是我们选择 Spring Cloud 的主要原因。Spring Cloud 中包含了开发一个完整的微服
务系统所需的几乎所有技术组件,包括服务注册和发现、API 网关、配置中心、消息处理、负载均衡、
熔断器、数据监控等常见技术组件都可以基于 Spring Boot 快速集成到业务系统中。

在对微服务的各项技术组件进行设计和实现的过程中,Spring Cloud 也有自己的一些特色。一方面,它


对微服务架构开发所需的技术组件进行了抽象,提供了符合开发需求的独立组件,包括用于配置中心的
Spring Cloud Config、用于 API 网关的 Spring Cloud Gateway 等。另一方面,Spring Cloud 也非常崇
尚博采众长,它将目前各家公司现有的适合于微服务系统开发的多款服务框架组合起来,通过 Spring
Boot 开发风格进行了封装和优化。这部分主要指的是 Spring Cloud Netflix 组件,其中集成了 Netflix
OSS 的 Eureka 注册中心、Zuul 网关、Hystrix 熔断器等工具,如下图所示:

Spring Cloud、Spring Cloud Netflix 与 Netflix OSS 之间的关系


一手资源尽在:666java.com
Spring Cloud 中的组件非常多,我们无意对所有组件都进行详细展开,而是梳理了开发一个微服务系统
所必需的八大核心组件,如下图所示:

Spring Cloud 核心功能组件

接下来,我们对上图中的 Spring Cloud 核心技术组件进行一一展开。

1. Spring Cloud Netflix Eureka 与服务治理

Spring Cloud Netflix 基于 Spring Boot 集成了 Netflix OSS 中的诸多核心组件,与服务治理相关的除了


用于服务注册和发现的 Eureka 之外,实际上还有用于实现客户端负载均衡的 Ribbon:

服务治理组件交互示意图

在服务治理场景下,这些组件构成了一个完整的从服务注册、服务发现到服务调用的流程。
一手资源尽在:666java.com
2. Spring Cloud Gateway 与服务网关

针对服务网关,Spring Cloud 中提供了 Spring 家族自建的 Spring Cloud Gateway。Spring Cloud


Gateway 构建在最新版本的 Spring 5 和响应式编程框架 Project Reactor 之上,提供了非阻塞的 I/O 通
信机制。通过提供一系列的谓词(Predicate) 和过滤器(Filter) 的组合,我们可以通过 Spring
Cloud Gateway 实现灵活的服务路由。同时,Spring Cloud Gateway 也可以集成前面介绍的 Netfix
Hystrix 熔断器,以及服务限流等常见的服务容错机制。

Spring Cloud Gateway 结构示意图

当然,我们也可以使用 Netflix 中的 Zuul 来构建服务网关,这是 Spring Cloud 中集成的另一种常见的


网关实现机制。

3. Spring Cloud Circuit Breaker 与服务容错

Spring Cloud Circuit Breaker 是对熔断器实现方案的一种抽象。在该组件的内部,Spring Cloud


Circuit Breaker 集成了 Netfix Hystrix、Resilience4J、Sentinel、Spring Retry 这四种熔断器实现
工具。

Spring Cloud Circuit Breaker 中的四种熔断器实现机制

对外,它提供了一个一致的 API 供应用程序使用,允许开发人员选择最适合应用程序需求的熔断器实


现。熔断器在 Spring Cloud 框架中应用广泛,尤其是在与 Spring Cloud Gateway 等服务网关的集成过
程中。

4. Spring Cloud Config 与配置中心

微服务架构中,我们通常需要构建一个集中化的配置仓库来保存各种配置信息。同时,我们也需要构建
一个配置服务器来访问配置仓库并提供对外的访问入口,如下图所示。
一手资源尽在:666java.com

配置中心结构示意图

在 Spring Cloud 中,集中化配置中心服务器的实现依赖于 Spring Cloud Config,而配置仓库的实现方


案除了本地文件系统之外,还支持 Git、SVN 等常见的版本控制工具。

5. Spring Cloud Stream 与事件驱动

Spring Cloud 中的 Spring Cloud Stream 对整个消息发布和消费过程做了高度抽象,并提供了


Source/Sink、Channel 和 Binder 等一系列核心组件,如下图所示。

Spring Cloud Stream 结构示意图

Spring Cloud Stream 中的 Source 组件是真正生成消息的组件,然后消息通过 Channel 传送到


Binder,这里的 Binder 是一个中间层组件,通过 Binder 可以与特定的消息中间件进行通信。在
Spring Cloud Stream 中,目前已经内置集成的消息中间件包括 RabbitMQ 和 Kafka。消息消费者则同
样通过 Binder 从消息传递系统中获取消息,消息通过 Channel 将流转到 Sink 组件。

6. Spring Cloud Security 与服务安全

我们知道在 Spring 中存在一个用来应对安全需求的 Spring Security 框架。对应的,在 Spring Cloud


中也提供了 Spring Cloud Security 专门处理微服务环境下的服务安全访问需求。
一手资源尽在:666java.com
微服务架构的安全性本质上是服务访问的安全性,作为 Spring Cloud 中的一员,Spring Cloud
Security 是对微服务架构中所面临的安全性问题进行抽象并实现的工具。Spring Cloud Security 具备众
多特点,包括基于流行的 OAuth2 协议的授权机制,以及基于 Token 的资源访问保护机制。

基于 OAuth2 协议的服务访问安全控制示意图

7. Spring Cloud Sleuth 与链路跟踪

Spring Cloud Sleuth 是 Spring Cloud 的组成部分之一,对于分布式环境下的服务调用链路,我们可以


通过 Spring Cloud Sleuth 自动完成服务调用链路的构建。任何通过 HTTP 端点接收到的请求或使用
RestTemplate 发出的请求都可以被 Spring Cloud Sleuth 自动收集日志,同时它也能无缝支持通过由
API 网关 Zuul 发送的请求,以及基于 Spring Cloud Stream 等消息传递技术发送的请求。并且,正如
我们已经了解到的,Spring Cloud Sleuth 也兼容了 Zipkin、HTrace 等第三方工具的应用和集成,从而
实现对服务依赖关系、服务调用时序,以及服务调用数据的可视化,如下图所示。

Spring Cloud Sleuth 与 Zipkin 集成示意图

8. Spring Cloud Contracts 与服务测试


一手资源尽在:666java.com
作为 Spring Cloud 中我们将要介绍的最后一个核心组件,服务测试本质上不属于微服务架构的技术组
件,而只是一种辅助工具。但对于软件中的任何功能,我们都需要进行测试。对于微服务而言,测试是
一个难点,也是经常被忽略的一点,这也是本课程专门把服务测试作为一个专题来讲解的原因所在。通
常,我们会使用单元测试和集成测试来分别对一个类的内部,以及数据访问等涉及多个类交互的场景分
别进行测试。而在微服务架构中,当不同服务之间进行交互和集成时,测试的关注点就变成如何确保服
务定义和协议级别的正确性和稳定性,也就是所谓的端到端测试。

Spring 框架本身就提供了 Spring Test 模块来满足单元测试与集成测试的实施需求。但对微服务架构而


言,我们将重点介绍特有的消费者驱动的契约测试框架,这种测试解决方案能够有效应对服务与服务之
间交互场景下的端到端测试需求。在 Spring Cloud 中,满足这种端到端测试需求的就是 Spring Cloud
Contract 框架。Spring Cloud Contract 框架采用了服务桩(Stub) 实现机制来确保特定服务版本的各
个服务之间交互过程的正确性,如下所示:

基于 Spring Cloud Contract 的端到端测试方案

小结与预告
从本课时开始,我们正式引入了 Spring 家族中的微服务开发框架 Spring Cloud,我们明确了 Spring
Cloud 是构建在 Spring Boot 之上,且提供了一系列的核心组件用来满足微服务系统的开发需求。

这里给你留一道思考题:你能简要描述 Spring Cloud 中有哪些核心组件以及对应的功能吗?

在接下来的课程中,我们将逐一对 Spring Cloud 中提供的各个技术组件进行详细的展开。但在此之


前,我们希望能有一个完整的案例来演示这些技术组件的使用方法,这就是下一课时要讨论的内容。

You might also like