日常使用的springboot框架进行项目的开发,我们知道springboot默认是使用tomcat来驱动的,也就是使用传统的servlet结构。在我们最开始学习java web开发的时候我们就知道,serverlet是阻塞的,因此对于它来说,能支撑的并发量并不大。那么如果我们的项目不适用rpc的话,有没有什么办法改进呢?
办法其实有的,在spring framwork5开始引入了响应式的编程,这里的响应式编程就是我们今天介绍的webFlux。对于传统的servlet结构整个程序的响应方式是这样的:
如果使用webflux的话,那么我们整个流程就是如下的形式:
可以看到webflux使用的是netty来接收请求,而且netty是非阻塞式的,因此它的并发量会更大一些。
本文接下来我们使用案例的方式演示下webFlux的案例。
一、创建maven项目,并且引入以下依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.webflux.demo</groupId>
<artifactId>WebFluxDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>WebFluxDemo</name>
<description>测试在springboot上使用webflux</description>
<properties>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>3.0.2</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>0.8.2.RELEASE</version>
</dependency>
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-pool</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.webflux.demo.WebFluxDemoApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
二、编写配置文件
这里由于webflux框架是一个响应式编程,因此这里我们引入了r2dbc这个响应式数据库工具来进行演示,具体配置如下:
server:
port: 30000
spring:
r2dbc:
url: r2dbc:mysql://192.168.31.217:33306/test2?allowPublicKeyRetrieval=true&ssl=false
username: root
password: 123456
pool:
enabled: true
initial-size: 10
max-size: 10
三、编写主类入口
这里的主类入口除了我们常用的@SpringBootApplication注解之外,我们还要引入@EnableWebFlux这个依赖,代表的就是启用webflux框架,剩下其他的代码都是一样的,示例如下:
package com.webflux.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.reactive.config.EnableWebFlux;
@EnableWebFlux
@SpringBootApplication
public class WebFluxDemoApplication {
public static void main(String[] args) {
SpringApplication.run(WebFluxDemoApplication.class, args);
}
四、编写dao查询
这里我们使用r2dbc框架,所以这里就需要继承R2dbcRepository这个类,完整的dao代码示例如下:
package com.webflux.demo.dao;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import com.webflux.demo.model.UserPoJo;
@Repository
public interface UserDao extends R2dbcRepository<UserPoJo, String>{
}
五、编写controller
这里的controller和其他的controller没有区别,只是返回的地方必须带有Mono<$MODEL>这样的形式,示例代码如下:
package com.webflux.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.webflux.demo.model.UserPoJo;
import com.webflux.demo.service.UserService;
import reactor.core.publisher.Mono;
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/getUserById")
public Mono<UserPoJo> getUserById(Long userId){
return userService.findUserById(userId);
}
六、编写service
这里的service比较简单,主要是调用dao层,示例代码如下:
package com.webflux.demo.dao;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import org.springframework.stereotype.Repository;
import com.webflux.demo.model.UserPoJo;
@Repository
public interface UserDao extends R2dbcRepository<UserPoJo, String>{
}
七、最后附上model
这里我们有使用user这个model,我们贴上user这个类,示例代码如下:
package com.webflux.demo.model;
import java.io.Serializable;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@ToString
@Builder
@Table("users")
public class UserPoJo implements Serializable {
private static final long serialVersionUID = -6683509609017038377L;
private Integer id;
private String email;
private String first;
private String last;
private String city;
private String county;
private int age;
}
最后我们把项目启动起来,示例图如下:
这里我们可以看到启动的是使用netty,并且数据库框架也是使用的r2dbc,然后我们请求看看效果:
同时相应速度也是很快的,如下图:
以上就是我们在springboot上使用webflux的案例。
最后按照惯例,附上本案例的源码,登陆后即可下载。