优秀的编程知识分享平台

网站首页 > 技术文章 正文

SpringBoot 2 webflux 牛刀小试(springboot2 websocket)

nanyue 2024-08-20 17:33:17 技术文章 4 ℃

?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

Tags:

最近发表
标签列表