spring ai 中常见代码解读 用 webFlux 做高并发的服务器(入门4)

无论是对接第三方平台要求我们的接口要做到高并发、还是自己要求的高并发平台,都有哪些解决方案 比如要求复杂业务逻辑的 200/每秒

常用方法:增加硬件资源

最合适的方法 还是要在代码质量上 怎么能保证做到高并发。

一:具体怎么做呢。那我们就看看 spring 的webFlux 功能,看看下面的代码 它为什么就能做到高并发

 // 获取所有用户(返回用户列表流)
 @GetMapping("/users")
 public Flux<User> getAllUsers() {
     return userRepository.findAll();
 }

二:webFlux 完整的例子

Spring WebFlux 通俗示例(以 User 为例)

用一个简单的“用户管理”场景,解释 Spring WebFlux 的核心用法,假设你有一个用户信息接口。


第一步:定义用户类(User)
public class User {
    private String id;
    private String name;
    private int age;

    // 省略构造方法、Getter/Setter
}

第二步:创建响应式 Repository(模拟数据)

这里用内存存储模拟数据库,实际开发中可用 MongoDB Reactive 等真正的响应式数据库。

@Repository
public class UserRepository {
    // 模拟一个用户列表
    private final List<User> users = Arrays.asList(
        new User("1", "张三", 25),
        new User("2", "李四", 30)
    );

    // 根据ID查找用户(返回 Mono)
    public Mono<User> findById(String id) {
        return Mono.justOrEmpty(
            users.stream()
                .filter(user -> user.getId().equals(id))
                .findFirst()
        );
    }

    // 查找所有用户(返回 Flux)
    public Flux<User> findAll() {
        return Flux.fromIterable(users);
    }

    // 添加用户(模拟保存)
    public Mono<User> save(User user) {
        users.add(user);
        return Mono.just(user);
    }
}

第三步:编写 WebFlux 控制器(注解驱动)

使用 @RestController@GetMapping,类似 Spring MVC,但返回的是 MonoFlux

@RestController
public class UserController {

    @Autowired
    private UserRepository userRepository;

    // 根据ID获取用户(返回单个用户)
    @GetMapping("/users/{id}")
    public Mono<User> getUserById(@PathVariable String id) {
        return userRepository.findById(id);
    }

    // 获取所有用户(返回用户列表流)
    @GetMapping("/users")
    public Flux<User> getAllUsers() {
        return userRepository.findAll();
    }

    // 添加用户(接收JSON请求体)
    @PostMapping("/users")
    public Mono<User> addUser(@RequestBody Mono<User> userMono) {
        return userMono.flatMap(user -> userRepository.save(user));
    }
}

关键点解释

  1. 为什么用 Mono 和 Flux?

    • Mono:表示“未来某个时刻返回 0 或 1 个结果”(比如查单个用户)。
    • Flux:表示“未来返回一串数据流”(比如查所有用户)。
    • 它们都是非阻塞的,不会让线程傻等结果。
  2. 和传统 Spring MVC 的区别?

    • 传统做法:每个请求占用一个线程,如果数据库查询慢,线程会被阻塞。
    • WebFlux 做法:线程不会阻塞,数据库准备好数据时自动通知,用少量线程处理更多请求。

举个实际场景

假设你的系统有 1 万个并发请求查询用户:

  • 传统 MVC:可能需要 1 万个线程,线程频繁切换,资源耗尽。
  • WebFlux:可能只需几十个线程轮询处理,数据库返回数据时才处理,省资源。

总结

  • WebFlux 适合:高并发、IO 密集操作(如大量数据库/网络请求)。
  • User 例子核心:用 MonoFlux 表示异步操作,接口写法类似 MVC,但底层是非阻塞的。
  • 简单理解:把同步的“等结果”变成异步的“结果好了再通知我”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值