Spring Cloud Alibaba 最新五大核心组件
文章目录
- 一、什么是微服务?
- 二、为什么要用微服务?(微服务的核心价值)
- 1. 解决单体架构的核心痛点
- 三、什么是Spring Cloud
- Spring Cloud 组件
- 核心定位:微服务的“基础设施”
- 核心功能与组件(面试高频)
- Nacos
- 1. 服务注册
- 2. 服务发现
- 3. 配置中心
- 3. 配置持久化
- loadbalancer
- 切换负载均衡算法
- OpenFeign
- Resilience4j
- gateway
- 三、结尾
本篇文章不以教学为主,主要围绕面试回答为主,此文章是我准备面试回答所编写的
一、什么是微服务?
微服务(Microservices)是一种架构设计风格,而非具体技术,其核心是将传统的“单体应用”拆分为多个小型、独立、自治的服务单元,每个单元聚焦解决一个特定的业务领域问题(如“用户服务”“订单服务”“支付服务”),最终通过服务间的协作完成完整业务流程。
微服务的核心特征可总结为以下5点:
- 单一职责:每个服务单元只负责一个明确的业务领域,符合“高内聚”原则。
- 独立部署:每个服务单元拥有独立的代码仓库,可以单独部署。
- 技术栈灵活:允许不同服务根据业务需求选择最合适的技术栈。
- 自治数据:每个服务可以拥有独立的数据库,避免多服务之间、使用同一个数据库造成、单一数据库压力倍增。
- 轻量通信:服务间通过标准化的轻量级协议通信(如HTTP)。
二、为什么要用微服务?(微服务的核心价值)
选择微服务的本质是解决单体架构在“大规模系统、复杂业务、团队协作”场景下的痛点,其价值需结合“业务发展”和“技术效率”双维度阐述,避免只谈技术优势:
1. 解决单体架构的核心痛点
痛点维度 | 单体架构的问题 | 微服务的解决方案 |
---|---|---|
代码复杂度 | 所有业务逻辑耦合在一个项目中,代码量庞大(如几十万行),维护难度高,新人上手慢 | 按业务拆分为小型服务,每个服务代码量可控(如几千-几万行) |
技术栈僵化 | 整个系统只能用一套技术栈 | 各服务独立选择技术栈,新技术可局部落地,风险可控 |
部署风险高 | 修改一个小功能也需重新打包部署 | 修改一个服务功能无需全部服务重新发布 |
扩展性受限 | 无法针对高负载模块(如订单)单独扩展资源 | 可针对高负载服务单独扩容,资源利用率更高 |
故障影响范围大 | 一个模块oom导致整个单体应用崩溃,可用性低 | 因每个服务都有独立的进程,一个服务oom不会导致整个系统崩溃 |
三、什么是Spring Cloud
微服务是一种架构风格,而 Spring Cloud 则是这套规则的具体技术实现,它通过整合一系列组件(如服务注册发现、配置中心、熔断降级,负载均衡,服务调用 ,API 网关,分布式链路追踪,分布式事务 ),将微服务的抽象规则落地为可直接使用的技术工具
Spring Cloud 组件
Spring Cloud 是一套基于 Spring Boot 的微服务架构开发工具集,它整合了一系列成熟的开源组件,为微服务架构中的核心问题(如服务注册发现、配置管理、负载均衡、熔断降级、API 网关等)提供了标准化的解决方案,帮助开发者快速构建和部署分布式微服务系统。
核心定位:微服务的“基础设施”
Spring Cloud 本身不重复造轮子,而是通过封装和整合业界优秀的开源技术(如 Netflix OSS 组件、Alibaba 中间件、Consul、Zookeeper 等),并基于 Spring Boot 的“约定大于配置”思想简化其使用,让开发者无需深入理解底层技术细节,就能快速搭建稳定、可靠的微服务架构。
简单说:Spring Boot 解决了“单体应用的快速开发”,而 Spring Cloud 解决了“微服务架构的协同治理”,两者结合形成了“快速开发微服务”的完整技术栈。
核心功能与组件(面试高频)
- 上古版本
核心场景 | 解决的问题 | 常用组件举例 |
---|---|---|
服务注册与发现 | 服务之间如何找到对方(类似“通讯录”) | eureka |
负载均衡 | 多个服务实例如何分配请求(避免单实例过载) | Ribbon |
服务调用 | 服务间如何高效通信(替代传统 HTTP 调用) | OpenFeign |
熔断与降级 | 服务故障时防止连锁反应(如“雪崩效应”) | Hystrix |
API 网关 | 统一入口、路由转发、认证授权、限流等 | Gateway |
- 早期版本
核心场景 | 解决的问题 | 常用组件举例 |
---|---|---|
服务注册与发现 | 服务之间如何找到对方(类似“通讯录”) | Nacos |
配置中心 | 多服务配置统一管理,动态刷新 | Nacos |
负载均衡 | 多个服务实例如何分配请求(避免单实例过载) | Ribbon |
服务调用 | 服务间如何高效通信(替代传统 HTTP 调用) | OpenFeign |
熔断与降级 | 服务故障时防止连锁反应(如“雪崩效应”) | Hystrix |
API 网关 | 统一入口、路由转发、认证授权、限流等 | Gateway |
分布式事务 | 跨服务操作的数据一致性问题 | Seata |
- 2020年起
核心场景 | 解决的问题 | 常用组件举例 |
---|---|---|
服务注册与发现 | 服务之间如何找到对方(类似“通讯录”) | Nacos |
配置中心 | 多服务配置统一管理,动态刷新 | Nacos |
负载均衡 | 多个服务实例如何分配请求(避免单实例过载) | loadbalancer |
服务调用 | 服务间如何高效通信(替代传统 HTTP 调用) | OpenFeign |
熔断与降级 | 服务故障时防止连锁反应(如“雪崩效应”) | resilience4j 或者 sentinel |
API 网关 | 统一入口、路由转发、认证授权、限流等 | Gateway |
分布式事务 | 跨服务操作的数据一致性问题 | Seata |
根据这个请求流程图 我们能清晰的看出 微服务间的请求流是什么样子的,那么就算spring cloud的组件再怎么变化 那么这个请求流程肯定是不会变的。
Nacos
Nacos 安装教学
什么是nacos
Nacos 是阿里巴巴开源的一款 微服务基础设施工具,全称是 Dynamic Naming and Configuration Service(动态命名与配置服务)。它的核心能力是 “一站式融合”:同时提供 服务注册中心 和 配置中心 功能,还支持服务健康检查、动态路由、流量控制等扩展能力,本质是为微服务架构提供 “服务治理” 和 “配置治理” 的统一解决方案。
1. 服务注册
现在我启动了 两个product-center 由于它们的服务名称都是一样的 并且都注册到了一个nacos 中并且同一个空间下以及同一个分组下 就会视为是一个product-center的集群
当服务启动时候服务会向注册中心注册自己的服务,包括 ip 端口 服务名 等。
spring:application:name: product-centercloud:nacos:discovery:server-addr: username: wu_xs_devpassword: wu_xs_devnamespace: devenabled: true服务会根据 设置的心跳时间向nacos 推送心跳 heart-beat-interval: 5000heart-beat-timeout: 30000
- 实例每5秒发送一次心跳(默认
heart-beat-interval
)。 - 超过15秒未收到心跳 → 标记为 不健康(仍在服务列表中,但调用时可能被过滤)。默认是15秒 可以在应用程序的yml 里面指定 heart-beat-timeout 达到多少秒为不健康。
- 不健康状态持续超过30秒 → 实例被 下线(从服务列表中移除)。
不健康下线时间是默认的 也可以在nacos application.properties 里面指定下线时间 nacos.naming.instance.expired.time=30000
2. 服务发现
服务启动后,从 Nacos 拉取并缓存它所依赖的服务的实例列表,当 OpenFeign 发起远程调用时从本地缓存的实例列表中获取,根据loadbalancer负载均衡算法选择一个服务发起调用
这里的 “所依赖的服务” 通常是指消费者通过 OpenFeign 声明的接口中指定的服务名
如@FeignClient(name = “auth”)
这里我写了测试接口去调用auth服务的接口。
现在我启动了两个auth服务,那么现在auth服务是个集群,服务启动后,从 Nacos 拉取并缓存它所依赖的服务的实例列表,当 OpenFeign 发起远程调用时从本地缓存的实例列表中获取,根据loadbalancer负载均衡算法选择一个服务发起调用
点击发送请求
我在控制台中输出了 手机号 现在我们可以看到在(1) 服务中执行了
而在这个服务中却没有执行
我再次发送请求之后这个服务就得到了请求处理
3. 配置中心
“配置中心本质是 微服务架构下的‘配置统一管理平台’ —— 它将原本分散在每个服务本地的配置文件(比如数据库连接、接口地址、功能开关、限流阈值等),集中存储到一个中心化的服务器上,然后通过‘统一分发、动态更新’的机制,让所有服务能实时获取和使用最新配置。
用户在 Nacos 控制台按“数据 ID + 分组 + 命名空间”创建配置:
- 数据 ID:配置的唯一标识,通常格式为
服务名-环境.yml
(如user-service-dev.yml
),对应微服务的配置文件名; - 分组(Group):用于区分同一服务的不同配置场景(如
DEFAULT_GROUP
为默认分组,PAY_GROUP
为支付相关配置分组); - 命名空间(Namespace):用于隔离环境(如
dev
对应开发环境,prod
对应生产环境); - 配置内容:填写具体的配置项(如数据库连接、开关参数),支持 YAML/Properties/JSON 等格式。
3. 配置持久化
配置mysql数据库
Nacos 安装教学
loadbalancer
LoadBalancer(负载均衡)是微服务架构中的核心流量调度工具,它的核心能力是 “流量分发与资源优化”:通过预设的调度算法(如轮询、加权轮询、哈希等),将来自客户端或上游服务的请求,均匀分配到后端多个相同功能的服务实例上,同时支持实例健康检查、故障自动剔除、流量控制等扩展能力,==本质是为微服务架构提供 “请求流量治理” ==和 “服务实例资源最大化利用” 的统一解决方案。
open feign 集成了 loadbalancer 负载均衡 用于服务之间请求的负载均衡
Nacos 集成了负载均衡能力,用于微服务架构中服务实例的动态筛选与分发,为服务间调用提供 “可用实例选择” 的支撑。Nacos 先筛选出 “健康可用的服务实例列表”(比如排除故障实例、按权重排序),然后 OpenFeign 从这个列表中,再用自己集成的负载均衡算法(如轮询、随机等)选择一个具体实例发起调用。
gateway集成loadbalancer是用于web以及外部服务需要走网关的接口调用进行请求转发的 当请求匹配到断言之后根据url获取服务列表进行负载均衡发给具体集群的服务。
切换负载均衡算法
-
轮询算法(Round Robin)
- 实现类:
org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer
- 原理:按顺序循环选择实例(实例1→实例2→实例3→实例1…),是默认策略。
- 实现类:
-
随机算法(Random)
- 实现类:
org.springframework.cloud.loadbalancer.core.RandomLoadBalancer
- 原理:从实例列表中随机选择一个实例。
- 实现类:
-
权重轮询算法(Weighted Round Robin)
- 实现类:无内置,需自定义(可基于
RoundRobinLoadBalancer
扩展,结合实例权重属性实现)。 - 原理:为实例分配权重,权重高的实例被选中的概率更高(需配合服务发现实例的元数据存储权重)。
- 实现类:无内置,需自定义(可基于
-
最少连接数算法(Least Connections)
- 实现类:无内置,需自定义(可基于
ReactorLoadBalancer
接口实现,通过监控实例连接数动态选择)。 - 原理:优先选择当前活跃连接数最少的实例,适用于长连接场景。
- 实现类:无内置,需自定义(可基于
默认使用的 ReactiveLoadBalancer 实现是 RoundRobinLoadBalancer。要切换到不同的实现,无论是针对选定的服务还是所有服务,都可以使用自定义负载均衡器配置机制。
例如,可以通过 @LoadBalancerClient
注解传递以下配置来切换使用 RandomLoadBalancer
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;public class CustomLoadBalancerConfiguration {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);System.out.println("当前负载均衡服务名:" + name); // 应输出 auth-centerreturn new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}
import com.wxs.gateway.config.CustomLoadBalancerConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.context.annotation.Configuration;@SpringBootApplication
@Configuration
@LoadBalancerClients({@LoadBalancerClient(name = "auth-center", configuration = CustomLoadBalancerConfiguration.class)
})public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}}
注意 必须要加@Configuration注解的哈,不加的话要在randomLoadBalancer 方法上加 @Primary // 强制此 Bean 为首选,覆盖默认轮询策略
OpenFeign
OpenFeign 是 Spring Cloud 生态中的一款声明式 HTTP 客户端工具。它的核心能力是 “简化服务之间调用”:通过接口声明的方式,自动封装 HTTP 请求的构建、发送、响应解析等细节,让开发者无需手动编写 HttpClient 代码(如 RestTemplate),就能像调用本地方法一样调用远程服务,本质是为微服务架构提供 “服务间通信的便捷解决方案”。
指定要调用的服务名(对应 Nacos 中的服务名)
@FeignClient(name = "auth-center")
若是第三方的话,填写url
@FeignClient(// name 可以随便填,只要唯一即可name = "order-service",url = "http://192.168.10.10:8080,http://192.168.10.11:8080" // 多个地址
)
使用的时候像接口一样那么简单
Resilience4j
Resilience4j 是一款轻量级的开源容错框架,专为 Java 应用设计,核心能力是 “增强系统韧性”:通过提供熔断、限流、重试、舱壁等机制,帮助系统在面对服务故障、网络延迟、流量突增等异常情况时,避免级联失败,保持核心功能可用,本质是为微服务系统提供 “故障隔离与容错处理” 的解决方案。
resilience4j:# 1. 超时配置(按需保留,避免接口耗时过长导致误判)timelimiter:configs:default:timeout-duration: 10s # 接口超时设为10秒(根据实际接口耗时调整)# 2. 熔断配置(核心:10秒内失败率达50%触发)circuitbreaker:configs:default:# 1. 失败率阈值:50%(达标即熔断)failureRateThreshold: 50# 2. 统计模式:按时间统计(TIME_BASED)slidingWindowType: TIME_BASED# 3. 统计时间周期:10秒(即“10秒内”的统计窗口)slidingWindowSize: 10# 4. 最小调用次数:4次(10秒内至少4次调用才计算失败率,避免样本太少误判)minimumNumberOfCalls: 4# 5. 半开状态配置:熔断后5秒进入半开,允许2次试探调用waitDurationInOpenState: 5spermittedNumberOfCallsInHalfOpenState: 2# 6. 统计为“失败”的异常(按需调整,避免业务异常误统计)recordExceptions:- java.net.SocketTimeoutException # 网络超时- java.util.concurrent.TimeoutException # 超时异常- org.springframework.web.client.RestClientException # HTTP调用异常# 7. 忽略的异常(不统计为失败,如业务参数错误)# ignoreExceptions:# - com.yourproject.exception.BusinessException# 3. 实例配置(绑定具体业务,如“邮件认证接口”)instances:auth-center: # 实例名,需与代码中@CircuitBreaker(name = "auth-center")一致baseConfig: default # 继承上面的default配置
10秒内 调用次数大于4次之后 开始计算失败率 失败率大于百分之50后就开启服务降级 降级5秒后开始半开状态允许一些两次试探 是否调用成功 ,成功后关闭服务熔断
4次有两次失败 就是有百分之50了
熔断是 针对“依赖服务持续故障”的主动防护机制,核心是通过“状态监控与自动切换”,避免调用方被故障的依赖服务拖垮。
降级是 针对“调用失败或被熔断”的兜底机制,核心是当主逻辑无法执行时,用预设的备用逻辑返回结果,避免级联故障。
// 主方法:调用依赖服务,配置熔断和降级
@CircuitBreaker(name = "paymentService", fallbackMethod = "paymentFallback")
public String pay(Long orderId) {return paymentClient.pay(orderId); // 调用支付服务(可能失败)
}// 降级方法:当主方法失败或被熔断时执行
public String paymentFallback(Long orderId, Exception e) {// 返回备用结果,如缓存数据、默认提示return "订单" + orderId + "支付暂时繁忙,请稍后重试";
}
- 接口失败演示
2. 熔断降级演示
自己演示的时候记得把时间拉长一点
注意统计的异常 ,为了方便演示这里我就直接是- java.lang.Exception了
gateway
在微服务架构中,Gateway(网关) 是位于客户端与微服务集群之间的 “中间层服务”,本质是流量入口的统一管理者—— 所有客户端(Web、App、第三方服务)的请求都先经过网关,由网关完成 “路由转发、权限控制、流量管控” 等核心操作后,再将请求分发到具体的微服务。
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 14.103.128.188:8848username: wu_xs_devpassword: wu_xs_devnamespace: devenabled: trueconfig:server-addr: 14.103.128.188:8848file-extension: yamlprefix: gatewayusername: wu_xs_devpassword: wu_xs_devnamespace: devgroup: DEFAULT_GROUPcontext-path: nacosrefresh-enabled: trueshared-configs: gateway.yamlenabled: truegateway:discovery:locator:enabled: truelower-case-service-id: true# 3. 自定义路由规则(比默认服务发现路由更灵活,推荐优先配置)routes:# 路由1:转发到用户服务(user-service)- id: auth-center-route # 路由唯一ID(自定义,确保唯一)uri: lb://auth-center # 转发目标:lb=负载均衡,user-service=微服务名(从Nacos获取)predicates: # 路由匹配规则:请求路径以 /api/user/ 开头时触发- Path=/api/auth/**filters: # 过滤器:处理请求(如去掉前缀、添加请求头)- StripPrefix=1 # 去掉路径前缀1级(/api/user/1 → /user/1,匹配用户服务接口)# 路由2:转发到订单服务(order-service)- id: product-center-routeuri: lb://product-centerpredicates:- Path=/api/product/**filters:- StripPrefix=1
- 路由转发
路由转发就是通过断言进行实现的,当请求来的时候匹配到断言之后进行转发到具体的服务
- 流量管控
流量控制是指gateway集成了loadbalancer 负载均衡 当web app 第三方等 请求需要经过gateway 请求时 根据loadbalancer负载均衡算法选择一个服务发起调用
执行成功会在控制台输出打印
现在启动了两个服务
请求来的时候会根据loadbalancer负载均衡的策略发送集群的具体服务
3. 权限控制
Spring Cloud Gateway 的 GlobalFilter接口类 可以用来实现权限控制。GlobalFilter 是全局过滤器,会对所有经过 Gateway 的请求生效,filter方法进行实现权限控制如:请求token权限验证等
三、结尾
以上内容围绕微服务核心概念与 Spring Cloud 关键组件展开,从“微服务架构的设计思想”到“Nacos、OpenFeign、Resilience4j、Gateway loadbalancer 等组件的落地实践”,覆盖了面试中高频的技术原理、核心功能与实际场景应用。
微服务的价值从来不是“为了拆分而拆分”,而是通过合理的架构设计,解决单体系统在业务扩张、团队协作、资源效率上的瓶颈;而 Spring Cloud 作为成熟的微服务工具集,其组件选型与使用逻辑(如 Nacos 统一服务与配置治理、Gateway 集中流量管控、Resilience4j 保障系统韧性,openFeign 简化服务调用,loadbalancer 负载均衡),本质是为了让开发者更聚焦业务逻辑,而非重复解决分布式架构的共性问题。
在面试中,除了掌握上述技术细节,更建议结合实际项目场景阐述——比如“如何通过 Gateway 的 GlobalFilter 实现统一的 Token 校验”“Resilience4j 熔断配置如何根据接口耗时与失败率动态调整”“Nacos 命名空间与分组如何隔离多环境配置”,这些“技术+场景”的结合,才能更清晰地体现对微服务架构的理解深度。
最后,微服务架构没有“银弹”,实际落地中需平衡“拆分粒度”“治理成本”与“业务复杂度”,选择适合团队与业务的方案,才是架构设计的核心。