# 情绪博物馆后端重构升级技术方案
## 1. 升级概述
### 1.1 升级目标
基于现有的Spring Boot 2.7.18单体架构,升级到Spring Boot 3.4.8版本,采用最新的技术栈和最佳实践,提升系统性能、安全性和可维护性。
### 1.2 升级原则
- **向后兼容**: 保持现有API接口和业务逻辑不变
- **渐进升级**: 分阶段进行升级,确保系统稳定性
- **性能优先**: 充分利用Spring Boot 3.x的性能优化
- **安全增强**: 采用最新的安全特性和最佳实践
## 2. 技术栈升级方案
### 2.1 核心框架升级
#### 2.1.1 Spring Boot 3.4.8
```xml
org.springframework.boot
spring-boot-starter-parent
3.4.8
21
21
21
```
#### 2.1.2 核心依赖升级
```xml
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
org.springframework.boot
spring-boot-starter-websocket
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-webflux
org.springframework.boot
spring-boot-starter-web
com.mysql
mysql-connector-j
runtime
com.baomidou
mybatis-plus-boot-starter
3.5.5
io.jsonwebtoken
jjwt-api
0.12.3
io.jsonwebtoken
jjwt-impl
0.12.3
runtime
io.jsonwebtoken
jjwt-jackson
0.12.3
runtime
org.springdoc
springdoc-openapi-starter-webmvc-ui
2.3.0
org.apache.commons
commons-lang3
cn.hutool
hutool-all
5.8.25
```
### 2.2 安全框架升级
#### 2.2.1 Spring Security 6.x配置
```java
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(authz -> authz
.requestMatchers("/auth/**", "/health/**", "/actuator/**", "/ws/**", "/ai/guest/**").permitAll()
.requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll()
.anyRequest().authenticated()
)
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(12);
}
}
```
#### 2.2.2 JWT升级到0.12.3
```java
@Component
public class JwtUtil {
private final SecretKey secretKey;
private final JwtParser jwtParser;
public JwtUtil(@Value("${emotion.jwt.secret}") String secret) {
this.secretKey = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
this.jwtParser = Jwts.parser()
.verifyWith(secretKey)
.build();
}
public String generateToken(String userId, String username) {
return Jwts.builder()
.subject(userId)
.claim("username", username)
.issuedAt(new Date())
.expiration(new Date(System.currentTimeMillis() + 86400000))
.signWith(secretKey)
.compact();
}
}
```
### 2.3 异步处理优化
#### 2.3.1 异步配置升级
```java
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(20);
executor.setMaxPoolSize(100);
executor.setQueueCapacity(500);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("emotion-async-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Bean("aiTaskExecutor")
public Executor aiTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(50);
executor.setQueueCapacity(200);
executor.setThreadNamePrefix("ai-task-");
executor.initialize();
return executor;
}
}
```
### 2.4 HTTP客户端配置
#### 2.4.1 WebClient配置
```java
@Configuration
public class WebClientConfig {
@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder()
.codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(10 * 1024 * 1024))
.filter(ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
log.debug("Request: {} {}", clientRequest.method(), clientRequest.url());
return Mono.just(clientRequest);
}))
.filter(ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
log.debug("Response: {}", clientResponse.statusCode());
return Mono.just(clientResponse);
}));
}
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
// 设置超时时间
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(30000);
factory.setReadTimeout(30000);
restTemplate.setRequestFactory(factory);
// 添加请求拦截器
restTemplate.getInterceptors().add(new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
log.debug("Request: {} {}", request.getMethod(), request.getURI());
ClientHttpResponse response = execution.execute(request, body);
log.debug("Response: {}", response.getStatusCode());
return response;
}
});
return restTemplate;
}
}
```
### 2.5 缓存优化
#### 2.5.1 Redis配置升级
```java
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer