美文网首页
WebFlux 整合 Mongodb 构建Reactive Re

WebFlux 整合 Mongodb 构建Reactive Re

作者: Aska小强 | 来源:发表于2020-03-06 09:11 被阅读0次

    WebFlux 整合 Mongodb 构建Reactive Restful 服务

    本篇主要讲解如何使用WebFlux 整合 Reactive Mongodb 构建一套完整的 Reactive Restful服务,实现CRUD功能,涉及如何创建项目以及MongoDB的安装等等。

     1.创建项目

     使用Idea创建项目,勾选Spring Reactive Web 和 SpringData Reactive MongoDB

    Xnip20200301_105949.png Xnip20200301_110116.png

     pom.xml文件如下

        <!--引入 Webflux -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
    
        <!--引入SpringBoot 响应式MongoDB 依赖-->
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
        </dependency>
    

     2.安装MongoDB 和 运行

      2.1 下载 MongoDB

      MongoDB下载地址

    Xnip20200301_111022.png

      2.2 解压到/usr/local下

    Xnip20200301_111244.png

      2.3 配置环境变量

      打开终端,输入“open -e .bash_profile”,在打开的文件中加入

    Xnip20200301_111334.png

      2.4 创建/data/db 目录

        sudo mkdir -p /data/db
    

      2.5 启动MongoDB

        cd /usr/local/mongodb/bin/
    

      执行运行命令

        sudo ./mongod
    
    Xnip20200301_112359.png

      2.6 客户端连接MongoDB

      执行命令

        ./mongo
    

      得到如下 表示 mongodb可以正常使用


    Xnip20200301_112558.png

     3.整合WebFlux + MongoDB

      3.1 配置application.yml

      配置mongodb连接地址

    spring:
      data:
       mongodb:
        host: 127.0.0.1
        database: test
        port: 27017
    #打印Mongodb语句
    logging:
      level:
       org:
        springframework:
          data:
            mongodb:
              core: DEBUG
    server:
      port: 9001
    

      3.2 编写实体User

    /**
    * User mongo实体
    *
    * @author johnny
    * @create 2020-02-29 下午9:26
    **/
    @Data
    @Document(collection = "user") //对应mongodb的表名
    public class User {
    
      /**
       * 定义ID mongodb中id 一般都是字符串类型
       */
      @Id
      private String id;
    
      private String name;
    
      private int age;
    }
    

      3.3 编写User的Reactive Repository

      所有响应式的Repository前面都有 Reactive做为前缀

    /**
    * User 对应 Mongo的repository
    *
    * @author johnny
    * @create 2020-02-29 下午9:38
    **/
    @Repository
    public interface UserRepository extends ReactiveMongoRepository<User, String> {
    
    
    }
    

      3.4 编写 UserController

      WebFlux依然可以按照SpringMVC模式来编写

    /**
    * UserController测试 reactive Mongodb crud
    *
    * @author johnny
    * @create 2020-02-29 下午9:40
    **/
    @RestController
    @RequestMapping("/user")
    public class UserController  {
    
    
    /**
     * 推荐构造器方式注入
     */
    private final UserRepository userRepository;
    
    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    }
    

     4.编写基于Reactive Restful 服务CRUD接口

      4.1 新增User

    /**
     * http://localhost:9001/user/
     * 新增用户
     * @param user
     * @return
     */
    @PostMapping("/")
    public Mono<User> addUser(@RequestBody User user){
        //根据实际情况设置id 是否为Null
        user.setId(null);
        return userRepository.save(user);
    }
    

    请求:

    Xnip20200301_114055.png
    响应:
    Xnip20200301_114155.png

      4.2 根据ID查询User

      map就是把 Mono<User> 转成 Mono<ResponseEntity<User>> 不需要操作内部的User对象

      defaultIfEmpty 表示如果没找到用户则返回 404

    /**
     * 根据ID查询User 查不到返回404
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Mono<ResponseEntity<User>> findUserById(@PathVariable("id") String id){
    
        return userRepository.findById(id)
                .map(u -> new ResponseEntity<User>(u , HttpStatus.OK))
                .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }
    

    请求:

    http://localhost:9001/user/5e5a743e6039607eba6f3e98
    

    响应:

    {
        "id": "5e5a743e6039607eba6f3e98",
        "name": "lucy",
        "age": 50
    }
    

    请求:不存在的id

    http://localhost:9001/user/5e5a743e6039607eba6f3e9811111
    

    响应404

    Xnip20200301_114839.png

      4.3 查询所有User数据 返回Flux

    /**
     * 查询所有数据 一次返回
     * @return
     */
    @GetMapping("/")
    public Flux<User> findAll(){
        return userRepository.findAll();
    }
    

    请求:

    http://localhost:9001/user/
    

    相应:

    [
    {
        "id": "5e5a6bbd514391729bcbf930",
        "name": "johnny",
        "age": 23
    },
    {
        "id": "5e5a743e6039607eba6f3e98",
        "name": "lucy",
        "age": 50
    }
    ]
    

      4.4 查询所有User数据 以SSE形式返回

    /**
     * 查询 所有数据 按照SSE形式返回
     * @return
     */
    @GetMapping(value = "/stream/all" , produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<User> streamFindAll(){
        return userRepository.findAll()
                .delayElements(Duration.ofSeconds(1));
    }
    

    请求:

    http://localhost:9001/user/stream/all
    

    相应: 逐一返回并且相隔一秒,服务器推送给浏览器

    data:{"id":"5e5a6bbd514391729bcbf930","name":"johnny","age":23}
    
    data:{"id":"5e5a743e6039607eba6f3e98","name":"lucy","age":50}
    

      4.5 更新User用户 根据ID

    /**
     * flagMap 返回Mono
     * map 返回 Mono<u> - > Mono<r> 就是将Mono内部的数据转换成其他数据
     * @param user
     * @return
     */
    @PutMapping("/")
    public Mono<ResponseEntity<User>> updateUser(@RequestBody User user){
        return userRepository.findById(user.getId())
                .flatMap(u -> {
                    u.setAge(user.getAge());
                    u.setName(user.getName());
                    return this.userRepository.save(u);
                })
                .map(u -> new ResponseEntity<>(u , HttpStatus.OK))
                .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }
    

    请求:Put方式

    http://localhost:9001/user/
    

    请求参数:

    {
        "id": "5e5a743e6039607eba6f3e98",
        "name": "lucy",
        "age": 90
    }
    

    响应:

    {
    "id": "5e5a743e6039607eba6f3e98",
    "name": "lucy",
    "age": 90
    }
    

      4.6 删除用户 根据ID

    /**
     * 删除 用户根据ID
     * 存在用户则删除 返回200
     * 不存在用户 返回404
     * @param id: id
     * @return : Mono<ResponseEntity<Void>>
     */
    @DeleteMapping("/{id}")
    public Mono<ResponseEntity<Void>> deleteUserById(@PathVariable String id){
    
        return userRepository.findById(id)
                //flatMap 是要操作数据的时候用
                .flatMap(u -> userRepository.deleteById(id))
                .then(Mono.just(new ResponseEntity<Void>(HttpStatus.OK)))
                .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }
    

    请求 DELETE方式

    http://localhost:9001/user/5e5a743e6039607eba6f3e98
    

    至此 WebFlux 整合 Mongodb 构建Reactive Restful 服务全部结束

    5.总结

    本篇主要讲解如何使用WebFlux 整合 Reactive Mongodb 构建一套完整的 Reactive Restful服务,实现CRUD功能,涉及如何创建项目以及MongoDB的安装等等。

    个人博客网站 https://www.askajohnny.com 欢迎来访问!
    本文由博客一文多发平台 OpenWrite 发布!

    相关文章

      网友评论

          本文标题:WebFlux 整合 Mongodb 构建Reactive Re

          本文链接:https://www.haomeiwen.com/subject/xkqvrhtx.html