微服务组件讲解
对于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负载均衡策略有两种方式:
-
创建一个类实现IRule接口,这将定义全局的负载均衡策略。
-
在客户端配置文件中指定特定服务调用的负载均衡策略,这将仅对该服务生效。
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,实现动态配置 |
| Feign | Feign 调用失败时触发 Sentinel 的降级逻辑 |
| Gateway | Sentinel 可作为 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 做接口限流,防止流量洪峰打垮服务。
-
跨域处理:统一解决前后端分离的跨域问题,避免在每个微服务中重复配置。
工作流程
-
路由判断:当用户发送请求到微服务架构时,网关接收到请求之后,现根据断言判断当前请求url是哪一个服务的。
-
请求过滤:然后会使用多个过滤器组成的过滤器链对请求进行拦截与修改,例如添加请求头、参数校验等操作。
-
服务处理:之后将请求发送给对应的后端服务进行处理
-
响应过滤:当服务处理完之后,将返回结果交给过滤器处理
-
响应返回:响应经过过滤处理后,返回给客户端
总结:客户端的请求先通过匹配规则找到合适的路由,就能映射到具体的服务。然后请求经过过滤器处理后转发给具体的服务,服务处理后,再次经过过滤器处理,最后返回给客户端。
更多推荐

所有评论(0)