学习笔记:微服务-24 spring boot WebFlux初探-响应式非阻塞web框架

响应式、非阻塞、事件驱动型web框架是另外一种编程模式和处理思维,相关概念及入门参见了如下几篇文章:

https://blog.csdn.net/Message_lx/article/details/81075766   Springboot2.0中webflux到底优秀在哪里

https://blog.csdn.net/get_set/article/details/79480233  Spring WebFlux快速上手——响应式Spring的道法术器

https://blog.csdn.net/yanchunling1981/article/details/84768985  Spring webflux--响应式、非阻塞、事件驱型web框架

以下就借鉴上面文章的例子体验一下

1.创建一个spring starter project,注意选 Reactive Web支持

其实就是会在pom.xml中加入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>

2. Reactive编程方法一:基于WebMVC注解的方式,增加类HelloController

@RestController
public class HelloController {
    @GetMapping("/hello")
    public Mono<String> hello() {   // 【改】返回类型为Mono<String>
        return Mono.just("Welcome to reactive world ~");     // 【改】使用Mono.just生成响应式数据
    }
}

3.Reactive编程方法二:WebFlux的函数式开发模式

(1)增加类定义

import static org.springframework.web.reactive.function.server.ServerResponse.ok;
@Component
public class TimeHandler {
    public Mono<ServerResponse> getTime(ServerRequest serverRequest) {
        return ok().contentType(MediaType.TEXT_PLAIN).body(Mono.just("Now is " + new SimpleDateFormat("HH:mm:ss").format(new Date())), String.class);
    }
    public Mono<ServerResponse> getDate(ServerRequest serverRequest) {
        return ok().contentType(MediaType.TEXT_PLAIN).body(Mono.just("Today is " + new SimpleDateFormat("yyyy-MM-dd").format(new Date())), String.class);
    }
    public Mono<ServerResponse> sendTimePerSec(ServerRequest serverRequest) { 
        return ok().contentType(MediaType.TEXT_EVENT_STREAM).body(  
                Flux.interval(Duration.ofSeconds(1)).   // 保持连接状态,每隔1秒发送一次时间
                        map(l -> new SimpleDateFormat("HH:mm:ss").format(new Date())), 
                String.class);
    }
}

(2)增加 RouterConfig类

@Configuration
public class RouterConfig {
    @Autowired
    private TimeHandler timeHandler;

    @Bean
    public RouterFunction<ServerResponse> timerRouter() {
        return route(GET("/time"), req -> timeHandler.getTime(req))
                .andRoute(GET("/date"), timeHandler::getDate)    // 这种方式相对于上一行更加简洁
                .andRoute(GET("/times"), timeHandler::sendTimePerSec);  // 增加这一行发送流数据,不断发送时间信息 
    }
}

4.测试

好吧,踏上了webflux编程第一个台阶...

猜你喜欢

转载自blog.csdn.net/oLinBSoft/article/details/86664598