反应式编程是使你的应用程序更高效的一种愈来愈流行的方式。响应式应用程序异步调用响应,而不是调用资源并等待响应。这使他们能够释放处理能力,仅在必要时执行处理,而且比其余系统更有效地扩展。html
Java生态系统在反应框架中占有至关大的份额,其中包括Play框架,Ratpack,Vert.x和Spring WebFlux。像反应式编程同样,微服务架构能够帮助大型团队快速扩展,而且可使用上述任何出色的框架进行构建。java
今天,我想向你展现如何使用Spring Cloud Gateway,Spring Boot和Spring WebFlux构建反应性微服务架构。咱们将利用Spring Cloud Gateway,由于API网关一般是云原生微服务架构中的重要组件,可为你全部的后端微服务提供聚合层。react
本教程将向你展现如何使用REST API构建微服务,该API返回新车列表。你将使用Eureka进行服务发现,并使用Spring Cloud Gateway将请求路由到微服务。而后,你将集成Spring Security,以便只有通过身份验证的用户才能访问你的API网关和微服务。web
Prerequisites: HTTPie (or cURL), Java 11+, and an internet connection.spring
Zuul是Netflix的API网关。Zuul最初于2013年发布,最初并不具备反应性,但Zuul 2是完全的重写,使其具备反应性。不幸的是,Spring Cloud不支持Zuul 2,而且可能永远不会支持。mongodb
如今,Spring Cloud Gateway是Spring Cloud Team首选的API网关实现。它基于Spring 5,Reactor和Spring WebFlux。不只如此,它还包括断路器集成,使用Eureka进行服务发现,而且与OAuth 2.0集成起来要容易得多!docker
接下来让咱们深刻了解。数据库
首先建立一个目录来保存你的全部项目,例如spring-cloud-gateway。在终端窗口中导航至它,并建立一个包括Spring Cloud Eureka Server做为依赖项的discovery-service项目。编程
|
上面的命令使用HTTPie。我强烈建议安装它。你也可使用卷曲。运行curlhttps://start.spring.io以查看语法。
在其主类上添加@EnableEurekaServer,以将其用做Eureka server。
|
将如下属性添加到项目的src / main / resources / application.properties文件中,以配置其端口并关闭Eureka注册。
|
要使发现服务在Java 11+上运行,请添加对JAXB的依赖关系。
|
使用./mvnw spring-boot:run或经过在IDE中运行它来启动项目。
接下来,建立一个包含一些Spring Cloud依赖项的api-gateway项目。
|
一分钟后,咱们将从新配置该项目。
Car微服务将包含此示例代码的很大一部分,由于它包含支持CRUD的功能齐全的REST API。
使用start.spring.io建立car-service
项目:
|
这个命令中的dependencies参数颇有趣。你能够看到其中包括Spring WebFlux,以及MongoDB。Spring Data还为Redis和Cassandra提供了响应式驱动程序。
你可能还对R2DBC(反应性关系数据库链接)感兴趣,R2DBC是一种将反应性编程API引入SQL数据库的工做。在本示例中,我没有使用它,由于在start.spring.io上尚不可用。
我是大众的忠实拥护者,尤为是公交车和臭虫等经典车。你是否知道大众在将来几年内将推出大量电动汽车? 我对ID Buzz感到很是兴奋,它具备经典曲线,全电动并且拥有350匹以上的马力!
若是你不熟悉ID Buzz,请看这张来自大众汽车的照片。
让咱们从这个API示例中得到乐趣,并使用电动VW做为咱们的数据集。该API将跟踪各类汽车名称和发布日期。
在src / main / java /…/ CarServiceApplication.java中添加Eureka注册,示例数据初始化和反应性REST API:
|
10. 为多个对象返回一个Flex发布者
若是你使用IDE来构建项目,则须要为IDE设置Lombok。
你还须要修改car-service
项目的application.properties
以设置其名称和端口。
|
运行MongoDB的最简单方法是从car-service / pom.xml中的flappoodle依赖项中删除测试范围。这将致使你的应用程序启动嵌入式MongoDB依赖关系。
|
你还可使用Homebrew安装和运行MongoDB
|
或者,使用Docker:
|
这就完成了使用Spring WebFlux构建REST API所需完成的全部工做。
“可是等等!”你可能会说。 “我觉得WebFlux就是关于流数据的?”
在此特定示例中,你仍然能够从/cars
端点流式传输数据,但不能在浏览器中。
除了使用服务器发送事件或WebSocket以外,浏览器没法使用流。可是,非浏览器客户端能够经过发送具备application/stream+json
值的Accept
header来获取JSON流(感谢Rajeev Singh的技巧)。
你能够经过启动浏览器并使用HTTPie发出请求来测试此时一切正常。可是,编写自动化测试会更好!
WebClient是Spring WebFlux的一部分,可用于发出响应请求,接收响应以及使用有效负载填充对象。 伴随类WebTestClient可用于测试WebFlux API。 它包含与WebClient类似的请求方法,以及检查响应正文,状态和标头的方法。
修改car-service
项目中的src/test/java/…
/CarServiceApplicationTests.java
类以包含如下代码。
|
为了证实它有效,请运行./mvnw test
。测试经过后,请拍一下本身的背!
若是你使用的是Windows,请使用 mvnw test
.
这篇先讲到这,下篇继续:使用Spring Cloud Gateway保护反应式微服务(二)
另外近期整理了一套完整的java架构思惟导图,分享给一样正在认真学习的每位朋友~