当前位置: 首页 > news >正文

买模板做网站营销网站制作教程

买模板做网站,营销网站制作教程,网站设计可以吗,郴州网签备案查询系统在软件开发领域#xff0c;随着互联网应用的规模和复杂性不断增加#xff0c;传统的编程模型逐渐暴露出一些局限性#xff0c;尤其是在面对高并发、大规模数据流处理等场景时。为了应对这些挑战#xff0c;响应式编程#xff08;Reactive Programming#xff09;应运而生…在软件开发领域随着互联网应用的规模和复杂性不断增加传统的编程模型逐渐暴露出一些局限性尤其是在面对高并发、大规模数据流处理等场景时。为了应对这些挑战响应式编程Reactive Programming应运而生它提供了一种更为高效、灵活的编程范式以适应不断变化的系统需求。 1.Spring WebFlux 简介 WebFlux提供了一个非阻塞、异步的Web框架允许开发者构建高性能、可伸缩的 Web 应用程序特别适合处理大量并发连接如在微服务架构和云环境中。 WebFlux是Spring Framework 5引入的一个重要组件它代表了Spring对于响应式编程Reactive Programming的支持。 1.1.异步非阻塞 异步非阻塞是一种编程模式它允许程序在等待某个操作完成时继续执行其他任务。这种模式是基于事件循环可以在单个线程上处理多个I/O操作大幅提高了系统的吞吐量和伸缩性。 服务器端处理: WebFlux 使用 Netty 或 Undertow 这类非阻塞服务器它们能够处理大量连接而不阻塞线程。这意味着服务器可以在单个线程中同时处理多个请求提高了资源利用率和吞吐量。数据库访问: 通过使用 R2DBC Reactive Relational Database Connectivity或其他支持响应式编程的数据库客户端可以在数据库查询中实现异步操作从而避免线程等待数据库响应造成的阻塞。异步API调用: 在处理外部服务调用时可以利用 WebClient 进行异步HTTP请求WebClient 是完全非阻塞的能够在等待响应的同时处理其他任务。 1.2.响应式流Reactive Streams 响应式流是一个规范它定义了异步流处理的接口和行为。 1.2.1.响应式编程 响应式编程是一种编程范式是一种异步的、事件驱动的编程范式它特别适用于构建能够处理实时数据流的应用程序。在这种模型中数据和事件作为流进行处理允许开发者以声明式的方式构建复杂的异步逻辑。 Spring WebFlux 遵循这一规范使用 Publisher 作为响应式流的源头Subscriber 作为流的消费者。这种模型允许开发者以声明式的方式处理异步数据流同时保持了流的控制和背压管理。 数据流处理: Spring WebFlux 集成了 Reactor 库使用 Flux 和 Mono 类型来处理数据流。Flux 表示0到N个元素的异步序列Mono 表示0或1个元素的异步结果两者都支持背压策略能够智能调整数据生产速度以匹配消费者的处理能力。事件驱动编程: 应用程序可以轻松地处理各种事件如消息队列中的消息、WebSocket连接上的事件等通过响应式流模型可以高效地处理这些事件而不会阻塞主线程。 1.2.2.背压管理 背压是响应式流中的一个重要概念用于控制生产者和消费者之间的数据流速率。Project Reactor 提供了多种背压策略帮助开发者处理数据流过载的问题。 1.2.3.Project Reactor Project Reactor 用于创建和操作响应式流的一组丰富的API。 Project Reactor 是一个基于Java 8的响应式编程库由Pivotal团队开发专为配合Spring框架使用而设计。 响应式类型Mono 和 Flux Mono代表0到1个元素的响应式类型适合表示单个结果或无结果的异步操作。Flux代表0到N个元素的响应式类型用于表示多个结果的异步序列。 操作符与响应式数据流 Project Reactor 提供了大量操作符用于处理响应式流中的元素。这些操作符包括 Map将流中的每个元素应用一个函数并发布结果。Filter根据条件过滤流中的元素。FlatMap将流中的每个元素转换为另一个流并将结果流合并为一个流。SwitchIfEmpty如果源流为空则切换到备选的Mono或Flux。 1.2.4.与传统Spring MVC的比较 Spring MVC是一个基于Servlet API的Web框架它采用阻塞I/O模型每个请求/响应对都与一个线程绑定。这在并发量较低时表现良好但在高并发场景下线程资源的消耗会急剧增加。 相比之下Spring WebFlux基于响应式流它不依赖于Servlet API可以在如Netty、Undertow等非Servlet服务器上运行。这种模型使得WebFlux能够以非阻塞的方式处理并发请求有效利用资源提高性能。 1.3.函数式编程 函数式编程是一种编程范式 , 它强调的是将任务看作一系列可组合的函数调用。通过声明式的方式定义处理流程让代码更简洁、易读也更适合处理复杂的异步逻辑。WebFlux采用函数式编程范式利用Lambda表达式简化了编程模型路由和请求处理采用函数式编程的方式进行定义这与传统的基于注解的控制器方法截然不同。 路由与处理: WebFlux 提供了函数式编程模型允许开发者使用 Java 8 的 Lambda 表达式来定义路由规则和处理函数使得代码更为简洁、可读性强。例如可以使用 RouterFunctions.route() 方法来定义路由使用 ServerResponse 来构建响应。链式操作与组合: 利用响应式类型 Flux 和 Mono 的丰富操作符如 map(), filter(), flatMap() 等可以轻松地构建复杂的异步数据处理流程而无需显式管理回调或线程。 1.3.1.请求路由 使用 RouterFunction 定义请求路由 RouterFunction 是Spring WebFlux中用于定义请求路由的函数接口。通过实现 RouterFunction可以精确控制请求的匹配和处理。 路由谓语和处理器 路由谓语用于匹配HTTP请求的特定属性如路径、方法、头部等。 处理器一旦路由谓语匹配成功处理器将负责处理请求并返回响应。 1.3.2.函数式端点 Spring WebFlux 还引入了函数式端点的概念允许开发者以简单的函数形式处理请求和生成响应这些函数通常返回 ServerResponse。 1.3.3.函数式编程与响应式流 函数式编程是响应式编程模型的一个重要组成部分。它提倡使用无副作用的函数、不可变数据结构并且推崇声明式编程。这些原则与响应式流的概念相契合响应式流强调数据流的声明式处理以及在数据流中应用各种操作符来转换、过滤和组合数据。 2.Spring WebFlux 应用搭建 2.1 环境准备 项目依赖配置 基于Maven的Springboot项目pom.xml文件中的依赖配置可能如下所示 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-webflux/artifactId /dependency 2.2 定义路由与处理器 2.2.1.创建 RouterFunction Bean 在Spring WebFlux中使用RouterFunction来定义请求的路由。 首先创建一个配置类并在其中定义路由 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.server.RequestPredicates; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.ServerResponse; import static org.springframework.web.reactive.function.server.RouterFunctions.route;Configuration public class WebFluxConfig {Beanpublic RouterFunctionServerResponse route(MyHandler handler) {return RouterFunctions.route(GET(/hello), handler::hello);} }RouterFunctions.route() 是用来创建路由规则的起点。GET(/hello) 是来自RequestPredicates的静态方法定义了一个谓词用于匹配HTTP GET方法并且路径为/hello的请求。handler::hello 是一个方法引用指向MyHandler类中名为hello的方法。这意味着当匹配到上述HTTP请求条件时会调用handler.hello()方法来处理请求并期待它返回一个ServerResponse对象作为响应。 2.2.2.使用 HandlerFunction 处理请求 创建一个处理器类它将包含处理请求的方法。这些方法可以返回MonoServerResponse或FluxServerResponse这取决于它们处理的是单个响应还是响应流 import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Mono;Component public class MyHandler {public MonoServerResponse hello(ServerRequest request) {String name request.queryParam(name).orElse(World);String message Hello, name !;return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).body(Mono.just(message), String.class);} }hello的方法用于处理HTTP请求并返回一个响应。 MonoServerResponse返回类型是一个Mono对象这是Reactor库中的一个类用于表示0到1个元素的异步序列。在这里它最终会包含一个ServerResponse对象即HTTP响应。使用Mono是为了支持非阻塞和响应式编程。 ServerRequest request输入参数表示接收到的HTTP请求信息。 提取查询参数: String name request.queryParam(name).orElse(World);这行代码从ServerRequest对象中尝试获取名为name的查询参数。如果请求中包含了这个参数比如http://example.com/hello?nameJohn那么name变量就会被赋值为John如果没有提供则使用默认值World。 构建HTTP响应的 ServerResponse.ok()创建一个表示成功HTTP状态码200 OK的基础响应。.contentType(MediaType.TEXT_PLAIN)设置响应的内容类型为纯文本PLAIN TEXT。.body(Mono.just(message), String.class)指定响应体的内容。这里使用Mono.just(message)来包装问候消息字符串表明响应体是一个包含单个元素的异步序列其类型为String。这确保了整个处理过程是非阻塞的。 2.3 全局异常处理 全局异常处理是任何Web应用程序的重要部分 import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono;Component Order(Ordered.HIGHEST_PRECEDENCE) public class GlobalExceptionHandler {public MonoVoid handleException(ServerWebExchange exchange, Throwable ex) {ServerHttpResponse response exchange.getResponse();response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);DataBuffer buffer response.bufferFactory().wrap({\error\: \Internal Server Error\}.getBytes());return response.writeWith(Mono.just(buffer));} }这段代码定义了一个全局异常处理器用于在Spring WebFlux应用中捕获未处理的异常并向客户端返回统一的错误响应。下面是各部分的详细说明 Order(Ordered.HIGHEST_PRECEDENCE) Order注解用于指定组件的执行顺序特别是当有多个相同类型的组件比如多个异常处理器需要按特定顺序执行时。Ordered.HIGHEST_PRECEDENCE是一个常量值为Integer.MIN_VALUE意味着这个异常处理器将具有最高优先级会在所有其他相同类型的组件之前执行。换句话说如果有其他异常处理器也能够处理相同的异常类型但没有指定这么高的优先级那么这个GlobalExceptionHandler将会优先处理异常。 handleException 方法 参数 ServerWebExchange exchange封装了HTTP请求和响应的所有信息是WebFlux处理请求时的核心对象。Throwable ex抛出的异常对象即需要被处理的异常。 功能 设置响应状态码首先通过exchange.getResponse()获取响应对象并将其状态码设置为HttpStatus.INTERNAL_SERVER_ERRORHTTP 500表示服务器遇到了未知错误。 构建响应体使用response.bufferFactory().wrap()方法创建一个包含错误信息的DataBuffer对象。这里的消息体内容为{error: Internal Server Error}表示发生了内部服务器错误。 写入响应体并完成响应最后通过response.writeWith(Mono.just(buffer))将构建好的错误信息缓冲区写入响应并返回一个MonoVoid表示这是一个无返回值的异步操作完成响应的发送。 3.应用细节 3.1.RouterFunction RouterFunction 是 Spring WebFlux 提供的一种用于定义和处理 HTTP 路由的功能性接口它是构建响应式 Web 应用的基础组件之一。与传统的基于注解如 GetMapping, PostMapping 等的控制器相比RouterFunction 提供了一种更为灵活和强大的方式来定义路由逻辑特别适合函数式编程风格。下面详细介绍其用法 3.1.1. 基本概念 RouterFunction: 表示一个路由处理逻辑它将HTTP请求与相应的处理逻辑关联起来。一个RouterFunction可以匹配一个请求返回下一个RouterFunction或一个处理结果HandlerFunction。HandlerFunction: 表示一个处理逻辑它接受一个ServerRequest并返回一个MonoServerResponse。即它负责处理请求并产生响应。 3.1.2. 创建 RouterFunction 创建 RouterFunction 通常涉及定义路由规则和处理逻辑。以下是一个简单的示例展示如何定义一个路由来处理 GET 请求 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.ServerResponse;import static org.springframework.web.reactive.function.server.RequestPredicates.GET; import static org.springframework.web.reactive.function.server.RouterFunctions.route; import static org.springframework.web.reactive.function.server.ServerResponse.ok; Configuration public class GreetingRouter {Beanpublic RouterFunctionServerResponse routingFunction() {return route(GET(/hello2), request - ok().bodyValue(Hello, Spring WebFlux!));} }这段代码定义了一个简单的RouterFunctionServerResponse实例用于处理一个HTTP GET请求到/hello路径的路由逻辑。 return route(GET(/hello), request - ok().bodyValue(Hello, Spring WebFlux!));route是RouterFunctions类中的一个静态方法用于创建一个基础的路由定义。它接受两个参数 谓词PredicateGET(/hello)是一个谓词用于匹配HTTP请求的方法和路径。这里匹配所有GET方法并且路径为/hello的请求。处理器函数HandlerFunctionrequest - ok().bodyValue(Hello, Spring WebFlux!)是一个Lambda表达式代表了处理请求的具体逻辑。它接受一个ServerRequest对象作为输入并返回一个MonoServerResponse表示响应结果。 request - ...Lambda表达式定义了如何根据请求生成响应。 ok()这是ServerResponse的静态工厂方法用于创建一个表示成功HTTP状态码200 OK的响应。 .bodyValue(Hello, Spring WebFlux!)此方法设置了响应体的内容为给定的字符串并且指定了内容类型默认情况下如果没有显式指定会根据内容推断。 3.1.3. 注册 RouterFunction 要在 Spring Boot 应用中注册 RouterFunction通常在配置类中声明为 Bean以便 Spring 自动发现并配置 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse;Configuration public class WebConfig {Beanpublic RouterFunctionServerResponse routes(GreetingHandler handler) {return RouterFunctions.route(GET(/hello), handler::sayHello);} }其中GreetingHandler 是一个包含业务逻辑的 HandlerFunction。 3.1.4. 组合 RouterFunction RouterFunction 可以组合起来形成复杂的路由结构。这使得路由配置更加模块化和可维护。 谓词组合可以使用 and, or 等逻辑运算符组合谓词以实现更复杂的路由匹配逻辑。 Beanpublic RouterFunctionServerResponse route(MyHandler handler) {return RouterFunctions.route(GET(/haha).and(accept(MediaType.TEXT_PLAIN)), handler::haha).andRoute(GET(/reactor).and(accept(MediaType.APPLICATION_JSON)), handler::reactorExample);}// 处理简单的文本请求public MonoServerResponse haha(ServerRequest request) {return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).bodyValue(haha!);}// 处理复杂的响应式请求public MonoServerResponse reactorExample(ServerRequest request) {return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).bodyValue({message: This is a reactive response!});}3.1.5. 处理请求参数 RouterFunction 可以方便地处理请求参数无论是路径参数、查询参数还是请求体。例如处理带路径参数的请求 public RouterFunctionServerResponse userRoutes(UserHandler handler) {return route(GET(/users/{id}), handler::getUserById); }3.1.6. 错误处理 Spring WebFlux 支持全局或局部的错误处理可以通过提供一个处理特定异常类型的 RouterFunction 实现 3.1.6.1.自带异常处理 Beanpublic RouterFunctionServerResponse route(MyHandler handler) {return RouterFunctions.route().GET(/greeting, handler::reactorExample)// 全局错误处理.onError(Exception.class, (exception, request) - {System.out.println(An exception occurred: exception.getMessage());return ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType(MediaType.TEXT_PLAIN).bodyValue(Oops! Something went wrong.);}).build();}3.1.6.2.全局异常处理 // 错误处理路由private RouterFunctionServerResponse errorRoute() {return RouterFunctions.route(RequestPredicates.all(),request - ServerResponse.status(HttpStatus.BAD_REQUEST).contentType(MediaType.TEXT_PLAIN).bodyValue(这是一条用于未匹配请求的回退处理。));}RequestPredicates.all()意味着这个谓词将匹配所有的HTTP请求无论方法GET、POST等或路径是什么。 3.1.7. 高级用法 过滤器与拦截器可以插入自定义的过滤器或拦截器来处理请求的预处理或后处理逻辑。条件路由基于环境、配置或其他条件动态选择路由。 3.2.请求接参 Spring WebFlux 完全支持接收 RESTful 风格的传参。RESTful 风格的接口通常通过URL路径、查询参数、请求头以及请求体来传递参数。在Spring WebFlux中你可以使用函数式和注解两种方式来定义端点以接收这些参数。下面是几种常见的接收参数方式 3.2.1. 路径变量Path Variables 在路由定义中你可以使用 {variableName} 来标记路径变量然后在处理器方法中通过 PathVariable 注解接收它们。 Bean public RouterFunctionServerResponse userRoute(UserHandler handler) {return RouterFunctions.route(GET(/users/{id}), handler::getUserById); }Component public class UserHandler {public MonoServerResponse getUserById(ServerRequest request) {String id request.pathVariable(id);// 处理逻辑...} }3.2.2. 查询参数Query Parameters 查询参数可以直接从 ServerRequest 中获取或者使用 RequestParam 注解。 public MonoServerResponse searchUsers(ServerRequest request) {String keyword request.queryParam(keyword).orElse();// 处理逻辑... }或者使用 RequestParam public MonoServerResponse searchUsers(RequestParam(name keyword, defaultValue ) String keyword) {// 处理逻辑... }3.2.3. 请求体Request Body 对于POST、PUT等方法你可能需要从请求体中读取数据。可以使用 RequestBody 注解并指定相应的对象类型来自动绑定JSON或表单数据。 public MonoServerResponse createUser(RequestBody UserDTO user) {// 处理逻辑... }3.2.4. 请求头Request Headers 请求头可以通过 ServerRequest.headers() 获取或者使用 RequestHeader 注解。 public MonoServerResponse handleRequestWithHeader(RequestHeader(Authorization) String authHeader) {// 处理逻辑... }3.3.响应内容 3.3.1.ServerResponse对象 在Spring WebFlux中响应的返回内容通常是通过ServerResponse对象来构建和管理的它代表了即将发送给客户端的HTTP响应。 3.3.1.1. 状态码(Status Code) 每个HTTP响应都会有一个状态码用于表示请求的处理结果。在Spring WebFlux中你可以通过如下方式设置状态码 使用静态方法如ServerResponse.ok()表示200 OKServerResponse.created()表示201 Created等。或者直接指定状态码如ServerResponse.status(HttpStatus.NOT_FOUND)表示404 Not Found。 3.3.1.2. 响应体(Body) 响应体是响应的主要内容可以是文本、JSON、XML等各种格式的数据。构建响应体的方式有多种 直接值使用.bodyValue(响应内容)适合于简单的字符串或对象直接转换为响应体。流(Stream).body(fromPublisher(publisher, MediaType))当响应内容来自一个publisher如Flux或Mono时这种方式非常适合处理异步数据流。对象转换结合.body(toEntity(object))或.bodyValue(object)结合Jackson等库自动将Java对象转换为JSON等格式的响应体。 3.3.1.3. 内容类型(Content-Type) 通过.contentType(MediaType)方法指定响应的内容类型如MediaType.APPLICATION_JSON_UTF8表示JSON格式MediaType.TEXT_PLAIN表示纯文本等。 3.3.1.4. 头部(Headers) 可以在响应中添加自定义头部信息如.header(X-Custom-Header, value)。 3.3.1.5. 构建响应 一旦定义好状态码、响应体、内容类型和头部等信息通过.build()方法完成ServerResponse的构建。这一步是必要的它将之前设置的所有配置整合成一个待发送的响应对象。 3.3.1.6.示例 假设我们要构建一个返回JSON格式数据的响应 import org.springframework.http.MediaType; import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Mono;public MonoServerResponse getUserInfo(ServerRequest request) {// 假设getUserDetails()是一个MonoUserUser是自定义的Java对象MonoUser userDetails userService.getUserDetails(request.pathVariable(id));return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(userDetails, User.class) // 自动转换User对象为JSON.switchIfEmpty(ServerResponse.notFound().build()); // 如果找不到用户返回404 }在这个例子中我们首先指定了响应的状态码为200 OK内容类型为JSON然后将从数据库查询到的用户详情User对象转换为JSON响应体。如果查询结果为空即用户不存在则通过.switchIfEmpty()方法切换到返回404 Not Found的响应。 3.3.2.响应式类型 在响应式编程领域尤其是在使用Spring WebFlux和Reactor框架时Mono和Flux是两个核心的响应式类型它们都是Reactor库提供的对Reactive Streams规范的实现。这两种类型都实现了Publisher接口这意味着它们可以作为异步数据流的生产者在响应式系统中扮演着至关重要的角色。 3.3.2.1. Mono 概念Mono代表0或1个元素的异步序列。换句话说它要么发出一个元素要么发出一个完成信号表示没有元素或者发出一个错误信号。这使得它非常适合用于表示单个结果或者空结果的场景比如数据库查询返回单行记录或者执行一个可能会失败的操作。 典型用途数据库查询的单一结果、网络请求的响应、计算单一值的操作等。 操作符Mono提供了丰富的操作符如map、flatMap、zip、then等用于处理单个数据流的变换、组合和错误处理。 1. map 功能对Mono中的元素应用一个函数进行转换。 MonoString monoStr Mono.just(Hello); MonoInteger monoLength monoStr.map(String::length);2. flatMap 功能将Mono中的元素转换为另一个Mono或Flux然后扁平化这个结果流使其成为单一流。 MonoUser monoUser ...; // 假设获取用户信息 MonoAddress monoAddress monoUser.flatMap(user - getAddressForUser(user.getId()));3. then 功能忽略Mono中的元素仅当前Mono完成时执行下一个Mono。 MonoVoid saveUser userRepository.save(newUser); MonoUser findUser saveUser.then(userRepository.findById(newUser.getId()));4. zipWith 功能将两个Mono的输出按照某种方式结合通常是元组只有当两个Mono都成功时才会触发。 MonoUser monoUser ...; MonoOrder monoOrder ...; MonoTuple2User, Order combined monoUser.zipWith(monoOrder);3.3.2.2. Flux 概念Flux代表0到N个元素的异步序列。它可以发出任意数量的元素包括无限数量直到它完成或者遇到错误。这使得Flux非常适合处理集合、事件流或者任何可能有多次数据推送的场景。 典型用途处理列表或集合的数据、实时数据流如WebSocket消息、数据库查询的多行结果等。 操作符Flux同样提供了丰富的操作符如map、filter、concatMap、buffer、window等用于处理数据流的变换、过滤、合并、窗口化等操作。 1. map 功能对流中的每个元素应用一个函数进行转换。 FluxString names Flux.fromIterable(Arrays.asList(Alice, Bob, Charlie)); FluxInteger lengths names.map(String::length);2. filter 功能根据条件从流中筛选元素。 FluxString names ...; FluxString longNames names.filter(name - name.length() 5);3. flatMap 功能将流中的每个元素转换为一个新的流然后将这些流合并成一个单一的流。 FluxUser users ...; FluxOrder orders users.flatMap(user - getOrderListForUser(user.getId()));4. buffer 功能将流中的元素收集到缓冲区中达到一定条件如数量或时间后作为一个列表或数组发出。 FluxInteger numbers Flux.interval(Duration.ofMillis(100)).take(10); FluxListInteger buffered numbers.buffer(3); // 每3个元素打包一次5. concatMap 功能类似于flatMap但保证按源流的顺序依次处理每个元素产生的流。 FluxUser users ...; FluxOrder ordersSequential users.concatMap(user - getOrderListForUser(user.getId()));3.3.3.3.共同特点 响应式Mono和Flux都是非阻塞的支持背压Backpressure能够在数据生产者和消费者之间自动调节数据流动的速度防止生产过快导致消费端处理不过来的情况。 链式操作两者都支持链式调用操作符允许以声明式的方式构建复杂的异步数据处理流程而无需显式地管理线程或回调。 异步和事件驱动它们的设计哲学鼓励编写异步和事件驱动的代码提高了系统的可伸缩性和资源利用率。 3.3.3.4.转换关系 Mono和Flux之间可以通过操作符互相转换例如Mono可以通过flatMapMany转换为Flux而多个Mono或Flux可以通过concat、merge等操作合并。 4.WebClient WebClient是Spring Framework 5引入的一个非阻塞、响应式的HTTP客户端它属于Spring WebFlux模块的一部分。它设计用于构建高性能、异步的Web服务客户端特别适合用于处理大量的并发请求和与响应式服务交互。下面是对WebClient的详细讲解 核心特性 非阻塞WebClient基于非阻塞IO这意味着它在等待数据时不会占用线程从而能够高效地处理大量并发连接减少资源消耗。 响应式遵循Reactor项目中的响应式编程模型使用Mono和Flux作为返回类型便于处理异步数据流和背压机制。 链式调用提供了一套流畅的API允许通过链式调用来构建HTTP请求易于理解和维护。 配置灵活支持多种配置选项包括基础URL、默认头、超时设置、SSL配置等。 内容协商自动处理内容类型和编码支持JSON、XML等多种数据格式的序列化和反序列化。 过滤器允许添加自定义过滤器来修改请求或响应实现日志记录、认证、重试逻辑等。 基本使用 创建WebClient实例 // 最简单的创建方式 WebClient client WebClient.create();// 配置化创建 WebClient client WebClient.builder().baseUrl(http://example.com).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).build();发送GET请求 MonoString response client.get().uri(/api/data).retrieve() // 获取响应体.bodyToMono(String.class); // 将响应体转换为String类型发送POST请求 MonoString response client.post().uri(/api/data).body(BodyInserters.fromObject(someObject)) // 发送对象.retrieve().bodyToMono(String.class);处理响应 使用.block()方法会阻塞当前线程直到响应到来这通常只在测试或者非响应式环境中使用。在响应式环境中应该通过订阅Mono或Flux来处理响应或者将其与其它响应式流进行组合。 错误处理 可以使用.onErrorResume等操作符来优雅地处理错误情况例如重试逻辑或返回默认值。 MonoString withErrorHandling client.get().uri(/api/data).retrieve().onErrorResume(WebClientResponseException.class, e - {// 处理错误比如返回默认值return Mono.just(Default Value);}).bodyToMono(String.class);总结 WebClient是一个强大且灵活的工具它在现代Web应用和服务间通信中扮演着重要角色特别是当需要构建高性能、可扩展的系统时。通过充分利用响应式编程的优势开发者可以构建出更加高效、易维护的客户端逻辑。
http://www.dnsts.com.cn/news/76756.html

相关文章:

  • 织梦网站后台打不开网站分类页标题加长
  • 域名做非法网站支付宝小程序推广
  • 微信官方网站建设代理网址怎么用
  • 泉州网站建设技术托管谷歌搜索引擎 google
  • 网站备案核验单清晰网页设计一般尺寸
  • 如何做网站推广广告能自己做的ppt网站
  • win7 iis 默认网站正规的网站优化推广公司
  • 网站推广在线推广山西建筑劳务网站
  • 我做的网站怎样推广一个完整的产品规划方案
  • 免费 网站源码产品免费发布平台
  • 做企业网站的第一步需要啥沈阳最新通知今天重要消息
  • 网站模块下载商务网站建设需要备案吗
  • 网站微信支付怎么做的如何查询一个网站是否备案
  • 豆瓣网站模板怎么定义自豪地采用WordPress
  • 百度站长平台申请提交链接哈尔滨全国网站建设
  • 舒城县重点工程建设局网站建站行业消失了吗
  • 昌吉哪个公司做网站网站开发和商城的科目
  • 郑州网站搭建的公司知名品牌策划设计公司
  • 北京移动端网站价格大型门户网站建设哪便宜
  • 做网站的不给ftp给个人网站做百度百科
  • 网站空间购买价格深圳网站设计兴田德润优惠吗
  • 中堂仿做网站wordpress 分类目录置顶
  • 空白网站怎么建一个空间做2个网站
  • 妇女儿童心理咨询网站建设济南网站设计制作要多久
  • 手机wap网站模板下载wordpress模板脚步代码哪里修改
  • 展示网站模板下载白市驿网站建设
  • 西安做网站多少钱西安免费做网站电话
  • 深圳网站设计公司怎么找黄页网站大全通俗易懂
  • 门户网站建设的成果小破站下载
  • 郑州网站优化工资网站的二级域名