美文网首页Spring Cloud
Spring Webflux 学习笔记

Spring Webflux 学习笔记

作者: 王广帅 | 来源:发表于2020-01-08 09:57 被阅读0次
    • Webflux是一个非阻塞的web框架。
    • Webflux可以容纳都多的请求
      它不会阻塞请求,当有更多的请求到达时,会将请求封装为事件,放在队列中等待执行。
    • 数据可变
      在Reactive pipeline中执行的所有的操作都是有顺序的,不会出现并发操作数据的情况,除非你手动创建了Thread去执行。
    • 编码与解码
      spring-core 模块提供了byte[],ByteBuffer,DataBuffer,Resource和String的解码与编码,spring-web模块提供了Jackson JSON,Jackson Smile,JAXB2,Protocol Buffers和其它的Http专用的解码和编码,比如form data,multipart content,server-sent events。
      可以使用ClientCodecConfigurer和ServerCodecConfigurer配置自定义的解码编码器。更多可以查阅Http message codecs。
    • Log Id
      在webflux中,一个请求,有可能在多个线程中执行,所以线程id关联一个请求的日志信息也是没有什么用的,因此,WebFlux在收到请求时,会指定一个详细的请求ID,在服务器端,log id存储在ServerWebExchange attribute (LOG_ID_ATTRIBUTE),
      在客户端,是存储在ClientRequestattribute (LOG_ID_ATTRIBUTE)可以通过ClientRequest#logPrefix().获取。
    • 自定义解码器
      客户端配置自定义解码器如下面代码所示:
    Consumer<ClientCodecConfigurer> consumer = configurer -> {
            CustomDecoder customDecoder = new CustomDecoder();
            configurer.customCodecs().decoder(customDecoder);
            configurer.customCodecs().withDefaultCodecConfig(config ->
                customDecoder.maxInMemorySize(config.maxInMemorySize())
            );
    }
    
    WebClient webClient = WebClient.builder()
            .exchangeStrategies(strategies -> strategies.codecs(consumer))
            .build();
    
    • 自定义Controller中的条件注解
      Spring WebFlux also supports custom request mapping attributes with custom request matching logic. This is a more advanced option that requires sub-classing RequestMappingHandlerMapping and overriding the getCustomMethodCondition method, where you can check the custom attribute and return your own RequestCondition.

    • Java代码动态注册Handler Methods

    @Configuration
    public class MyConfig {
    
        @Autowired
        public void setHandlerMapping(RequestMappingHandlerMapping mapping, UserHandler handler) 
                throws NoSuchMethodException {
    
            RequestMappingInfo info = RequestMappingInfo
                    .paths("/user/{id}").methods(RequestMethod.GET).build(); 
    
            Method method = UserHandler.class.getMethod("getUser", Long.class); 
    
            mapping.registerMapping(info, handler, method); 
        }
    
    }
    
    1,Inject target handlers and the handler mapping for controllers.
    2,Prepare the request mapping metadata.
    3,Get the handler method.
    4,Add the registration.
    
    
    • 在Controller中可以直接返回HttpHeaders,表示只返回http header,没有body

    • Controller中参数类型转换
      Some annotated controller method arguments that represent String-based request input (for example, @RequestParam, @RequestHeader, @PathVariable, @MatrixVariable, and @CookieValue) can require type conversion if the argument is declared as something other than String.
      For such cases, type conversion is automatically applied based on the configured converters. By default, simple types (such as int, long, Date, and others) are supported. Type conversion can be customized through a WebDataBinder (see [mvc-ann-initbinder]) or by registeringFormatters with the FormattingConversionService (see Spring Field Formatting).

    • Controller各种参数注解使用示例

    相关文章

      网友评论

        本文标题:Spring Webflux 学习笔记

        本文链接:https://www.haomeiwen.com/subject/hnrdgctx.html