日常使用的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; @Id 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的案例。
最后按照惯例,附上本案例的源码,登陆后即可下载。
还没有评论,来说两句吧...