?spring webflux介绍
Spring WebFlux 是一个异步非阻塞式的 Web 框架, 可以运行在支持 Servlet 3.1 非阻塞IO的Servlet 容器上,或者其他异步运行环境,如 Netty、Undertow。它可以充分利用多核 CPU 资源去处理大量的并发请求,非常适合低延迟、高吞吐量的应用场景。
简单的说就四点:异步非阻塞、 响应式(reactive)函数编程、不再限制于Servlet容器、 响应式(reactive)访问处理数据。废话有点多了,言归正传,今天我们将测试下在spring boot 2.x下测试webflux实现一个简单的Demo来实现Mysql数据库的访问并返回JSON数据。
框架搭建
我们使用idea搭建一个初步的框架,新建工程->Spring Initializr,输入groupId、artifactId等信息后,在依赖界面我们勾选Spring Reactive Web、Spring Data R2DBC,点击下一步直到工程建立完毕。(Postgres,Microsoft SQL Server,MySQL,H2和Google Spanner)都有R2DBC驱动,很遗憾Mysql暂时还没有,本示例中我们采用第三方的r2dbc-mysql(dev.miku)。
POM文件依赖项目配置如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<!-- r2dbc 连接池 -->
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-pool</artifactId>
</dependency>
<!--r2dbc mysql 库-->
<dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
代码编写
首先我们在spring boot配置文件内增加R2DBC数据库的相关配置
spring.r2dbc.url= r2dbcs:mysql://127.0.0.1:3306/iot
spring.r2dbc.username=root
spring.r2dbc.password=123456
定义数据库访问接口,继承ReactiveCrudRepository,在接口内我们可以通@Modifying @Query等注解自定义自己需要的方法
public interface SysUserRepository extends ReactiveCrudRepository<SysUser,String> {
}
实现业务层相关方法,返回单个指定的用户和所有用户列表数据
@Service
public class SysUserServiceImpl implements SysUserService {
@Autowired
private SysUserSortingRepository sysUserSortingRepository;
@Override
public Mono<SysUser> findUserById(String userId) {
return sysUserSortingRepository.findById(userId);
}
@Override
public Flux<SysUser> findAll() {
return sysUserSortingRepository.findAll();
}
}
定义控制层,暴露接口展示相关数据
@RestController
@RequestMapping("/user")
public class SysUserController {
@Autowired
private SysUserService sysUserService;
/**
* 返回指定用户
* @param id 用户id
* @return Mono<SysUser>
*/
@GetMapping("/{id}")
public Mono<SysUser> findUserById(@PathVariable String id) {
return sysUserService.findUserById(id);
}
/**
* 返回所有用户
* @return Flux<SysUser>
*/
@GetMapping("/all")
public Flux<SysUser> findUserById() {
return sysUserService.findAll();
}
}
我们启动服务,看下运行效果,我们可以看到服务运行在Netty内,不再是默认的tomact
我们看到端口默认为8080,我们访问下控制器内定义的/user/all,/user/id 均成功返回了JSON
本文相关示例完整代码详见:
github.com/mingyunet/webfluxDemo