添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

日常使用的springboot框架进行项目的开发,我们知道springboot默认是使用tomcat来驱动的,也就是使用传统的servlet结构。在我们最开始学习java web开发的时候我们就知道,serverlet是阻塞的,因此对于它来说,能支撑的并发量并不大。那么如果我们的项目不适用rpc的话,有没有什么办法改进呢?

办法其实有的,在spring framwork5开始引入了响应式的编程,这里的响应式编程就是我们今天介绍的webFlux。对于传统的servlet结构整个程序的响应方式是这样的:

b2c682715deee528857a1c8824a1ddf0.png

如果使用webflux的话,那么我们整个流程就是如下的形式:

d6201185c8e13500eee990b9fe6d99a1.png


可以看到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;
}

最后我们把项目启动起来,示例图如下:

image.png

这里我们可以看到启动的是使用netty,并且数据库框架也是使用的r2dbc,然后我们请求看看效果:

image.png

同时相应速度也是很快的,如下图:

image.png


以上就是我们在springboot上使用webflux的案例。


最后按照惯例,附上本案例的源码,登陆后即可下载。

本站用户 免费查看
    最新公告

    架构师学习大本营

    分享分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算。我们也欢迎大家分享经验

    如果你需要面试复习的话,可以进入 面试刷题 模块进行刷题

    如果有问题需要他人协助解决,可以进入 问答社区 板块提问或者回答

    今日已经过去 小时
    这周已经过去
    本月已经过去
    今年已经过去 个月
换一换

目录[+]