Allin Program

记 Find Somebody Backend 升级

出于某些原因,服务器数据库需要迁移至 PostgreSQL,顺带把Find Somebody Backend也进行技术升级了。

大部分技术栈变动如下:

过去 现在
Maven Gradle
Java 11 Java 17
Spring Boot 2 Spring Boot 3
Spring MVC Spring WebFlux
MySQL PostgreSQL

Maven -> Gradle

这还是挺顺利的,Android开发七八年纯学会安装 Gradle 了。

Java 11 -> Java 17

常见语法都兼容,也没啥问题。

Spring Boot 2 -> Spring Boot 3

这还真遇到点问题了,需要上网检索。

找不到 @PostConstruct

Spring Boot 3 迁移到 Jakarta EE 9,@PostConstructjavax.annotation 移动到了 jakarta.annotation

这在 Hibernate 高版本中也是一样的,其注解早已放在 jakarta 包下。

改名相关:

  1. https://eclipse-foundation.blog/2018/02/26/and-the-name-is/
  2. https://www.eclipse.org/ee4j/faq.php

Spring MVC -> Spring WebFlux

此前对 Spring WebFlux 仅限于 WebClient 的使用,本次有了更多的接触。

弃用 HttpServletRequest

若平时使用 HttpServletRequest获取请求头信息,而不是 @RequestHeader 。那么区别于 Spring MVC,现在得这么写:

public static String getClientIpAddress(ServerWebExchange exchange) {
    ServerHttpRequest request = exchange.getRequest();
  
    // 先检查 X-Forwarded-For 头
    String xForwardedFor = request.getHeaders().getFirst("X-Forwarded-For");
    if (xForwardedFor != null && !xForwardedFor.isEmpty()) {
        return xForwardedFor.split(",")[0];
    }

    // 再检查 X-Real-IP 头
    String xRealIp = request.getHeaders().getFirst("X-Real-IP");
    if (xRealIp != null && !xRealIp.isEmpty()) {
        return xRealIp;
    }

    // 否则直接获取远程地址
    return request.getRemoteAddress() != null
        ? request.getRemoteAddress().getAddress().getHostAddress()
        : "Unknown";
}

如果用不到响应信息或者上下文,也可以使用 ServerHttpRequest

HTTP接口返回 Mono<T>

WebFlux 是基于 Reactor 库构建的,支持异步和非阻塞的 I/O 操作。如果直接返回 String,WebFlux 无法知道这个操作是同步还是异步的。返回 Mono<String> 让 WebFlux 知道这是一个异步操作,能够在请求完成时再返回结果。

@GetMapping("/get-token")
public Mono<String> getToken(ServerHttpRequest request) {
    return Mono.just("token");
}

WebFlux 的目标是处理高并发请求,传统的阻塞模型无法充分利用 CPU 资源。而返回 Mono<T> 可以让请求处理异步化,避免线程等待 I/O 操作完成,提高性能。

在 WebFlux 中,最好遵循响应式编程的模式,返回 Mono<T>Flux<T>,以便 WebFlux 框架能够管理异步请求和响应。

MySQL -> PostgreSQL

先开个坑吧,回补。