别只会 SpringMVC 了!Spring 又官宣了一个更牛逼的替代框架!
来源:blog.csdn.net/yasin_huang/article/details/106556935
Spring-webflux简介 什么是“响应式” Spring-webflux的响应式API 选择Spring-webmvc还是Spring-webflux呢 并发模型 webflux代码示例
Spring-webflux简介
spring-webflux
是spring在5.0版本后提供的一套响应式编程风格的web开发框架。spring-framework
和spring mvc,它可以运行在Netty、Undertow以及3.1版本以上的Serlvet容器上。spring-webmvc
和spring-webflux
,或者只用其中一个来开发web应用。什么是“响应式”
Spring-webflux的响应式API
Spring-webflux
框架是基于Reactor这个开源项目开发的。Reactor框架是跟Spring紧密配合的。// Mono一般作用于单个对象
Mono<Person> person = personDao.getPerson(personId);
// Flux一般作用于多个对象
Flux<Person> people = personDao.listAllPeople();
选择Spring-webmvc还是Spring-webflux呢
如果你已经使用了 **Spring-webmvc**
进行开发,并且项目运行良好,就无需更改了;何况现在大多数的三方库都是阻塞的,并不能发挥出非阻塞的优势。**webflux**
提供了相当多的选择;在服务层,可以使用(Netty, Tomcat, Jetty, Undertow, 和3.1版本以上的Servlet容器)作为web服务;在应用层,可以选择用**@Controller**
定义还是使用函数编程定义;在编程风格上,可以选择用Reactor、RxJava或其他。如果你钟爱Java8提供的lambda表达式这种轻量级、函数式的编程风格,那么建议选择用webflux;同时对于一些轻量级应用,或者复杂度比较低的微服务,建议使用webflux以便更好的进行控制。 在微服务架构中,可以将webmvc和webflux项目混合使用。两个框架都可以使用 **@Controller**
这种注解的方式,使得项目的重用更加容易。评估一个项目是否应该选择webflux的最简单的方式是,依据项目中是否会使用很多的阻塞API,比如JDBC或者一些阻塞式的API就不适用与webflux项目。 如果一个webmvc项目中有很多的外部系统调用,可以试试响应式的 **WebClient**
,它能直接从**Controller**
的方法中返回响应式结果。响应式编程的学习路线是比较陡峭的,所以如果你身在一个大型的团队中,要考虑投入的成本;不过可以用用 **WebClient**
来体验下响应式编程。
Spring-webflux
不仅可以支持在Tomcat、Jetty以及3.1版本以上的Servlet容器上,还能够运行在非Servlet的服务器之上,比如Netty、Undertow等。并发模型
webflux代码示例
Talk is cheap, show me the code
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
public class Person {
private Integer id;
private Integer age;
private String name;
}
PersonController
”,响应式风格中不再使用@RequestMapping
声明地址映射了,而是通过RouterFunctions.route().GET()
方法@Configuration
public class PersonRouter {
@Resource
private PersonHandler personHandler;
@Bean
public RouterFunction<ServerResponse> personRoutes() {
return RouterFunctions.route()
.GET("/person/{id}", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandler::getPerson)
.GET("/person", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandler::listPeople)
.POST("/person", personHandler::createPerson)
.build();
}
}
PersonHandler
中处理对应的HTTP请求,等同于MVC架构中的Service层@Component
public class PersonHandler {
@Resource
private PersonRepository personDao;
public Mono<ServerResponse> listPeople(ServerRequest request) {
Flux<Person> people = personDao.listAllPeople();
return ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(people, Person.class);
}
public Mono<ServerResponse> createPerson(ServerRequest request) {
Mono<Person> person = request.bodyToMono(Person.class);
return ServerResponse.ok()
.build(personDao.savePerson(person));
}
public Mono<ServerResponse> getPerson(ServerRequest request) {
int personId = Integer.parseInt(request.pathVariable("id"));
return personDao.getPerson(personId)
.flatMap(person -> ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).bodyValue(person))
.switchIfEmpty(ServerResponse.notFound().build());
}
}
Spring-webflux
是默认使用Netty提供HTTP服务http://localhost:8080/person/1
就能发现,你的Spring-webflux项目已经正常工作了。END
官方站点:www.linuxprobe.com
Linux命令大全:www.linuxcool.com
刘遄老师QQ:5604241
Linux技术交流群:3762708
(新群,火热加群中……)
想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!
微信扫码关注该文公众号作者
戳这里提交新闻线索和高质量文章给我们。
来源: qq
点击查看作者最近其他文章