SpringCloud 是基于 SpringBoot 基础上开发的微服务框架,首先来介绍一下什么是微服务框架。
什么是微服务
微服务是系统架构上的一种设计风格,是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行。
可以发现微服务是一种用于构建应用的架构方案。有别于更为传统的单体式方案,微服务可将应用拆分成多个核心功能。每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作出现故障时不会相互影响
小型服务之间通过基于 HTTP/HTTPS 协议的 RESTful API 进行通信协作,也可以通过 RPC 协议进行。
由于有了轻量级的通信协作基础,所以这些微服务可以使用不同的语言来编写。
微服务开发过程中需要解决的问题
- 服务注册发现
- 远程服务调用
- 负载均衡
- 断路器
- 分布式消息
- 配置中心
- 链路监控
对于大部分公司而言,自研来解决微服务架构的一些问题,成本是很难接受的。不过,幸运的是,有不少业界开源方案可供选择。前几年比较火的是阿里的Dubbo,后来又出现了Spring体系下的微服务方案Spring Cloud,并迅速流行起来。
SpringCloud 是什么
Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、群集状态)的工具。分布式系统的协调导致了模板模式的出现,而使用 Spring Cloud,开发人员可以快速建立实现这些模式的服务和应用程序。它们可以在任何分布式环境中良好运行,包括开发人员自己的笔记本电脑、裸机数据中心和托管平台(如 Cloud Foundry)。
spring cloud提供了一些可以让开发者快速构建分布式应用的工具,这些服务可以很好的工作在任何分布式环境下。
Spring Cloud 专注于为典型用例提供良好的开箱即用体验,并为其他用例提供可扩展机制。
- 分布式/版本化配置
- 服务注册和发现
- 路由选择
- 服务调用
- 负载平衡
- 断路器
- 全局锁
- 领导选举和群集状态
- 分布式消息传递
Developing distributed systems can be challenging. Complexity is moved from the application layer to the network layer and demands greater interaction between services. Making your code ‘cloud-native’ means dealing with 12-factor issues such as external configuration, statelessness, logging, and connecting to backing services. The Spring Cloud suite of projects contains many of the services you need to make your applications run in the cloud.
开发分布式系统可能具有挑战性。复杂性从应用层转移到网络层,并要求服务之间进行更大的交互。使代码成为“云原生”意味着要处理12个因素的问题,如外部配置、无状态、日志记录和连接到支持服务。Spring Cloud项目组件包含使应用程序在云中运行所需的许多服务。
服务注册和发现
在云架构中,应用程序不可能总是知道其他服务的确切位置。服务注册中心解决方案可以提供帮助。
Spring Cloud为流行的注册表提供DiscoveryClient实现,如Eureka、Consul、Zookeeper,甚至Kubernetes的内置系统。还有一个Spring Cloud负载均衡器可以帮助您在服务实例之间小心地分配负载。
API 网关
在云架构中,当有如此多的客户端和服务器时,包含 API 网关通常很有用。网关可以负责保护和路由消息、隐藏服务、限制负载等许多有用的事情。Spring Cloud Gateway 为您提供了对 API 层的精确控制,集成了 Spring Cloud 服务发现和客户端负载均衡解决方案,以简化配置和维护。
我们发现,[Spring Cloud Gateway]的性能非常吸引人。在我们的使用案例中,延迟低、吞吐量大,而且超时的比例非常小。
配置中心
在云架构中,配置不能简单地嵌入在应用程序中。配置必须足够灵活,以应对多个应用程序、环境和服务实例,并能够在不宕机的情况下处理动态变化。Spring Cloud Config旨在减轻这些负担,并提供与 Git 等版本控制系统的集成,以帮助您保持配置安全。
Spring Cloud Config 为分布式系统中的外部化配置提供服务器和客户端支持。有了配置服务器,您就有了一个集中的地方来管理所有环境中应用程序的外部属性。客户端和服务器上的概念与 Spring Environment 和 PropertySource 抽象的映射完全相同,因此非常适合 Spring 应用程序,也可用于以任何语言运行的任何应用程序。当应用程序在从开发到测试再到生产的部署管道中移动时,您可以管理这些环境之间的配置,并确保应用程序在迁移时拥有运行所需的一切。服务器存储后端的默认实现使用 git,因此可轻松支持配置环境的标签版本,并可访问用于管理内容的各种工具。添加其他实现并将其插入 Spring 配置也很容易。
短路器
调试分布式应用程序可能很复杂,耗时很长。对于任何给定的故障,您可能需要将来自多个独立服务的跟踪信息拼凑在一起。Spring Cloud Sleuth 可以以一种可预测和可重复的方式为您的应用程序提供工具。当与 Zipkin 一起使用时,您可以找出任何您可能遇到的延迟问题。
分布式跟踪
调试分布式应用程序可能很复杂,耗时很长,因为您需要将来自多个独立服务的跟踪信息拼凑在一起。Spring Cloud Sleuth 可以为您的应用程序提供一种可预测和可重复的方式来生成跟踪数据。当与 Zipkin 一起使用时,您可以使用 Zipkin 来可视化跟踪数据并进行更深入的分析,从而找出任何您可能遇到的延迟问题。
测试
在云中,拥有可靠、可信、稳定的 API 可以获得额外加分,但实现这一点可能是一段旅程。契约测试是一种高绩效团队经常用来保持正轨的技术。它通过形式化 API 的内容并在其周围构建测试来确保代码保持一致来提供帮助。
Spring Cloud Contract 为 REST 和基于消息的 API 提供契约测试支持,契约可以用 Groovy、Java 或 Kotlin 编写。
- 契约测试:一种测试技术,用于验证 API 的行为是否符合预期的契约。
虽然 Spring Cloud 提供了非常强大的功能,但是它并不提供所有的实现,而是通过 Spring Cloud Common 子项目,定义了统一的抽象 API。
而后,不同厂商结合其自身的中间件,提供自己的 Spring Cloud 组件,例如说:
- Netflix 结合自己的 Eureka、Ribbon、Hystrix 等开源中间件,实现了 spring-cloud-netflix
- Kubernetes 结合自己的 apiserver、configmap 等功能,实现了 spring-cloud-kubernetes
- Alibaba 结合自己的 Nacos、Dubbo、Sentinel 等开源中间件,实现了 spring-cloud-alibaba
当然,Spring Cloud 官方还是提供了一些功能的具体实现的。例如说:
- API 网关:Spring Cloud Gateway
- 配置中心:Spring Cloud Config、Spring Cloud Vault
- 链路追踪:Spring Cloud Sleuth
- 消息驱动:Spring Cloud Stream
- 事件总线:Spring Cloud Bus
- 服务调用:Spring Cloud OpenFeign
- 负载均衡:Spring Cloud Load Balancer
| Spring Cloud官方 | Spring Cloud Netflix | Spring Cloud Alibaba | |
|---|---|---|---|
| 配置中心 | Spring Cloud Config,Spring Cloud vault | Archaius | Nacos |
| 注册中心 | Eureka | Nacos | |
| 服务调用 | Spring Cloud OpenFeignRestTempLate | Dubbo | |
| 负载均衡 | Spring Cloud Load Balancer | Ribbon | Dubbo |
| 服务容错 | Hystrix | Sentinel | |
| API网关 | Spring Cloud GateWay | Zuul | |
| 消息驱动 | Spring Cloud Stream RabbitMQ,Spring Cloud Stream Kafka | Spring Cloud Stream RocketMQ | |
| 事件总线 | Spring Cloud Bus RabbitMQ,Spring Cloud Bus Kafka | Spring Cloud Bus RocketMQ | |
| 链路追踪 | Spring Cloud Sleuth | ||
| 分布式事务 | Seata | ||
| 分布式调度 | ScheduleX |
Spring Cloud 并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 Spring Boot 风格进行再封装,从而屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
可以发现Spring Cloud本身不是新的框架,它是一系列框架的有序组合,利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发。并非所有组件都由Spring提供,Netflix和阿里巴巴扮演了重要的角色。
SpringCloud Netflix
Spring Cloud Netflix 的部分项目停止开源,大部分项目进入了维护模式(停止更新)。进入维护模式意味着什么呢?
- 进入维护模式意味着Spring Cloud Netflix 将不再开发新的组件了。我们都知道Spring Cloud 版本迭代算是比较快的,因而出现了很多重大ISSUE都还来不及Fix就又推另一个Release了。进入维护模式意思就是目前一直以后一段时间Spring Cloud Netflix提供的服务和功能就这么多了,不在开发新的组件和功能了。以后将以维护和Merge分支Full Request为主。
- 新组件功能将以其他替代平代替的方式实现
SpringCloud Alibaba
Spring Cloud 本身是一套微服务规范,并不是一个拿来即可用的框架,而 Spring Cloud Alibaba 的开源为开发者们提供了这套规范的实现方式。同时,Spring Cloud Alibaba 提供的完整的微服务组件、中文文档和本地化的开源服务提高了开发者们接入微服务的速率,并降低了后续的运维难度。
简单说,Spring Cloud Alibaba是阿里开源的一套Sping Cloud规范的实现,配置比 NetFlix 更简单易用。
Spring Cloud Alibaba 套件整合进 Spring Cloud 体系当中,同时对 Spring Cloud Gateway、OpenFeign、Ribbon 等等进行集成。
Spring Cloud Alibaba 在融入 Spring Cloud 体系之后,可以方便和其它 Spring Cloud 组件进行混合使用,强强联合。这也可以弥补,Alibaba 暂时缺失的开源组件。所以你可以看到有很多项目使用SpringCloud Alibaba微服务架构,然后使用Hystrix,OpenFeign,Ribbon,Apollo,等组件。