对于spring cloud组件,在市面上其实有很多套组件,我们之前公司中使用的是阿里巴巴配套的组件,也就是下面这5大组件。

  • 服务注册与配置中心:Nacos。

  • 负载均衡:Ribbon。

  • 服务调用:Feign。

  • 服务保护:Sentinel。

  • API网关:Gateway。

它们在微服务架构的作用是这样的。不同微服务想要相互通信,首先得将服务进行注册并拉取,这个时候就可以使用nacos实现,并且nacos还可以管理每个服务之间的配置;

当每个微服务成功的注册之后,此时就能够通过feign实现微服务之间的通信;

如果整个微服务架构比较大,对于每个服务而言可能部署了多台实例,此时就需要使用到ribbon实现负载均衡;

如果微服务中某个服务挂了,此时就需要使用sentinel对其进行降级处理,让整个链路不会被影响到;

最后是gateway,它其实相当于整个微服务架构的大门,当用户发起请求时,则会通过gateway进行校验以及转发。

nacos

服务注册与发现主要包含三个核心功能:服务注册、服务发现和服务状态监控。

我们项目中采用了 Nacos 作为服务注册中心,它是 Spring Cloud Alibaba 体系中的核心组件,也是目前企业微服务开发的主流选择。

- 服务注册:服务提供者启动时,将自己的信息(如服务名称、IP、端口、版本号等)注册到 Nacos。

- 服务发现:消费者从 Nacos 获取目标服务的实例列表,并利用负载均衡算法(如 Ribbon)选择一个可用服务进行调用。

- 服务监控:服务提供者定期向 Nacos 发送心跳以报告健康状态;如果 Nacos 在一定时间内未接收到心跳,会先将该服务实例标记为不健康,超时后则将其从注册中心剔除,避免消费者调用异常服务。

“相比早期的 Eureka,Nacos 不仅能实现服务注册发现,还集成了配置中心功能,可一站式解决服务地址管理和配置动态刷新问题,部署运维更便捷,也更适配国内企业的实际开发场景。”

ribbon

概念

Ribbon 的主要作用是客户端负载均衡。它通常不直接暴露给开发者调用,而是作为底层组件被集成在 RestTemplate、Feign 等客户端中,对服务调用实现透明化的负载均衡。

例如,当使用 Feign 调用某个微服务时,如果该服务部署了多个实例,Feign 会依赖 Ribbon 从服务发现组件(如 Nacos、Eureka)获取实例列表,并按照配置的策略(如轮询、随机、权重响应)选择一个实例发起请求。 程序员可以通过配置来定制 Ribbon 的策略(如配置文件或 @RibbonClient),但不需要手动编写负载均衡的代码逻辑。

Ribbon提供了多种负载均衡策略,包括:

  • RoundRobinRule:简单的轮询策略。

  • WeightedResponseTimeRule:根据响应时间加权选择服务器。

  • RandomRule:随机选择服务器。

  • ZoneAvoidanceRule:区域感知的负载均衡,优先选择同一区域中可用的服务器。

自定义Ribbon负载均衡策略有两种方式:

  1. 创建一个类实现IRule接口,这将定义全局的负载均衡策略。

  2. 在客户端配置文件中指定特定服务调用的负载均衡策略,这将仅对该服务生效。

sentinel

概念

Sentinel 是阿里巴巴开源的服务保护组件,在微服务架构中承担“流量防卫兵”的角色。它以流量为切入点,提供流量控制、熔断降级、系统负载保护等多种功能,保障服务的稳定性。

为什么需要 Sentinel?

在微服务调用链中,如果某个下游服务响应变慢或故障,调用方如果不做任何保护,线程会一直阻塞等待,最终导致调用方自身的资源被耗尽,进而引发雪崩效应,整个链路崩溃。Sentinel 的核心作用就是防止这种级联故障。

Sentinel 的核心功能

  • 流量控制(流控):限制某个接口的 QPS 或并发线程数,超过阈值直接拒绝请求,防止突发流量压垮服务。

    • 例如:秒杀场景下,限制“下单接口”每秒只能处理 1000 个请求,多余的请求直接返回“系统繁忙”。

    • 支持多种流控模式:直接、关联、链路。

    • 支持多种流控效果:快速失败、Warm Up(预热)、匀速排队。

  • 熔断降级:当某个依赖服务错误率过高或响应时间过长时,暂时切断对该服务的调用,快速返回降级响应,防止级联故障。

    • 熔断器有三种状态:关闭 → 打开 → 半开 → 关闭。

    • 熔断后经过一段“休眠时间”,会放行少量请求试探服务是否恢复(半开状态)。

    • 如果恢复则关闭熔断器,否则继续熔断。

  • 热点参数限流:针对带有特定参数的请求进行精细化流控。例如,对同一个商品 ID 的请求进行限流,防止单个热卖商品拖垮整个系统。

  • 系统自适应保护:从系统整体维度(Load、CPU 使用率、平均 RT、入口 QPS 等)进行保护,当系统负载过高时自动限流,防止系统崩溃。

  • 与 Nacos 集成:Sentinel 的流控、熔断规则可以持久化到 Nacos 配置中心,实现规则的动态配置和实时生效,无需重启服务。

Sentinel 与 Feign 的集成

Sentinel 可以与 Feign 无缝集成。在 @FeignClient 注解中指定 fallback 类,当远程调用失败或被熔断时,自动执行降级逻辑:

java

@FeignClient(value = "order-service", fallback = OrderClientFallback.class)
public interface OrderClient {
    @GetMapping("/order/{id}")
    Result getOrderById(@PathVariable("id") Long id);
}

与其他组件的协作

组件与 Sentinel 的协作关系
Nacos规则持久化到 Nacos,实现动态配置
FeignFeign 调用失败时触发 Sentinel 的降级逻辑
GatewaySentinel 可作为 Gateway 的过滤器,在网关层实现限流和熔断

Sentinel 是微服务高可用的最后一道防线,确保“即使部分服务不可用,整个系统依然能有限度地对外服务”,而不是全盘崩溃。

feign

概念

Feign 是 Netflix 开源的声明式 HTTP 客户端,Spring Cloud 对其进行了封装,让我们可以用编写接口的方式来实现微服务之间的远程调用,极大简化了代码。

它的工作流程是:

  • 定义一个 Java 接口,通过 @FeignClient 注解绑定远程服务名。

  • 接口中的方法通过 Spring MVC 注解(如 @GetMapping)声明请求路径和参数。

  • 调用该接口方法时,Feign 会动态生成代理对象,底层集成 Ribbon 实现负载均衡,根据服务名从 Nacos 中拉取实例列表,再发起 HTTP 请求。

使用 Feign 的好处是:

  • 代码可读性强,调用远程服务就像调用本地方法。

  • 自动集成负载均衡,无需手动拼接 URL。

  • 支持自定义配置,如请求超时、日志级别、编码器等。

gateway

概念

Spring Cloud Gateway 是整个微服务架构的统一入口,它基于 Spring WebFlux 构建,采用非阻塞 I/O,性能比传统的 Zuul 网关更高。

Gateway 的核心三要素:

  • 路由(Route):根据匹配规则将请求转发到对应的下游服务。

  • 断言(Predicate):定义匹配规则,如根据路径、请求参数、Header 等进行路由。

  • 过滤器(Filter):对请求或响应进行修改,如鉴权、日志、限流、跨域处理等。

在项目中,Gateway 的作用是:

  • 路由转发:前端请求不直接访问微服务,而是通过 Gateway 统一分发。

  • 安全鉴权:在网关层校验 JWT Token 或 Session,拒绝非法请求,保护后端服务。

  • 限流与熔断:可集成 Sentinel 或 Redis 做接口限流,防止流量洪峰打垮服务。

  • 跨域处理:统一解决前后端分离的跨域问题,避免在每个微服务中重复配置。

工作流程

  1. 路由判断:当用户发送请求到微服务架构时,网关接收到请求之后,现根据断言判断当前请求url是哪一个服务的。

  2. 请求过滤:然后会使用多个过滤器组成的过滤器链对请求进行拦截与修改,例如添加请求头、参数校验等操作。

  3. 服务处理:之后将请求发送给对应的后端服务进行处理

  4. 响应过滤:当服务处理完之后,将返回结果交给过滤器处理

  5. 响应返回:响应经过过滤处理后,返回给客户端

总结:客户端的请求先通过匹配规则找到合适的路由,就能映射到具体的服务。然后请求经过过滤器处理后转发给具体的服务,服务处理后,再次经过过滤器处理,最后返回给客户端。

更多推荐