sprinWebFlux是spring5.0推出的新型框架,主要想替代传统的springMvc模式,把命令式编程变成异步式编程。
- 优势对比mvc
1.高并发下响应速度比较快,可以应对高并发
2.异步式调用,大大的提升了速度
3.针对java8,可以利用stream流和lambda写代码,代码更加简洁高效
- 劣势对比
1.开发成本变大,debug费劲
2.网上资源比较少,需要集成特殊的jar包
还是看公司的业务需求吧,我们公司有一个服务,调用策略下发,因为业务有点复杂,需要调用第三方厂家的api,就没有用mq,就创建了一个webFlux项目框架,废话不多少,我们从头创建项目
- 项目用到的资源:mongodb,mysql,springboot,springwebFlux,redis,jwt
- 1.创建springboot项目,勾选webFlux选项,pom.xml如下
<?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.qiyi</groupId>
<artifactId>policy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>policy</name>
<description>PolicyEquipment</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</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>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.qiyi.gcyfb.PolicyApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- 2.创建拦截器,你们可以加入token验证
public class MyFilter implements HandlerFilterFunction {
@Override
public Mono filter(ServerRequest request, HandlerFunction handlerFunction) {
return handlerFunction.handle(request);
}
}
- 3.创建handle,处理层
@Component
public class LzxHandler {
public Mono<ServerResponse> hello(ServerRequest request){
return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).body(BodyInserters.fromObject("Hello,world"));
}
public Mono<ServerResponse> helloTwo(ServerRequest request){
return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).body(BodyInserters.fromObject("Please enjoy WebFlux"));
}
}
- 4.创建Router层,跟mvc一样的逻辑
@Configuration
public class DemoRouter {
@Bean
public RouterFunction<ServerResponse> routeHello(LzxHandler lzxHandler) {
return RouterFunctions
.route(RequestPredicates.GET("/hello")
.and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), lzxHandler::hello)
.andRoute(RequestPredicates.GET("/"),lzxHandler::helloTwo);//用andRoute可以继续对url路径进行拦截
}
}