引言
微服务架构已成为分布式系统开发的主流范式,但随之而来的服务治理、流量控制、统一入口等挑战也日益凸显。Spring Cloud Alibaba 作为国内主流的微服务解决方案,整合了 Nacos、Sentinel、Gateway 等核心组件,分别解决了服务注册发现/配置管理、流量防护、统一网关的核心问题。本文将深入浅出地讲解这三大组件的核心用法及整合实战,帮助具备 Spring Boot 基础的 Java 开发者快速掌握微服务架构的核心落地能力。


- 引言
- 目录
-
- 一、引言:微服务架构的挑战与组件定位
- 二、核心组件详解
-
- [2.1 Nacos:服务注册中心 + 配置中心](#2.1 Nacos:服务注册中心 + 配置中心)
-
- 前置准备
- [2.1.1 服务注册与发现](#2.1.1 服务注册与发现)
- [2.1.2 动态配置刷新](#2.1.2 动态配置刷新)
- [2.2 Sentinel:流量控制与服务防护](#2.2 Sentinel:流量控制与服务防护)
-
- 前置准备
- [2.2.1 @SentinelResource 注解使用示例](#2.2.1 @SentinelResource 注解使用示例)
- [2.2.2 规则配置方式](#2.2.2 规则配置方式)
- [2.3 Spring Cloud Gateway:统一网关](#2.3 Spring Cloud Gateway:统一网关)
-
- 前置准备
- [2.3.1 路由配置(集成 Nacos 服务发现)](#2.3.1 路由配置(集成 Nacos 服务发现))
- [2.3.2 过滤器使用示例(全局过滤器)](#2.3.2 过滤器使用示例(全局过滤器))
- 三、整合流程:三大组件协同工作
-
- [3.1 整体架构](#3.1 整体架构)
- [3.2 调用链流程图](#3.2 调用链流程图)
- 四、结语
- 总结
目录
一、引言:微服务架构的挑战与组件定位
在单体应用向微服务拆分后,开发者会面临一系列核心问题:
- 服务治理:大量微服务如何注册、发现、管理?配置如何统一维护并动态刷新?
- 流量防护:高并发场景下如何避免服务雪崩?如何对接口进行限流、熔断、降级?
- 统一入口:多个微服务如何对外提供统一的访问地址?如何实现路由转发、鉴权、限流等共性能力?

Spring Cloud Alibaba 生态中,这三大组件各司其职:
- Nacos:一站式服务注册中心与配置中心,替代 Eureka + Config,支持服务的动态注册发现和配置的热更新;
- Sentinel:分布式流量防卫兵,提供限流、熔断、降级、热点防护等能力,保障服务稳定性;
- Spring Cloud Gateway:基于 WebFlux 的新一代网关,替代 Zuul,实现路由转发、过滤器链、跨域等网关核心能力。

二、核心组件详解
2.1 Nacos:服务注册中心 + 配置中心
Nacos 核心提供两大功能:服务注册发现(Service Registry)和配置中心(Config Center),无需额外部署多个组件,极大降低了运维成本。
前置准备
- 下载并启动 Nacos 服务(官方下载地址);
- 项目中引入 Nacos 依赖(以 Spring Cloud Alibaba 2022.0.0.0 为例):
xml
<!-- Nacos 服务注册发现依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Nacos 配置中心依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.1.1 服务注册与发现
步骤1:配置 bootstrap.yml(核心,优先级高于 application.yml)
yaml
spring:
application:
name: service-demo # 服务名称,作为注册到 Nacos 的服务标识
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos 服务地址
config:
server-addr: 127.0.0.1:8848 # Nacos 配置中心地址
file-extension: yml # 配置文件格式
profiles:
active: dev # 激活的环境
步骤2:启动类开启服务发现
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient // 开启 Nacos 服务注册发现
public class ServiceDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceDemoApplication.class, args);
}
}
步骤3:服务调用示例(基于 RestTemplate + LoadBalancer)
java
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
// 开启负载均衡,支持通过服务名调用
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class DemoController {
@Autowired
private RestTemplate restTemplate;
// 调用注册在 Nacos 上的 service-provider 服务的 /hello 接口
@GetMapping("/call-provider")
public String callProvider() {
// 直接使用服务名替代 IP:端口,由 Nacos 自动解析
return restTemplate.getForObject("http://service-provider/hello", String.class);
}
}
2.1.2 动态配置刷新
Nacos 支持配置的动态刷新,无需重启服务即可更新配置。
步骤1:Nacos 控制台添加配置
- 配置集 ID:
service-demo-dev.yml(规则: s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{spring.profiles.active}.${file-extension}); - 配置内容:
yaml
demo:
message: "Hello Nacos Config"
步骤2:代码中读取并自动刷新配置
java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
// 开启配置刷新注解
@RefreshScope
@RestController
public class ConfigController {
// 读取 Nacos 中的配置
@Value("${demo.message:默认值}")
private String message;
@GetMapping("/config")
public String getConfig() {
return "配置内容:" + message;
}
}
修改 Nacos 控制台的 demo.message 值后,访问 /config 接口可直接获取最新值,无需重启服务。
2.2 Sentinel:流量控制与服务防护
Sentinel 以"流量"为切入点,解决微服务中的限流、熔断、降级等问题,支持代码注解、控制台配置两种规则管理方式。
前置准备
- 引入 Sentinel 依赖:
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- Sentinel 控制台依赖(可选,用于可视化配置) -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
- 配置 application.yml:
yaml
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080 # Sentinel 控制台地址
port: 8719 # 与控制台通信的端口
- 下载并启动 Sentinel 控制台(官方下载地址)。
2.2.1 @SentinelResource 注解使用示例
该注解用于标记需要被 Sentinel 保护的资源,支持自定义限流、降级处理逻辑。
java
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SentinelController {
// 标记资源名为 hello-sentinel,自定义限流处理方法
@SentinelResource(value = "hello-sentinel",
blockHandler = "handleBlock", // 限流/熔断时的处理方法
fallback = "handleFallback") // 业务异常时的降级方法
@GetMapping("/hello-sentinel")
public String helloSentinel() {
// 模拟业务逻辑
return "Hello Sentinel!";
}
// 限流/熔断处理方法(参数需与原方法一致,最后加 BlockException)
public String handleBlock(BlockException e) {
return "请求过于频繁,请稍后再试!错误信息:" + e.getMessage();
}
// 降级处理方法(参数需与原方法一致,最后可加 Throwable)
public String handleFallback(Throwable e) {
return "服务降级,原因为:" + e.getMessage();
}
}
2.2.2 规则配置方式
方式1:代码配置(硬编码)
java
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class SentinelRuleConfig {
// 项目启动时初始化限流规则
@Bean
public ApplicationRunner sentinelRuleRunner() {
return args -> {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("hello-sentinel"); // 关联的资源名
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 限流维度:QPS
rule.setCount(5); // 阈值:每秒最多5次请求
rules.add(rule);
FlowRuleManager.loadRules(rules); // 加载规则
};
}
}
方式2:控制台配置(推荐)
- 启动服务后,访问 Sentinel 控制台(默认端口 8080,账号/密码:sentinel/sentinel);
- 在"簇点链路"中找到
hello-sentinel资源; - 点击"流控"按钮,配置 QPS 阈值、限流模式等,配置后实时生效,无需重启服务。
2.3 Spring Cloud Gateway:统一网关
Spring Cloud Gateway 是基于 WebFlux 的非阻塞网关,核心能力包括路由转发、过滤器链、服务发现集成,是微服务的统一入口。
前置准备
- 引入 Gateway 依赖:
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 集成 Nacos 服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Gateway 集成 Sentinel(可选,网关层限流) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
2.3.1 路由配置(集成 Nacos 服务发现)
yaml
spring:
application:
name: gateway-demo # 网关服务名
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 集成 Nacos 服务发现
gateway:
discovery:
locator:
enabled: true # 开启通过服务名自动路由
lower-case-service-id: true # 服务名小写
routes:
# 自定义路由规则1:路由到 service-demo 服务
- id: service-demo-route
uri: lb://service-demo # lb 表示负载均衡,service-demo 是 Nacos 中的服务名
predicates:
- Path=/demo/** # 匹配路径
filters:
- StripPrefix=1 # 去掉路径前缀(/demo/hello → /hello)
- AddResponseHeader=X-Request-Id, 123456 # 添加响应头
# 自定义路由规则2:路由到 service-provider 服务
- id: service-provider-route
uri: lb://service-provider
predicates:
- Path=/provider/**
filters:
- StripPrefix=1
2.3.2 过滤器使用示例(全局过滤器)
全局过滤器对所有路由生效,可用于鉴权、日志、跨域等共性逻辑:
java
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Configuration
public class GatewayFilterConfig {
// 自定义全局过滤器
@Bean
public GlobalFilter customGlobalFilter() {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
String path = request.getPath().toString();
System.out.println("网关全局过滤器:请求路径 = " + path);
// 执行后续过滤器链
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
System.out.println("响应完成:状态码 = " + exchange.getResponse().getStatusCode());
}));
};
}
// 设置过滤器优先级(值越小优先级越高)
@Bean
public Ordered customFilterOrder() {
return () -> Ordered.HIGHEST_PRECEDENCE + 100;
}
}
三、整合流程:三大组件协同工作
3.1 整体架构
三大组件的协同架构如下:
- 服务启动顺序:Nacos → Sentinel 控制台 → 各微服务(service-demo、service-provider) → Gateway 网关;
- 请求流转路径 :
- 客户端请求先到达 Gateway 网关;
- Gateway 通过 Nacos 服务发现获取后端微服务的地址,转发请求;
- 微服务接口被 Sentinel 保护,执行限流/熔断/降级规则;
- 微服务之间的调用通过 Nacos 服务发现实现,配置通过 Nacos 动态刷新。
3.2 调用链流程图
路由转发
服务发现
返回服务B地址
调用
配置刷新
配置刷新
客户端
Spring Cloud Gateway
服务A(Sentinel 保护)
Nacos 注册中心
服务B(注册于 Nacos)
动态配置
限流/熔断规则
四、结语
Nacos、Sentinel、Gateway 作为 Spring Cloud Alibaba 生态的核心组件,分别从"服务治理/配置管理""流量防护""统一入口"三个维度解决了微服务架构的核心痛点:
- Nacos 简化了服务注册发现和配置管理的复杂度,动态配置刷新提升了系统可维护性;
- Sentinel 为服务提供了全方位的流量防护能力,保障了系统在高并发下的弹性和稳定性;
- Gateway 作为统一网关,集中管理路由和过滤器,降低了客户端与微服务的耦合度。
生产环境最佳实践
- Nacos:部署集群模式,开启配置持久化,配置命名空间隔离不同环境;
- Sentinel:规则持久化到 Nacos,避免重启后规则丢失,结合监控平台告警;
- Gateway:部署多实例,结合 Nginx 做负载均衡,网关层增加 Sentinel 限流,避免网关成为瓶颈。
掌握这三大组件的整合使用,能够快速构建稳定、可扩展、易维护的微服务系统,是 Java 开发者从单体开发转向微服务开发的核心技能。
总结
- Nacos 核心是服务注册发现+动态配置中心,通过
bootstrap.yml配置接入,@RefreshScope实现配置热更新; - Sentinel 基于
@SentinelResource注解保护资源,支持代码/控制台两种规则配置方式,核心解决限流、熔断、降级问题; - Gateway 作为统一网关,通过路由配置集成 Nacos 服务发现,过滤器链实现共性能力,是微服务的统一入口。
✨ 坚持用 清晰易懂的图解 + 代码语言, 让每个知识点都 简单直观 !
🚀 个人主页 :不呆头 · CSDN
🌱 代码仓库 :不呆头 · Gitee
📌 专栏系列 :
💬 座右铭 : "不患无位,患所以立。"
