Spring Cloud 的一个伟大之处在于它构建在 Spring Boot 的概念之上。Spring Cloud 是建立在 Spring 框架的一些常见构建块之上的,这些构建块如下:
1.智能路由和服务发现
2.服务间调用
3.负载均衡
4.领导选举
5.全局锁
6.分布式配置
7.分布式消息传递
这是“微服务如何通过服务注册表或 Eureka 服务器与其他依赖的微服务进行通信”的过程。服务间调用遵循一系列的步骤。
1.注册服务
2.获取注册表
3.查找下游服务
4.解析底层 IP 地址
5.调用 REST 终端点
负载均衡有效地将网络流量分布到多个后端服务器或服务器池。负载均衡的目标是最大化吞吐量,最小化响应时间,提高效率,并优化资源使用。它避免了任何单个资源的过载。使用具有负载均衡的多个组件可以通过冗余性增加可靠性和可用性。
领导选举允许应用程序通过第三方系统与其他应用程序一起工作。领导选举用于在不牺牲可用性的情况下提供全局状态或全局排序。
全局锁用于确保没有两个线程同时访问同一资源。程序员使用一种机制来消除这种情况,这称为锁。每个线程首先获取锁,对资源进行操作,然后释放锁供其他线程使用。
分布式配置是为所有微服务的每个实例进行配置的过程。"Spring Cloud Config 服务器"为分布式系统中的外部化配置提供了客户端支持。通过分布式配置,我们有一个集中的位置来管理所有环境中应用程序的外部属性。
分布式消息传递系统具有可靠性、可伸缩性和持久性的优点。消息传递模式遵循发布-订阅(Pub-Sub)模型。在发布-订阅模型中,消息的发送者称为发布者,消息的接收者称为订阅者。Apache Kafka 和 RabbitMQ 是流行的高吞吐量消息传递系统。
Spring Cloud 配置组件为分布式系统中的服务器端和客户端提供了外部化配置的支持。我们可以通过配置服务器来管理应用程序在所有环境中的外部属性。Spring Cloud 配置服务器可以使用 Git、SVN(Apache Subversion)、文件系统和 Vault 来存储配置。配置客户端(微服务应用)在启动时从服务器检索配置。
服务发现是自动检测网络上的设备和服务。换句话说,服务发现是应用程序和微服务在分布式环境中连接的方式。服务发现的实现包括两种模式:
客户端发现(Client-side discovery):在客户端发现中,客户端负责确定可用服务的网络位置。客户端使用负载均衡算法选择一个可用服务,并发出请求。Netflix OSS 是客户端发现模式的一个示例。
服务器端发现(Server-side discovery):在服务器端发现中,客户端通过负载均衡器向服务发出 HTTP 请求。负载均衡器联系服务注册表,并将每个请求路由到可用的服务实例。
与客户端发现类似,服务实例在服务注册表中注册和注销。AWS ELB(弹性负载均衡器)是服务器端发现的一个示例。ELB 在来自互联网的外部流量上进行负载均衡。
Netflix 创建了一个名为 Hystrix 的库,它实现了断路器模式。断路器计算何时打开和关闭电路,以及在发生故障时应采取的措施。当所有服务在某个时刻都失败时,断路器会优雅地处理这些故障。断路器有三种状态:打开(OPEN)、关闭(CLOSED) 和 半开(HALF-OPEN)。
HALF-OPEN 状态:当函数执行超时时,电路转入 HALF-OPEN 状态。 它测试潜在的问题是否仍然存在。 它是一种监控和反馈机制。 它会尝试调用供应商微服务以检查其是否已恢复。 如果对供应商的调用超时,则电路保持在开路状态。 如果调用返回成功,则电路切换到 CLOSED 状态。 在 HALF-OPEN 状态期间,断路器将所有外部调用返回到服务并出现错误。
云应用程序由许多微服务组成,因此通信将是关键性的。Spring Cloud 支持通过消息传递或 HTTP 请求进行通信。路由使用 Netflix Ribbon 和 OpenFeign,而消息传递则使用 Kafka 或 Rabbit MQ。
API 网关允许我们将 API 请求(外部或内部)路由到连接的服务。它还提供了在 Spring MVC 顶部构建 API 网关的库。其目标是为它们提供横切关注点,如安全性和监控。
Spring Cloud 的另一个功能是分布式追踪。追踪是为了从应用程序获取数据的单个请求。追踪会导致大量请求传递到各种微服务。
我们可以在项目中添加 Spring Cloud Sleuth 库以启用追踪。Sleuth 负责记录时序,用于延迟分析。我们可以将此时序导出到 Zipkin。
Spring Cloud 流水线是适用于 Jenkins 和 Concourse 的自命不凡(自大)的流水线,它会自动为应用程序创建流水线。在各种服务中进行构建、测试和部署对于成功的云原生应用程序非常关键。
Jenkins 流水线提供了一组工具,旨在将简单和更高级的交付流程建模为代码。流水线的定义写入名为 Jenkinsfile 的文本文件中。流水线有两种语法:声明性和脚本化。这些语法分为两部分:步骤(Steps)和阶段(Stages)。步骤是流水线的基本部分,它们告诉 Jenkins 服务器要做什么。阶段是流水线的主要部分。阶段在逻辑上将一些步骤分组在一起,这些步骤在流水线的结果屏幕上显示。