首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从0到1搭建Spring Boot 开发脚手架之集成网关

从0到1搭建Spring Boot 开发脚手架之集成网关

作者头像
紫风
发布2025-10-14 18:11:32
发布2025-10-14 18:11:32
1620
举报

接下来细化集成Spring Cloud Gateway的步骤,特别是配置路由规则和添加全局过滤器验证JWT Token。现在需要一个更详细的操作指导,方便更容易入手。希望能给大家带来帮助。

集成 Spring Cloud Gateway 网关(详细步骤)

目标:通过网关统一入口,实现动态路由和JWT鉴权。

1. 创建网关服务模块

新建Spring Boot模块

  • 使用 Spring Initializr 创建新模块 gateway-service
  • 依赖选择
    • Spring Cloud Gateway
    • Spring Boot Actuator
    • Lombok
    • Spring Cloud Loadbalancer

调整父工程结构(若为多模块项目):

代码语言:javascript
复制
<!-- 父工程 pom.xml -->
<modules>
    <module>gateway-service</module>
    <module>user-service</module> <!-- 示例业务服务 -->
</modules>

2. 配置基础路由规则

添加网关配置application.yml):

代码语言:javascript
复制
server:
  port: 8888  # 网关端口

spring:
  cloud:
    gateway:
      routes:
        - id: user-service  # 路由ID(唯一)
          uri: http://localhost:8081  # 目标服务地址(示例用户服务端口8081)
          predicates:
            - Path=/api/user/**  # 匹配路径规则
          filters:
            - StripPrefix=1  # 移除前缀(/api/user/xxx → /xxx)

启动业务服务(示例)

创建一个 user-service 模块,监听端口 8081,并添加一个测试接口:

代码语言:javascript
复制
@RestController
public class UserController {
    @GetMapping("/info")
    public String info() {
        return "User Service Response";
    }
}

测试路由功能

  • 启动网关 (gateway-service:8888) 和用户服务 (user-service:8081)。
  • 访问 http://localhost:8888/api/user/info → 应返回 User Service Response

3. 实现JWT全局鉴权过滤器

添加JWT依赖(网关模块的 pom.xml):

代码语言:javascript
复制
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.5</version>
</dependency>
<!-- 其他jjwt依赖同上一步骤 -->
代码语言:javascript
复制

创建全局过滤器类

代码语言:javascript
复制
@Component
public class JwtAuthFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getPath().toString();
        
        // 放行登录接口和其他公开路径
        if (path.contains("/auth/login") || path.contains("/public")) {
            return chain.filter(exchange);
        }

        // 获取Token
        String token = request.getHeaders().getFirst("Authorization");
        if (token == null || !token.startsWith("Bearer ")) {
            return unauthorizedResponse(exchange, "Missing Token");
        }
        token = token.replace("Bearer ", "");

        try {
            String username = JwtUtils.parseToken(token); // 复用之前步骤的JWT工具类
            // 将用户信息传递到下游服务(可选)
            exchange.getRequest().mutate()
                .header("X-User-Name", username)
                .build();
        } catch (Exception e) {
            return unauthorizedResponse(exchange, "Invalid Token");
        }
        return chain.filter(exchange);
    }

    private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) {
        ServerHttpResponse response = exchange.getResponse();
        response.setStatusCode(HttpStatus.UNAUTHORIZED);
        response.getHeaders().add("Content-Type", "application/json");
        String body = "{\"code\": 401, \"message\": \"" + msg + "\"}";
        DataBuffer buffer = response.bufferFactory().wrap(body.getBytes());
        return response.writeWith(Mono.just(buffer));
    }

    @Override
    public int getOrder() {
        return 0; // 过滤器执行顺序(值越小优先级越高)
    }
}

确保 JwtUtils 密钥一致

  • 将之前步骤的 JwtUtils 类复制到网关模块,或封装为公共依赖。

4. 验证网关鉴权功能

测试未携带Token的请求

访问 http://localhost:8888/api/user/info → 返回 401 错误:

代码语言:javascript
复制
{ "code": 401, "message": "Missing Token" }

测试携带合法Token的请求

  • 通过登录接口获取Token(参考步骤3)。
  • 在请求头添加 Authorization: Bearer <your_token>
  • 访问 http://localhost:8888/api/user/info → 返回用户服务响应。

5. 动态路由(可选)

集成Nacos配置中心(以Nacos为例):

添加依赖:

代码语言:javascript
复制
<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-nacos-discovery</artifactId>
</dependency>

配置 bootstrap.yml

代码语言:javascript
复制
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml

在Nacos控制台配置动态路由规则。


6. 关键注意事项

跨域处理

代码语言:javascript
复制
spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods: "*"
            allowedHeaders: "*"

生产环境建议

  • 使用服务发现(如Nacos)替代硬编码URI。
  • 将JWT密钥存储在配置中心或KMS。
  • 网关层添加限流(如Redis限流)。

通过以上步骤,网关已实现 路由转发 和 JWT鉴权,后续可扩展其他功能(如限流、日志)。

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注。 后续将继续把后续步骤继续完善,有什么遗漏、或者对什么功能有缺失的可以评论区,指出来,共同成长共同进步。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 集成 Spring Cloud Gateway 网关(详细步骤)
    • 目标:通过网关统一入口,实现动态路由和JWT鉴权。
    • 1. 创建网关服务模块
    • 2. 配置基础路由规则
    • 3. 实现JWT全局鉴权过滤器
    • 4. 验证网关鉴权功能
    • 5. 动态路由(可选)
    • 6. 关键注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档