实战SpringCloud相应式微效劳系列教程(第九章)运用Spring WebFlux构建相应式RESTful效劳
2019-11-18杂谈搜奇网41°c
A+ A-本文为实战SpringCloud响应式微效劳系列教程第九章,解说运用Spring WebFlux构建响应式RESTful效劳。提议没有之前基本的童鞋,先看之前的章节,章节目次放在文末。
从本节最先我们将正式进入构建响应式效劳的天下。在Spring boot的基本上,我们将引入全新的Spring WebFlux框架。
WebFlux称号中的Flux来源于上章节引见的来自Reactor框架中的Flux组件。该框架中包括了对响应式HTTP、效劳器推送事宜以及Websocket的客户端和效劳端的支撑。
在构架响应式效劳上,WebFlux支撑两种差异的编程模子:
- 第一种是与SpringMvc中一样运用的基于java注解的体式格局;
- 第二种是基于java8中供应的lambda表达式的函数式编程模子。
1.1运用 Spring Initializer初始化响应式web运用
建立WebFlux运用最简朴的体式格局就是运用Spring boot供应的Spring Initializer初始化模板。
直接接见Spring Initializer网站(http://start.spring.io),挑选建立一个maven或许Gradle项目并制订响应的Group和Artifact,然后在增加依靠中挑选maven举行代码依靠治理。
翻开所下载项目中的pom文件,会找到以下依靠。
- spring-boot-starter-webflux组成响应式web顺序开辟的基本;
- spring-boot-starter-test是包括JUnit、Spring boot Test、Mockito、AssertJ、JSONAssert以及Hamcerst等东西在内的测试组件库;
- reactor-test则是用来测试Reactor框架的测试组件;
- spring-boot-starter-data-mongodb-reactive和spring-boot-starter-data-redis-reactive则是响应式数据接见组件。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <!--Lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> <version>1.16.22</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> </dependency> <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</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>
至此,运用Spring WebFlux构架响应式效劳的基本环境已预备终了。
关于Spring WebFlux和传统的SpringMvc的关联能够自行百度相识,这里不做过量引见。
1.2运用注解编程模子建立响应式RESTful效劳
基于注解编程模子来建立响应式RESTful效劳与运用传统SpringMvc异常相似。经由过程控制响应式编程的基本观点和技能,在webflux中运用这类编程模子几乎没有任何进修本钱。
构建第一个响应式RESTful效劳
第一个响应式RESTful效劳来自于对之前HelloController示例举行革新,革新以后的代码以下:
@RestController public class Helloontroller{ @GetMapping("/") public Mono<String> index(){ return Mono.just("Hello Spring Boot"); } }
以上代码只要一个处所值得注意,即index()
要领的返回值范例是Mono<String>
范例,个中包括的字符串"Hello Spring Boot"或作为HTTP的响应内容。
在浏览器中接见会获得以下效果:
从以上代码能够看到运用Spring WebFlux和运用 Spring Mvc的差异在于,WebFlux所运用的范例是与响应式编程相对应的Flux和Mono对象,而不是简朴的POJO,关于简朴的Hello Word气力来讲,这两个之间并没有什么太大的差异。
然则关于庞杂的运用来讲,响应式编程的背压机制就会表现出来,能够带来团体机能的提拔。在后续解说中会有完全示例代码。
1.3运用函数式模子建立响应式RESTful效劳
这部分内容与传统的SpringMvc构建RESTful效劳有较大的差异。
(1)函数式编程模子
在Spring WebFlux中,函数式编程模子的中心观点是Router Functions,对标@Controller
、@RequestMapping
等规范的Spring Mvc注解。
Router Functions供应一套函数式的API,用于建立Router和Handler对象。个中我们能够简朴的把Handler对应为Controller,把Router对应为RequestMapping。
当我们提议一个长途调用时,传入的HTTP要求由HandlerFunction处置惩罚,HandlerFunction本质上是一个吸收ServerRequest并返回一个Mono<ServerResponse>
的函数。ServerRequest和ServerResponse是一个不可变的接口,用来供应对底层HTTTP音讯的友好接见。
细致代码示例以下:
public class HelloWordHandlerFunction impllements HandlerFunction<ServerResponse>{ @Override public Mono<ServerResponse> handle(ServerRequest request){ return ServerResponse.ok().body(BodyInserters.fromObject("Hello Word")) } }
关于ServerRequest和ServerResponse我们在这里不做过量引见,细致相识可查阅相干材料。
以上代码将ServerRequest和ServerResponse组合到一同建立了HandlerFunction。HandlerFunction是一个接口,能够经由过程完成该接口中的handl()
要领来建立定制化的要求响应处置惩罚机制。
一般我们会针对某个范畴实体对象编写多个处置惩罚函数,所以引荐将多个处置惩罚函数分组到一个特地的Handler类中。比方我们编写一个PersonHandler特地完成种种针对Person范畴对象的处置惩罚函数。
代码以下:
public class PersonHandler{ @Autowired private PersonService personService; public Mono<ServerResponse> getPersons(ServerRequest request){ return ServerResponse.ok().body(this.personService.getPersons(),Person.class) } }
(2)RouterFunction
上面我们已经由过程HandlerFunction建立了要求的逻辑处置惩罚,接下来需要把细致的逻辑关联起来,RouterFunction能够协助我们完成这一个目的。RouterFunction将传入的要求路由传入到细致的函数,它吸收ServerRequest 并返回一个Mono<ServerResponse>
。
假如要求与特定路由婚配则返回处置惩罚函数的效果,不然返回一个空的Mono对象。RouterFunction与@ReuestMapping相似。代码以下:
public class personRouter{ @Bean public RouterFunction<ServerResponse> routerPerson(PersonHandler personHandler){ return RouterFunctions.route(RequestPredicates.GET("/person") .add(RequestPredicates.accept(MediaType.APPLICATION_JSON)), personHandler::getPersons) } }
本章节完
系列章节目次
实战SpringCloud响应式微效劳系列教程(第一章)
实战SpringCloud响应式微效劳系列教程(第二章)
实战SpringCloud响应式微效劳系列教程(第三章)
实战SpringCloud响应式微效劳系列教程(第四章)
实战SpringCloud响应式微效劳系列教程(第五章)
实战SpringCloud响应式微效劳系列教程(第六章)
实战SpringCloud响应式微效劳系列教程(第七章)
实战SpringCloud响应式微效劳系列教程(第八章)