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生态和前沿技术分享

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



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




👍 点赞


收藏


👀 关注



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


目录
相关文章
|
SpringCloudAlibaba Java API
SpringCloudAliBaba篇之gateway:手把手教你搭建服务网关(下)
SpringCloudAliBaba篇之gateway:手把手教你搭建服务网关(下)
835 0
|
数据可视化 Java Nacos
OpenFeign + Sentinel 实现微服务熔断限流实战
本文介绍如何在Spring Cloud微服务架构中,结合OpenFeign与阿里巴巴开源组件Sentinel,实现服务调用的熔断、降级与限流。通过实战步骤搭建user-service与order-service,集成Nacos注册中心与Sentinel Dashboard,演示服务异常熔断、QPS限流控制,并支持自定义限流响应。借助Fallback降级机制与可视化规则配置,提升系统稳定性与高可用性,助力构建健壮的分布式应用。
623 155
|
SpringCloudAlibaba 监控 算法
SpringCloud Alibaba系列(三) Sentinel流控
  流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
420 0
SpringCloud Alibaba系列(三) Sentinel流控
|
2月前
|
消息中间件 缓存 NoSQL
Redis + Java 架构实战:从锁机制到消息队列的整合
本文深入解析Redis与Java的整合实践,涵盖分布式锁、消息队列、缓存策略、高性能数据结构及容错机制。结合电商场景,助力构建高并发、高可用的分布式系统。
189 8
|
7月前
|
Java API Nacos
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
2720 13
Spring Cloud Alibaba:一站式微服务解决方案
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
31840 0
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
消息中间件 Java 持续交付
Spring Cloud Alibaba 项目搭建步骤和注意事项
Spring Cloud Alibaba 项目搭建步骤和注意事项
Spring Cloud Alibaba 项目搭建步骤和注意事项