无论是对接第三方平台要求我们的接口要做到高并发、还是自己要求的高并发平台,都有哪些解决方案 比如要求复杂业务逻辑的 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,但返回的是 Mono
或 Flux
。
@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));
}
}
关键点解释
-
为什么用 Mono 和 Flux?
Mono
:表示“未来某个时刻返回 0 或 1 个结果”(比如查单个用户)。Flux
:表示“未来返回一串数据流”(比如查所有用户)。- 它们都是非阻塞的,不会让线程傻等结果。
-
和传统 Spring MVC 的区别?
- 传统做法:每个请求占用一个线程,如果数据库查询慢,线程会被阻塞。
- WebFlux 做法:线程不会阻塞,数据库准备好数据时自动通知,用少量线程处理更多请求。
举个实际场景
假设你的系统有 1 万个并发请求查询用户:
- 传统 MVC:可能需要 1 万个线程,线程频繁切换,资源耗尽。
- WebFlux:可能只需几十个线程轮询处理,数据库返回数据时才处理,省资源。
总结
- WebFlux 适合:高并发、IO 密集操作(如大量数据库/网络请求)。
- User 例子核心:用
Mono
和Flux
表示异步操作,接口写法类似 MVC,但底层是非阻塞的。 - 简单理解:把同步的“等结果”变成异步的“结果好了再通知我”。