Spring Cloud 微服务实战:Nacos+Sentinel+Gateway 核心组件详解

引言

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



目录

一、引言:微服务架构的挑战与组件定位

在单体应用向微服务拆分后,开发者会面临一系列核心问题:

  • 服务治理:大量微服务如何注册、发现、管理?配置如何统一维护并动态刷新?
  • 流量防护:高并发场景下如何避免服务雪崩?如何对接口进行限流、熔断、降级?
  • 统一入口:多个微服务如何对外提供统一的访问地址?如何实现路由转发、鉴权、限流等共性能力?

Spring Cloud Alibaba 生态中,这三大组件各司其职:

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

二、核心组件详解

2.1 Nacos:服务注册中心 + 配置中心

Nacos 核心提供两大功能:服务注册发现(Service Registry)和配置中心(Config Center),无需额外部署多个组件,极大降低了运维成本。

前置准备
  1. 下载并启动 Nacos 服务(官方下载地址);
  2. 项目中引入 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 以"流量"为切入点,解决微服务中的限流、熔断、降级等问题,支持代码注解、控制台配置两种规则管理方式。

前置准备
  1. 引入 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>
  1. 配置 application.yml:
yaml 复制代码
spring:
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080 # Sentinel 控制台地址
        port: 8719 # 与控制台通信的端口
  1. 下载并启动 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:控制台配置(推荐)
  1. 启动服务后,访问 Sentinel 控制台(默认端口 8080,账号/密码:sentinel/sentinel);
  2. 在"簇点链路"中找到 hello-sentinel 资源;
  3. 点击"流控"按钮,配置 QPS 阈值、限流模式等,配置后实时生效,无需重启服务。

2.3 Spring Cloud Gateway:统一网关

Spring Cloud Gateway 是基于 WebFlux 的非阻塞网关,核心能力包括路由转发、过滤器链、服务发现集成,是微服务的统一入口。

前置准备
  1. 引入 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 整体架构

三大组件的协同架构如下:

  1. 服务启动顺序:Nacos → Sentinel 控制台 → 各微服务(service-demo、service-provider) → Gateway 网关;
  2. 请求流转路径
    • 客户端请求先到达 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 作为统一网关,集中管理路由和过滤器,降低了客户端与微服务的耦合度。

生产环境最佳实践

  1. Nacos:部署集群模式,开启配置持久化,配置命名空间隔离不同环境;
  2. Sentinel:规则持久化到 Nacos,避免重启后规则丢失,结合监控平台告警;
  3. Gateway:部署多实例,结合 Nginx 做负载均衡,网关层增加 Sentinel 限流,避免网关成为瓶颈。

掌握这三大组件的整合使用,能够快速构建稳定、可扩展、易维护的微服务系统,是 Java 开发者从单体开发转向微服务开发的核心技能。


总结

  1. Nacos 核心是服务注册发现+动态配置中心,通过 bootstrap.yml 配置接入,@RefreshScope 实现配置热更新;
  2. Sentinel 基于 @SentinelResource 注解保护资源,支持代码/控制台两种规则配置方式,核心解决限流、熔断、降级问题;
  3. Gateway 作为统一网关,通过路由配置集成 Nacos 服务发现,过滤器链实现共性能力,是微服务的统一入口。

✨ 坚持用 清晰易懂的图解 + 代码语言, 让每个知识点都 简单直观 !

🚀 个人主页不呆头 · CSDN

🌱 代码仓库不呆头 · Gitee

📌 专栏系列

💬 座右铭 : "不患无位,患所以立。"

相关推荐
鸽鸽程序猿2 小时前
【JavaEE】【SpringCloud】服务注册_Eureka
spring cloud·eureka·java-ee
鸽鸽程序猿4 小时前
【JavaEE】【SpringCloud】环境与工程搭建
java·spring cloud·java-ee
Roye_ack1 天前
【微服务 Day2】SpringCloud实战开发(微服务拆分步骤 + Nacos注册中心 + OpenFeign + 微服务拆分作业)
java·spring cloud·微服务·nacos·openfeign
杀死那个蝈坦1 天前
短链接生成-基于布隆过滤器和唯一索引
java·数据库·微服务·oracle·rocketmq
YDS8291 天前
SpringCloud —— 分布式事务管理Seata详解
分布式·spring·spring cloud·seata
叫我阿柒啊2 天前
从Java全栈到前端框架:一场真实的技术面试对话
java·vue.js·spring boot·微服务·typescript·前端开发·后端开发
好奇的菜鸟2 天前
Docker 一键启动:打造高效的 Java 微服务开发环境
java·docker·微服务
请告诉他2 天前
【实战经验】Dell Inspiron 7560 升级 BIOS 支持 DDR4-2666 内存,解决 Spring Cloud 多模块开发内存瓶颈
后端·spring·spring cloud