SpringBoot 2.0 响应式编程

栏目: Java · 发布时间: 5年前

内容简介:SpringBoot 2.0 已经发布多时,一直不知道它有什么用,只是知道它有个webflux。今天就来学习一下,看一下是否有必要升级到新版本?如果你是使用得STS来创建项目的话将会很简单,直接选择web flux模块就好。SpringBoot选择最新稳定的2.1.4.RELEASE。

SpringBoot 2.0 已经发布多时,一直不知道它有什么用,只是知道它有个webflux。今天就来学习一下,看一下是否有必要升级到新版本?

1 2.0与1.0版本的区别?

SpringBoot 2.0 响应式编程

  • 我们可以看出来,增加了些新的特性,主要是对响应式编程的支持,底层多了Netty,这样就可以进行非阻塞io的编程,这也是响应式编程的基础。
  • 还有就是2.0对应的 java 版本必须最低java8,支持java9.如果你们公司使用的还是1.6,1.7那就不适合升级版本,可能会带来一堆麻烦。
  • 使用webflux并不会提高应用的响应速度,官网也明确指出了。所以不要跟风去使用2.0的版本。
  • 使用webflux可以在有限的资源下提高系统的吞吐量和伸缩性。

2 搭建简单的webflux项目

如果你是使用得STS来创建项目的话将会很简单,直接选择web flux模块就好。SpringBoot选择最新稳定的2.1.4.RELEASE。

完整pom文件:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.mike</groupId>
    <artifactId>flux</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mike-flux</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.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-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

创建启动类:(使用STS会自动创建)

package com.mike;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MikeFluxApplication {

    public static void main(String[] args) {
        SpringApplication.run(MikeFluxApplication.class, args);
    }

}

3 编写路由和处理类

有过前端工作经验的小伙伴,对路由肯定不陌生,Vue react中都有统一的路有管理。现在SpringBoot也可以这样来写了。后端的小伙伴可以把它理解为你之前写的controller。

先定义一个处理类:

package com.mike.handler;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;

import reactor.core.publisher.Mono;

/**
 * The class HelloHandler
 * 
 */
@Component
public class HelloHandler {
    
    public Mono<ServerResponse> sayHello(ServerRequest req) {
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8)
                .body(BodyInserters.fromObject(req.queryParam("name").get()));
    }
}

Mono 定义返回单个结果,定义了响应数据类型以及数据。我是从请求参数中取得 name 参数进行返回。

有了处理类,我们就需要定义什么样的路由交给它来处理,要将路有何处理程序进行mapping:

package com.mike.router;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;

import com.mike.handler.HelloHandler;

/**
 * The class HelloRouter
 * 
 */
@Configuration
public class HelloRouter {
    
    @Bean
    public RouterFunction<ServerResponse> hello(HelloHandler handle){
        return RouterFunctions.route(RequestPredicates.GET("/hello")
                .and(RequestPredicates.accept(MediaType.APPLICATION_JSON_UTF8))
                ,handle::sayHello);
    }
}

我们定义了 /hello 的请求交给我们的处理类去处理,这样一次完整的请求就搞定了。启动程序,访问 http://localhost :8080/hello?name=mike 就可以看到页面上的结果了。

4 总结

  • 和1.0的版本相比,我们编写的程序返回结果将由 MonoFlux 来包裹。
  • 你可以选择使用路由的方式来编写代码,而不用写 controller
  • 异步响应,有时会带来想不到的麻烦,断点调试不再有用。

修改 HelloHandler

public Mono<ServerResponse> sayHello(ServerRequest req) {
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8)
                .syncBody(BodyInserters.fromObject(req.queryParam("name").get()));
    }

访问 http://localhost :8080/hello?name=mike 你会发现你获取不到 name 的值,这就是异步编程带来的问题,相信许多前端的小伙伴很熟悉这样的问题。

  • 使用webflux 需要根据你自己的项目实际情况来抉择。如果你的项目中没有调用别人的api,就没必要使用webflux,用处不大,就像我上面搭建的项目。 如果需要请求别人的api,引入webflux,将会对超时,容错,失败重试有很好的改进,使得你的项目更完善,用户体验更好。

关于webflux如果你有更深的理解,希望可以回复一起交流。

如果想要学习更多知识,可以关注下我的公众号:

SpringBoot 2.0 响应式编程


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cyberwar

Cyberwar

Kathleen Hall Jamieson / Oxford University Press / 2018-10-3 / USD 16.96

The question of how Donald Trump won the 2016 election looms over his presidency. In particular, were the 78,000 voters who gave him an Electoral College victory affected by the Russian trolls and hac......一起来看看 《Cyberwar》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具