出于某些原因,服务器数据库需要迁移至 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,@PostConstruct
从 javax.annotation
移动到了 jakarta.annotation
。
这在 Hibernate
高版本中也是一样的,其注解早已放在 jakarta
包下。
改名相关:
- https://eclipse-foundation.blog/2018/02/26/and-the-name-is/
- 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
先开个坑吧,回补。