Spring Webflux 使用R2DBC 连接MySql 初探

4,902 阅读3分钟

响应式编程指的是数据驱动的、异步和并发的编程范式。简而言之,异步数据流编程。对于数据流进行创建、组合、过滤、转换等操作,最终得到所需要的处理和结果。具有高性能,事件驱动,充分利用计算资源,更加优雅的异步编程体验,同时它也提供了背压机制来防止系统过载。典型的框架有 RxJavaReactor 等。

在很长一段时间 Java 的响应式只能同 MongoDB、Redis 等这些非关系型数据库进行交互。而目前我们大部分的数据还是存放在关系型数据库中,大部分情况下 Java 使用 JDBC 来操作关系型数据库,而 JDBC 是阻塞的、同步的。所以迫切需要一种支持响应式的数据库驱动协议。目前市面上有两种响应式数据库驱动协议 ADBA 和 R2DBC

R2BDC诞生是由于 Spring 官方在 Spring 5 发布了响应式 Web 框架 Spring WebFlux 之后急需能够满足异步响应的数据库交互 API 。 由于缺乏标准和驱动,Pivotal(Spring 官方) 团队开始研究反应式关系型数据库连接(Reactive Relational Database Connectivity),并提出了 R2DBC 规范 API 以评估可行性并讨论数据库厂商是否有兴趣支持反应式的异步非阻塞驱动程序。最开始只有 PostgreSQLH2MSSQL 三家,现在 MySQL 也加入了进来。R2DBC 最新版本是0.8.1.RELEASE。除了驱动实现外还提供了 R2DBC 连接池R2DBC 代理。除此之外还支持云原生应用。

Spring Boot 2.3.0.RELEASE之后,才正式支持基于 r2dbc 的 MySQL 驱动

创建一个Spring WebFlux使用R2DBC去操作MySQL也非常简单,前提是对WebFlux有初步的了解

导入相应依赖

  	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-r2dbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

        <dependency>
            <groupId>dev.miku</groupId>
            <artifactId>r2dbc-mysql</artifactId>
        </dependency>

配置文件配置连接地址

spring:
    r2dbc:
        password: admin
        url: r2dbcs:mysql://localhost:3306/test_db
        username: root

编码 -建立数据库关系映射do

@Data
@Table("mall_ad")
public class AdBean {

    @Id
    private Integer id;

    private String name;

    private String link;

    private String url;

    private String content;

    private LocalDateTime startTime;

    private LocalDateTime endTime;

    private Byte deleted;
}

编码-建立vo

@Data
@Builder
public class AdVo {

    private String name;

    private String link;

    private String url;

    private String content;
}

编码-建立数据库操作对象

public interface AdRepository extends ReactiveCrudRepository<AdBean,Integer> {

}

编码-建立service

@Service
public class AdServiceImpl implements AdService {


    @Autowired
    private AdRepository adRepository;

    /**
     * 查询现在的的广告
     *
     * @return
     */
    @Override
    public Flux<AdVo> findAll() {

	//这里对于stream操作需要有一定的了解
        return adRepository.findAll().map(
                adBean -> AdVo.builder()
                        .name(adBean.getName()).link(adBean.getLink())
                        .url(adBean.getUrl()).content(adBean.getContent())
                        .build()
        );
    }
}

编码-建立controller

@RestController
@RequestMapping("/api/ad")
public class AdController {

    @Autowired
    private AdService adService;

    @GetMapping("/findAll")
    public Flux<AdVo> findNowAd() {
        return adService.findAll();
    }
}

启动项目

1595255204549

测试api

// 20200720213921
// http://127.0.0.1:8080/api/ad/findAll/

[
  {
    "name": "合作 谁是你的菜",
    "link": "",
    "url": "http://yanxuan.nosdn.127.net/65091eebc48899298171c2eb6696fe27.jpg",
    "content": "合作 谁是你的菜"
  },
  {
    "name": "活动 美食节",
    "link": "",
    "url": "http://yanxuan.nosdn.127.net/bff2e49136fcef1fd829f5036e07f116.jpg",
    "content": "活动 美食节"
  },
  {
    "name": "活动 母亲节",
    "link": "",
    "url": "http://yanxuan.nosdn.127.net/8e50c65fda145e6dd1bf4fb7ee0fcecc.jpg",
    "content": "活动 母亲节5"
  }
]

完整项目地址 gitee.com/yichengxian…