tio-boot 和 spring-boot-starter-webflux 整合

本文档提供了如何将 tio-boot-server 集成到使用 spring-boot-starter-webflux 的项目中。默认情况下,Spring WebFlux 使用 Netty 作为网络处理层。本文档将引导你如何将 tio-boot-server 作为替代品整合到你的 Spring WebFlux 应用中。

pom.xml 配置:

  1. Java 和 Spring Boot 版本:

    • 设定了 Java 1.8 版本。
    • 设定了 Spring Boot 的版本为 2.5.6。
  2. 依赖项配置:

    • 移除了默认的 spring-boot-starter-jsonspring-boot-starter-reactor-netty 依赖,因为我们打算使用 tio-boot。
    • 添加了 tio-boot 作为项目依赖,以及其他相关依赖。
  3. 插件配置:

    • 配置了 spring-boot-maven-plugin 以支持项目构建和运行。
<properties>
    <java.version>1.8</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.5.6</spring-boot.version>
    <main.class>demo.SpringWebFluxTioBootApp</main.class>
    <tio-boot.version>1.6.2</tio-boot.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-json</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-reactor-netty</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>com.litongjava</groupId>
      <artifactId>tio-boot</artifactId>
      <version>${tio-boot.version}</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.litongjava</groupId>
      <artifactId>hotswap-classloader</artifactId>
      <version>1.2.1</version>
    </dependency>

    <!-- SpringBoot集成Test -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>


    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <!-- Spring Boot -->
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>${spring-boot.version}</version>
        <configuration>
          <includeSystemScope>true</includeSystemScope>
          <!--使该插件支持热启动 -->
          <fork>true</fork>
          <mainClass>${main.class}</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

启动类配置:

接下来是 Spring Boot 应用的启动类 SpringWebFluxTioBootApp

  1. 注解配置:
    • @SpringBootApplication 标识这是一个 Spring Boot 应用。
    • @Import({TioBootServerAutoConfiguration.class}) 导入了 tio-boot 的自动配置,这是整合 tio-boot 的关键。
    • @AComponentScan 用于 tio-boot 组件扫描。
package demo;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;

import com.litongjava.hotswap.wrapper.spring.boot.SpringApplicationWrapper;
import com.litongjava.jfinal.aop.annotation.AComponentScan;
import com.litongjava.tio.boot.spring.SpringBootArgs;
import com.litongjava.tio.boot.spring.TioBootServerAutoConfiguration;

@SpringBootApplication
@Import({TioBootServerAutoConfiguration.class})
@AComponentScan
public class SpringWebFluxTioBootApp {

  public static void main(String[] args) {
    long start = System.currentTimeMillis();
    SpringBootArgs.set(SpringWebFluxTioBootApp.class, args);
    SpringApplicationWrapper.run(SpringWebFluxTioBootApp.class, args);
    long end = System.currentTimeMillis();
    System.out.println(end - start + "(ms)");

  }
}

Controller 编写:

定义了一个基本的 HelloWordWebFluxController 控制器,用于处理根路径("/")上的请求。

  1. @RequestPath 注解:

    • 类级别的 @RequestPath("/") 指定这个控制器处理的基本路径。
    • 方法级别的 @RequestPath(没有指定路径)默认处理根路径上的请求。
  2. 业务方法:

    • index 方法简单地返回字符串 "index"。
package demo.controller;

import com.litongjava.tio.http.server.annotation.RequestPath;

@RequestPath("/")
public class HelloWordWebFluxController {

  @RequestPath
  public String index() {
    return "index";
  }
}

测试应用:

完成上述配置后,可以启动应用并访问 http://localhost/ 来测试是否成功集成了 tio-boot-server。

通过这种方式,你可以将 tio-boot-server 与 Spring WebFlux 结合使用,利用 tio-boot 提供的高性能网络处理能力,同时享受 Spring WebFlux 的响应式编程模型和丰富的开发特性。