Spring Cloud Alibaba 深度实战:Nacos + Sentinel + Gateway 整合指南

简介: 本指南深入整合Spring Cloud Alibaba核心组件:Nacos实现服务注册与配置管理,Sentinel提供流量控制与熔断降级,Gateway构建统一API网关。涵盖环境搭建、动态配置、服务调用与监控,助你打造高可用微服务架构。(238字)

Spring Cloud Alibaba 深度实战:Nacos + Sentinel + Gateway 整合指南


在微服务架构日益成熟的今天,服务治理、流量控制与 API 网关构成了系统的核心支柱。Spring Cloud Alibaba 提供了一套行之有效的解决方案,本指南将带领您深度整合 Nacos、Sentinel 和 Gateway,构建一个功能完备的微服务体系。
image.png

参考资料

nacos
Sentinel
Gateway

环境准备与依赖配置

首先需要在项目中引入必要的依赖,以下是核心依赖配置:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2022.0.0.0</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

Nacos 服务注册与发现

Nacos 作为服务注册中心,负责服务的注册、发现和健康监测。以下是基础配置:

spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: dev
        group: DEFAULT_GROUP
      config:
        server-addr: localhost:8848
        file-extension: yaml
        prefix: application

服务提供者的示例代码:

@RestController
@RequestMapping("/users")
public class UserController {
   

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
   
        User user = userService.findById(id);
        return ResponseEntity.ok(user);
    }

    @GetMapping("/service-info")
    public String getServiceInfo() {
   
        return "当前服务:user-service,端口:" + environment.getProperty("local.server.port");
    }
}

Sentinel 流量控制与熔断降级

Sentinel 提供流量控制、熔断降级和系统保护能力。配置示例如下:

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719
      eager: true
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: ${
   spring.application.name}-sentinel
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow

定义资源保护规则:

@RestController
@RequestMapping("/orders")
public class OrderController {
   

    @SentinelResource(value = "createOrder", blockHandler = "createOrderBlockHandler")
    @PostMapping
    public ResponseEntity<Order> createOrder(@RequestBody OrderRequest request) {
   
        Order order = orderService.create(request);
        return ResponseEntity.ok(order);
    }

    public ResponseEntity<String> createOrderBlockHandler(OrderRequest request, BlockException ex) {
   
        return ResponseEntity.status(429).body("系统繁忙,请稍后重试");
    }

    @SentinelResource(value = "getOrderDetail", fallback = "getOrderDetailFallback")
    @GetMapping("/{orderId}")
    public ResponseEntity<OrderDetail> getOrderDetail(@PathVariable String orderId) {
   
        OrderDetail detail = orderService.getDetail(orderId);
        return ResponseEntity.ok(detail);
    }

    public ResponseEntity<OrderDetail> getOrderDetailFallback(String orderId, Throwable ex) {
   
        return ResponseEntity.ok(OrderDetail.defaultDetail());
    }
}

Gateway 网关路由与过滤

Spring Cloud Gateway 作为 API 网关,负责请求路由、过滤和限流:

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
            - name: Sentinel
              args:
                resource: user_service_route
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
          filters:
            - StripPrefix=1
            - AddRequestHeader=X-Request-From, gateway

自定义网关过滤器:

@Component
public class AuthFilter implements GlobalFilter, Ordered {
   

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
   
        ServerHttpRequest request = exchange.getRequest();
        String token = request.getHeaders().getFirst("Authorization");

        if (StringUtils.isEmpty(token)) {
   
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }

        if (!validateToken(token)) {
   
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.FORBIDDEN);
            return response.setComplete();
        }

        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
   
        return -1;
    }

    private boolean validateToken(String token) {
   
        return token.startsWith("Bearer ");
    }
}

整合配置与动态刷新

通过 Nacos Config 实现配置的动态管理:

在 Nacos 中创建 dataId: user-service.yaml

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/user_db
    username: root
    password: 123456
  redis:
    host: localhost
    port: 6379
management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info

配置刷新监听:

@RestController
@RefreshScope
public class ConfigController {
   

    @Value("${app.config.timeout:5000}")
    private Integer timeout;

    @GetMapping("/config/timeout")
    public Integer getTimeout() {
   
        return timeout;
    }
}

服务间调用与负载均衡

使用 OpenFeign 进行服务间调用:

@FeignClient(name = "user-service", path = "/users", configuration = FeignConfig.class)
public interface UserServiceClient {
   

    @GetMapping("/{id}")
    ResponseEntity<User> getUserById(@PathVariable("id") Long id);

    @PostMapping
    ResponseEntity<User> createUser(@RequestBody User user);
}

@Component
public class OrderService {
   

    @Autowired
    private UserServiceClient userServiceClient;

    public Order createOrder(OrderRequest request) {
   
        ResponseEntity<User> response = userServiceClient.getUserById(request.getUserId());
        if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
   
            User user = response.getBody();
            return buildOrder(user, request);
        }
        throw new RuntimeException("用户不存在");
    }
}

监控与仪表板

Sentinel 控制台配置规则:

[
  {
   
    "resource": "user_service_route",
    "count": 100,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0,
    "controlBehavior": 0
  },
  {
   
    "resource": "createOrder",
    "count": 50,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0,
    "controlBehavior": 0
  }
]

总结

通过以上完整的整合实践,我们构建了一个基于 Spring Cloud Alibaba 的微服务系统。Nacos 提供了服务注册发现和配置管理能力,Sentinel 保障了系统的稳定性和可靠性,Gateway 统一了 API 入口并提供了丰富的过滤器功能。这种架构模式能够很好地应对微服务架构中的各种挑战,为业务系统提供坚实的技术基础。

在实际生产环境中,还需要考虑更多的因素,如分布式事务、链路追踪、安全认证等,这些都可以在现有架构基础上进行扩展和完善。



关于作者



🌟 我是suxiaoxiang,一位热爱技术的开发者

💡 专注于Java生态和前沿技术分享

🚀 持续输出高质量技术内容



如果这篇文章对你有帮助,请支持一下:




👍 点赞


收藏


👀 关注



您的支持是我持续创作的动力!感谢每一位读者的关注与认可!


目录
相关文章
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
1120 62
|
27天前
|
消息中间件 缓存 NoSQL
Redis + Java 架构实战:从锁机制到消息队列的整合
本文深入解析Redis与Java的整合实践,涵盖分布式锁、消息队列、缓存策略、高性能数据结构及容错机制。结合电商场景,助力构建高并发、高可用的分布式系统。
104 8
|
27天前
|
存储 数据可视化 项目管理
Arya - 功能强大的在线 Markdown 编辑器
Arya(二丫)是一款基于Vue2与Vditor的开源在线Markdown编辑器,集流程图、甘特图、Echarts、PPT预览、五线谱等丰富功能于一体,支持多种编辑模式与一键导出PDF/图片,完美适配公众号等内容平台,3.3k+ GitHub stars,部署简单,体验优雅。
320 13
Arya - 功能强大的在线 Markdown 编辑器
|
27天前
|
设计模式 缓存 安全
无锁编程与原子操作:构建极致性能的高并发队列
本文深入探讨无锁编程与原子操作在高并发队列中的应用,通过CAS、环形缓冲、版本化引用等技术,实现高性能、低延迟的线程安全队列,显著提升系统吞吐量,适用于日志、网络通信等高并发场景。
112 10
|
6月前
|
Java API Nacos
|
Java Spring 开发者
Spring Boot 常用注解详解:让你的开发更高效
本文详细解析Spring Boot常用注解,涵盖配置、组件、依赖注入、Web请求、数据验证、事务管理等核心场景,结合实例帮助开发者高效掌握注解使用技巧,提升开发效率与代码质量。
587 0
|
26天前
|
Java 数据库 微服务
Java 学习路线可按「基础→进阶→实战→架构」四阶段推进
Java学习路线分四阶段:基础→进阶→实战→架构。涵盖语法、多线程、框架、微服务等核心内容,搭配项目实战与学习技巧,助你系统掌握Java开发技能,逐步成长为高级工程师。(238字)
178 4
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
消息中间件 Java 持续交付
Spring Cloud Alibaba 项目搭建步骤和注意事项
Spring Cloud Alibaba 项目搭建步骤和注意事项
2394 0
Spring Cloud Alibaba 项目搭建步骤和注意事项