简介
特点
- 官方文档:https://spring.io/projects/spring-cloud;
- 在 Spring Boot 基础之上构建,用于快速构建分布式系统的通用模式的工具集;
- 集大成者,Spring Cloud 包含了微服务架构的方方面面;
- 约定优于配置,基于注解,配置文件少;
- 轻量级组件、开发简便、灵活;
- 项目结构复杂,每一个组件或者每一个服务都需要创建一个项目;
- 部署门槛高,项目部署需要配合 Docker 等容器技术进行集群部署;
新特性
一.Spring Cloud Netflix 彻底删除掉了除Eureka外的所有组件。
二.Bootstrap上下文默认不再启动。
- Spring Cloud容器是靠Bootstrap Context引导上下文来启动的,对应的类是BootstrapApplicationListener。
- 如果需要开启Bootstrap上下文,有两种办法可以实现:设置值
spring.cloud.bootstrap.enabled=true
或者spring.config.use-legacy-processing=true
即可。注意:这些个属性值必须确保其能放进环境里才能生效。比如靠谱的方式是:系统属性、环境变量、命令行等引入一个Jar:org.springframework.cloud:spring-cloud-starter-bootstrap
。
三. 全新的配置方式
得益于Spring Boot 2.4.x支持全新的配置文件书写方式,自此可以使用spring.config.import
导入其它组建的配置。如:
spring.config.import=configserver:xxx
spring.config.import=zookeeper:
spring.config.import=consul:
spring.config.import=vault:
这么做更具模块化,更符合云原生环境的要求
四. Spring Cloud Config
之前若要禁用Spring Cloud Config Client端的健康指示用的是health.config.enabled=false
,现改为management.health.config.enabled=false
,保持了和Spring Boot控制端点风格一致。
五。 移除了Spring Cloud Security
Spring Cloud Security 这个项目删除了,其主要代码已经移到了 Spring Cloud Commons下。
六.Spring Cloud LoadBalancer
支持服务端统计
七. Spring Cloud Openfeign
- 支持在 Spring Cloud CircuitBreakers 中包装 feign 客户端;
- Spring Cloud OpenFeign 安全部分的代码,从 Spring Cloud Security 移到了 Spring Cloud OpenFeign;
- 增加了 LoadBalancer 统计功能;
八. Spring Cloud Gateway
增加了对LoadBalancer统计信息的支持。
九. Spring Cloud Task
增加了单步批处理作业的文档
十. Spring Cloud Kubernetes
- 增加了基于 Kubernetes Java 客户端的响应式客户端发现实现;
- 增加了基于 Kubernetes Java 客户端的 Spring Cloud Loadbalancer 实现;
组件
- 注册中心:Netflix Eureka;
- 负载均衡:Netflix Ribbon(2020 版本前)、Spring Cloud Loadbalancer(2020 版本后);
- 熔断器:Netflix Hystrix(2020 版本前)、Resilience4j(2020 版本后);
- 声明式服务调用组件:Feign(最初属 Netflix 公司,后来移交给 OpenFeign 组织);
- 网关:Netflix Zuul(2020 版本前)、Spring Cloud Gateway(2020 版本后);
- 配置中心:Spring Cloud Config;
- 事件、消息总线:Spring Cloud Bus;
- 安全组件:Spring Cloud Security;
子项目 | 作用 | 解决了什么问题 |
Netflix Eureka | 服务注册与发现 | 硬编码服务提供者地址的方式有不少问题。要想解决这些问题,服务消费者需要一个强大的服 务发现机制,服务消费者使用这种机制获取服务提供者的网络信息。不仅如此,即使服务提供者的网络地址发生变化,服务消费者也无须修改配置文件。 |
Netflix Ribbon,Spring Cloud Loadbalancer(2020 版本后) | 客户端侧负载均衡 | Ribbon 的作用是负载均衡,会帮你在每次请求时选择一台服务器,均匀的把请求分发到各个服务器上。 |
Netflix Feign | REST调用 | Feign Client 会在底层根据你的注解,跟你指定的服务建立连接、构造请求、发起请求、获取响应、解析响应,等等。 |
Netflix Hystrix | 容错处理 | 服务链上,因为某个微服务的异常,而导致雪崩效应,整条服务链宕机的问题;Hystrix回去捕获这个异常,利用Hystrix接口处理这类异常。 |
Netflix Zuul | 微服务网关(使用Spring Cloud Gateway代替,官方不会集成 Zuul 2.x) | 负责网络路由,可以做统一的降级、限流、认证授权、安全,等等。 |
Spring Cloud Config | 分布式配置 | |
Turbine | 聚合Hystrix监控数据 | |
Sleuth | 微服务跟踪 |
总结
第一步:服务注册
第二步:服务发现
第三步:负载均衡
第四步:服务调用
第五步:隔离、熔断与降级
第六步:网关路由
总结详细讲解:各个服务启动时,Eureka Client 都会将服务注册到 Eureka Server,并且 Eureka Client 还可以反过来从 Eureka Server 拉取注册表,从而知道其他服务在哪里。服务间发起请求的时候,基于 Spring Cloud Loadbalancer 做负载均衡,从一个服务的多台机器中选择一台。基于 Feign 的动态代理机制,根据注解和选择的机器,拼接请求 URL 地址,发起请求。发起请求是通过 Hystrix 的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。如果前端、移动端要调用后端系统,统一从 Zuul 网关进入,由 Spring Cloud Gateway 网关转发请求给对应的服务。
问题收集
- 启动分布式微服务报错:Live reload start error, Address already in use;
- 每个微服务都配置有热部署依赖,热部署默认端口重复启动被占用,用以下配置修改每个微服务热部署端口;
- spring.devtools.livereload.port=35730
- Idea 启动微服务,控制台无报错,微服务启动不成功,注册不成功;
- 解决思路
- 尝试去掉最近添加的配置,重启问题依旧;
- 尝试重启注册中心,再重启该微服务,问题依旧;
- 尝试启动其他正常微服务,对比日志,问题依旧;
- 尝试使用 Java 命令启动该微服务,正常启动;
- 尝试使用 Eclipse 启动该微服务,正常启动;
- 搜索关键字“Idea 启动 Spring Boot 项目停滞”得到答案,Idea 打了特殊断点,但是 Idea 没有自动定位到断点的位置;
- 解决思路