Skip to content

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-pluginweb-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())));
    }
}

最佳实践

  1. 避免阻塞操作 - 所有 I/O 操作应使用响应式 API
  2. 合理设置背压 - 防止生产者速度超过消费者
  3. 使用 Virtual Threads - 利用 Java 21 的轻量级线程
  4. 监控延迟 - 响应式应用更需要关注延迟指标

下一步

Released under the Apache License 2.0