Web Reactive
LCGYL Framework 提供了响应式 Web 开发支持,适用于高并发场景。
概述
lcgyl-web-reactive 插件基于响应式编程模型,利用 Java 21 的 Virtual Threads 提供高性能的非阻塞 Web 服务。
添加依赖
gradle
dependencies {
implementation 'com.lcgyl:lcgyl-web-reactive:2.2.0'
}与传统 Web 插件对比
| 特性 | web-plugin | web-reactive |
|---|---|---|
| 编程模型 | 命令式 | 响应式 |
| 阻塞 | 是 | 否 |
| 并发模型 | 线程池 | Virtual Threads |
| 适用场景 | 一般应用 | 高并发 |
| 学习成本 | 低 | 中 |
快速开始
创建响应式控制器
java
@Controller
@RequestMapping("/api/users")
public class UserController {
@Inject
private UserService userService;
@GetMapping
public Flux<User> list() {
return userService.findAll();
}
@GetMapping("/{id}")
public Mono<User> get(@PathVariable Long id) {
return userService.findById(id);
}
@PostMapping
public Mono<User> create(@RequestBody Mono<User> user) {
return user.flatMap(userService::save);
}
}响应式服务
java
@Service
public class UserService {
@Inject
private UserRepository userRepository;
public Flux<User> findAll() {
return Flux.fromIterable(userRepository.findAll());
}
public Mono<User> findById(Long id) {
return Mono.justOrEmpty(userRepository.findById(id));
}
public Mono<User> save(User user) {
return Mono.just(userRepository.save(user));
}
}配置
yaml
lcgyl:
web:
reactive:
enabled: true
server:
port: 8080
threads: 0 # 0 = 使用 Virtual Threads流式响应
Server-Sent Events (SSE)
java
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> stream() {
return Flux.interval(Duration.ofSeconds(1))
.map(seq -> ServerSentEvent.<String>builder()
.id(String.valueOf(seq))
.event("message")
.data("Event " + seq)
.build());
}WebSocket
java
@Component
public class ChatWebSocketHandler implements WebSocketHandler {
@Override
public Mono<Void> handle(WebSocketSession session) {
return session.receive()
.map(WebSocketMessage::getPayloadAsText)
.map(msg -> "Echo: " + msg)
.map(session::textMessage)
.as(session::send);
}
}错误处理
java
@ControllerAdvice
public class GlobalErrorHandler {
@ExceptionHandler(NotFoundException.class)
public Mono<ResponseEntity<ErrorResponse>> handleNotFound(NotFoundException e) {
return Mono.just(ResponseEntity.status(404)
.body(new ErrorResponse(404, e.getMessage())));
}
}最佳实践
- 避免阻塞操作 - 所有 I/O 操作应使用响应式 API
- 合理设置背压 - 防止生产者速度超过消费者
- 使用 Virtual Threads - 利用 Java 21 的轻量级线程
- 监控延迟 - 响应式应用更需要关注延迟指标