随笔 - 230  文章 - 0 评论 - 0 阅读 - 88579
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

webflux:
反应式编程reactor的产物,采用发布订阅模式,引入netty的nio,比较适合IO密集型应用。
因普遍应用使用的DB链接是IO阻塞型,因此在一般应用中无法体现它的优势。redis和mongoDB支持reactor。

前言: Flux && Mono

Flux: 可返回1到n个结果,
Mono: 仅返回0到1个结果

MAVEN 依赖:

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

注意: spring-boot-starter-webflux 和 spring-boot-starter-webmvc 会冲突,因此如果有webmvc请排除掉。

启动引入

@SpringBootApplication
@EnableWebFlux
public class TestWebfluxApp {
    SpringApplication.run(TestWebfluxApp.class, args);
}

controller方式使用

@Slf4j
@RequestMapping("/webflux")
@RestController
public class TestWebFluxController {
    

    /**
     * Mono
     * @param user
     * @return
     */
    @RequestMapping("/user/new")
    public Mono<String> user(@RequestBody User user){
        System.out.println("user:" +user);
        WebClient webClient = WebClient.create("http://127.0.0.1:8089");
        Mono<ClientResponse> exchange = webClient.get().uri("/algo/yumc/get?test=junitTest1234&sk={0}", "123456").exchange();
        System.out.println("user2: ---------------------");
        Mono<String> mono = Mono.just("1234567");
        return exchange.block(Duration.ofSeconds(1)).bodyToMono(String.class);
    }

    /**
     * Flux
     * @return
     */
    @RequestMapping("/user/list")
    public Flux<String> user(){
        WebClient webClient = WebClient.create("http://127.0.0.1:8089");
        Mono<ClientResponse> exchange = webClient.get().uri("/algo/yumc/get?test=junitTest1234&sk={0}", "123456").exchange();
        System.out.println("user2: ---------------------");
        Flux<String> stringFlux = Flux.just("1234","5678");
        return exchange.block(Duration.ofSeconds(1)).bodyToFlux(String.class);
    }

endpoint方式使用

@Configuration
public class WebfluxConfiguration {

    @Autowired
    private UserHandler userHandler;

    @Bean
    @Qualifier("userRouter")
    public RouterFunction<ServerResponse> userRouter(){
        return RouterFunctions.nest(RequestPredicates.path("/flux/user"),
                RouterFunctions.route(RequestPredicates.GET("/info"),  UserHandler::getUserInfo)
                                .andRoute(RequestPredicates.GET("/list"), UserHandler::getUserList));
    }
	
	
	@Component
public class UserHandler {

    /**
     * request
     * @param serverRequest
     * @return
     */
    public static Mono<ServerResponse> getUserInfo(ServerRequest serverRequest) {
        User user = new User();
        user.setId(12345);
        user.setName("张三");
        return ServerResponse.ok()
                .contentType(MediaType.TEXT_PLAIN)
                .body(BodyInserters.fromObject(user));
    }

常见异常:

  • org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'text/xml;charset=UTF-8' not supported for bodyType

    原因:MediaType.TEXT_PLAIN 转变为 MediaType.APPLICATION_JSON 即可

posted on   zhaoqiang1980  阅读(2332)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
历史上的今天:
2017-11-14 springBoot异常处理
点击右上角即可分享
微信分享提示