Spring Cloud Gateway MVC 基于 Spring Boot 3.4 以 WAR 包形式部署于外部 Tomcat 实战

一、引言

随着微服务架构的广泛应用,Spring Cloud Gateway 作为网关层的核心组件,为服务间的通信与流量管理提供了强大支持。spring-cloud-starter-gateway-mvc 则进一步助力开发者以熟悉的 MVC 模式进行网关开发。同时,将项目以 WAR 包形式部署到外部 Tomcat 服务器,能够满足企业级应用对灵活部署和资源管理的需求。本文基于最新的 Spring Boot 3.4 版本,详细介绍如何实现这一实战过程,帮助开发者紧跟技术趋势,高效完成项目开发与部署。

二、项目依赖配置

2.1 创建项目与依赖引入

首先,创建一个新的 Spring Boot 项目,在创建过程中,务必选择 Spring Boot 3.4 版本。创建完成后,打开项目的 pom.xml 文件,进行依赖配置。

Spring Boot 3.4 对依赖管理进行了诸多优化和升级,我们先继承 Spring Boot 3.4 的父项目,引入其强大的自动配置和依赖管理能力:

xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.4.0</version>
</parent>

接着,添加 Spring Cloud 依赖管理,由于 Spring Boot 3.4 对 Spring Cloud 版本有一定的适配要求,这里我们选择合适的 Spring Cloud 版本进行依赖导入:

xml 复制代码
<dependencyManagement>
    <dependencies>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>2024.0.0</version>
        <type>pom</type>
        <scope>import</scope>
    </dependencies>
</dependencyManagement>

然后,添加核心依赖。spring-cloud-starter-gateway-mvc 是实现网关 MVC 风格开发的关键,spring-boot-starter-web 提供 Web 开发基础支持,同时,因为要以 WAR 包形式部署到外部 Tomcat,所以需要排除 Spring Boot 内置的 Tomcat 依赖:

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway-mvc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 排除内置的 Tomcat 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>

2.2 构建插件配置

为了将项目打包成 WAR 格式,还需要配置构建插件。spring-boot-maven-plugin 用于 Spring Boot 项目的构建,maven-war-plugin 则专门负责将项目打包为 WAR 包,配置如下:

xml 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.2</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

三、项目核心代码实现

3.1 Servlet 初始化类

在 Spring Boot 3.4 中,为了使项目能够在外部 Tomcat 上正确启动,依然需要创建一个继承自 SpringBootServletInitializer 的类。该类负责引导 Spring Boot 应用在 Tomcat 环境中启动,重写 configure 方法指定主应用程序类:

java 复制代码
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import com.example.gateway.GatewayApplication;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(GatewayApplication.class);
    }
}

3.2 主应用程序类

主应用程序类 GatewayApplication 是项目的入口,在 Spring Boot 3.4 中,依然使用 @SpringBootApplication 注解开启自动配置和组件扫描功能:

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

3.3 路由配置类

GatewayConfig 类中配置 Spring Cloud Gateway 的路由规则,Spring Boot 3.4 对路由配置的底层实现进行了优化,不过使用方式基本保持一致。通过 RouteLocatorBuilder 构建路由,例如将以 /example/ 开头的请求转发到 http://localhost:8081

java 复制代码
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
           .route("example_route", r -> r.path("/example/**")
                   .uri("http://localhost:8081"))
           .build();
    }
}

3.4 MVC 控制器类

ExampleController 类以 MVC 风格处理转发后的请求,在 Spring Boot 3.4 中,控制器的注解使用和功能实现没有太大变化。通过 @GetMapping 注解定义接口,例如 /message 接口返回特定字符串:

java 复制代码
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ExampleController {

    @GetMapping("/message")
    public String getMessage() {
        return "Hello from Example Controller!";
    }
}

四、项目打包与部署

4.1 项目打包

在项目根目录下,打开命令行工具,执行 mvn clean package 命令。Maven 会自动清理项目的旧构建结果,编译项目代码,运行测试(如果有测试代码),并最终将项目打包成 WAR 文件。生成的 WAR 文件会存放在项目的 target 目录下。

4.2 项目部署

target 目录下的 WAR 文件复制到外部 Tomcat 服务器的 webapps 目录中。启动 Tomcat 服务器,Tomcat 会自动解压 WAR 文件,并部署应用程序。在 Tomcat 的启动日志中,可以查看应用程序的部署进度和相关信息。

五、项目测试

Tomcat 启动成功后,使用浏览器或者 HTTP 客户端工具(如 Postman)发送 GET 请求进行测试。请求地址为 http://localhost:8080/your-context-path/example/message,其中 your-context-path 是 Tomcat 部署应用时的上下文路径(默认为项目名称)。如果项目配置和部署正确,将会收到 Hello from Example Controller! 的响应,表明项目已经成功运行在外部 Tomcat 服务器上。

六、总结

本文基于 Spring Boot 3.4 版本,详细介绍了使用 spring-cloud-starter-gateway-mvc 开发项目,并以 WAR 包形式部署到外部 Tomcat 服务器的全过程。Spring Boot 3.4 带来了性能优化、安全性增强等诸多新特性,结合 Spring Cloud Gateway 和 MVC 模式,能够帮助开发者构建出高效、灵活的微服务网关。通过这种部署方式,企业可以更好地管理应用资源,适应复杂多变的业务场景。在实际项目开发中,开发者可以根据具体需求进一步扩展路由规则,丰富控制器逻辑,充分发挥 Spring 生态的强大功能 。

相关推荐
Q_Q5110082851 小时前
python+django/flask的眼科患者随访管理系统 AI智能模型
spring boot·python·django·flask·node.js·php
韩立学长3 小时前
基于Springboot的旧时月历史论坛4099k6s9(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
Q_Q5110082853 小时前
python+django/flask的在线学习系统的设计与实现 积分兑换礼物
spring boot·python·django·flask·node.js·php
Q_Q5110082854 小时前
python+django/flask的车辆尾气检测排放系统-可视化大屏展示
spring boot·python·django·flask·node.js·php
汤姆yu5 小时前
基于SpringBoot的动漫周边商场系统的设计与开发
java·spring boot·后端
摇滚侠6 小时前
Spring Boot3零基础教程,响应式编程的模型,笔记109
java·spring boot·笔记
Q_Q19632884757 小时前
python+django/flask基于Echarts+Python的图书零售监测系统设计与实现(带大屏)
spring boot·python·django·flask·node.js·php
拾荒的小海螺7 小时前
JAVA:Spring Boot3 新特性解析的技术指南
java·开发语言·spring boot
L.EscaRC8 小时前
Spring Boot 自定义组件深度解析
java·spring boot·后端
BeingACoder10 小时前
【SAA】SpringAI Alibaba学习笔记(二):提示词Prompt
java·人工智能·spring boot·笔记·prompt·saa·springai