📜  Spring Cloud的组件

📅  最后修改于: 2021-01-11 02:10:51             🧑  作者: Mango

Spring Cloud组件

包含以下组件:

  • 组态
  • 服务发现
  • 断路器
  • 路由和消息传递
  • API网关
  • 追踪
  • CI管道和测试

组态

Spring Cloud配置组件为分布式系统中的外部化配置提供服务器端和客户端支持。我们可以使用配置服务器为所有环境中的应用程序管理外部属性。 Spring Cloud配置服务器可以使用Git,SVN(Apache Subversion),文件系统和Vault来存储配置。配置客户端(微服务应用程序)在启动时会从服务器检索配置客户端。

服务发现

服务发现是通过网络自动检测设备和服务。换句话说,服务发现是应用程序和微服务在分布式环境中的连接方式。服务发现实现包括:

  • 维护地址全局视图的中央服务器。
  • 连接到中央服务器的客户端可以更新和检索地址。

两种发现模式:客户端发现服务器端发现

  • 客户端发现:在客户端发现中,客户端负责确定可用服务的网络位置。客户端使用负载平衡算法来选择可用服务之一并发出请求。 Netflix OSS是客户端发现模式的一个示例。
  • 服务器端发现:在服务器端发现中,客户端通过负载平衡器向服务发出HTTP请求。负载平衡器联系服务注册表,并将每个请求路由到可用的服务实例。与客户端发现类似,服务实例是通过服务注册表注册和注销的。 AWS ELB (弹性负载平衡器)是服务器端发现的示例。 ELB平衡了Internet的外部流量。

在上图中,生产者是一种将消息发送到消息代理(服务注册表)的软件。使用者也是一种接收消息并对其进行处理的软件。

断路器

Netflix创建了一个名为Hystrix的库。它实现了断路器模式。断路器计算何时打开和闭合电路以及在发生故障时应采取的措施。当所有服务都在某个时刻失败时,断路器会优雅地处理这些失败。断路器具有三个状态:“打开”,“闭合”和“半打开”状态。

CLOSED状态:如果断路器处于CLOSED状态,并且所有呼叫都转到供应商微服务。它响应没有任何延迟。

断开状态:断路器不执行函数返回错误呼叫。

半开状态:当函数执行超时时,电路变为半开状态。它测试基本问题是否仍然存在。它是一种监视反馈机制。它会尝试致电供应商微服务以检查其是否已恢复。如果对供应商的呼叫超时,则电路将保持在OPEN状态。如果呼叫成功返回,则电路切换到CLOSED状态。断路器在HALF-OPEN状态期间将所有外部呼叫返回给服务,但有错误。

路由和消息传递

云应用程序由许多微服务组成,因此通信至关重要。 Spring Cloud支持通过消息传递或HTTP请求进行通信。路由使用Netflix RibbonOpen Feign,而消息传递则使用Kafka或Rabbit MQ。

API网关

API网关允许我们路由API请求(外部或内部)以连接服务。它还提供了一个用于在Spring MVC顶部构建API网关的库。其目的是向他们提供跨领域的关注,例如安全监视

API网关的功能

  • 基于Spring框架5,项目反应器和Spring Boot 2.0构建
  • 能够匹配任何请求属性上的路由
  • 谓词和过滤器特定于路由
  • Hystrix断路器集成
  • Spring Cloud Discovery客户端集成
  • 易于编写的谓词和过滤器
  • 请求速率限制
  • 路径改写

追踪

Spring Cloud的其他功能是分布式跟踪。跟踪是从应用程序获取数据的单个请求。跟踪导致对各种微服务的请求数量成倍增加。

我们可以在项目中添加Spring Cloud Sleuth库以启用跟踪。 Sleuth负责记录时序,用于进行延迟分析。我们可以将此时间导出到Zipkin。

Zipkin是专门设计用于分析微服务架构内部的延迟问题的分布式跟踪工具。它公开了用于收集输入数据的HTTP端点。如果需要在项目中添加跟踪,则应添加spring-cloud-starter-zipkin依赖项。

在微服务中,输入流量非常大,因此我们无法仅收集特定数量的数据。为此,Spring Cloud Sleuth提供了一个采样策略。采样策略允许我们将多少输入流量发送到Zipkin进行分析。要启用此功能,我们必须添加spring-cloud-sleuth-stream依赖项。

Cl管道和测试

Spring Cloud管道是Jenkins和Concourse的自以为是的(非常重要的)管道,它会自动为应用程序创建管道。在各种服务中进行构建,测试和部署对于拥有成功的云原生应用程序至关重要。

Jenkins管道提供了一组工具,用于将简单和更高级的交付管道建模为代码。管道的定义被写入一个名为Jenkinsfile的文本文件中。

管道具有两种语法:声明式脚本化管道。这些语法分为两部分:步骤和阶段。步骤是管道的基本部分,因为它们告诉Jenkins服务器要做什么。阶段是管道的主要部分。阶段在逻辑上将几个步骤分组,这些步骤显示在管道的结果屏幕上。