使用Spring Cloud Gateway保护反应式微服务(一)
反应式编程是使你的应用程序更高效的一种越来越流行的方式。响应式应用程序异步调用响应,而不是调用资源并等待响应。这使他们可以释放处理能力,仅在必要时执行处理,并且比其他系统更有效地扩展。
Java生态系统在反应框架中占有相当大的份额,其中包括Play框架,Ratpack,Vert.x和Spring WebFlux。像反应式编程一样,微服务架构可以帮助大型团队快速扩展,并且可以使用上述任何出色的框架进行构建。
今天,我想向你展示如何使用Spring Cloud Gateway,Spring Boot和Spring WebFlux构建反应性微服务架构。我们将利用Spring Cloud Gateway,因为API网关通常是云原生微服务架构中的重要组件,可为你所有的后端微服务提供聚合层。
本教程将向你展示如何使用REST API构建微服务,该API返回新车列表。你将使用Eureka进行服务发现,并使用Spring Cloud Gateway将请求路由到微服务。然后,你将集成Spring Security,以便只有经过身份验证的用户才能访问你的API网关和微服务。

Prerequisites: HTTPie (or cURL), Java 11+, and an internet connection.
Spring Cloud Gateway vs. Zuul
Zuul是Netflix的API网关。Zuul最初于2013年发布,最初并不具有反应性,但Zuul 2是彻底的重写,使其具有反应性。不幸的是,Spring Cloud不支持Zuul 2,并且可能永远不会支持。
现在,Spring Cloud Gateway是Spring Cloud Team首选的API网关实现。它基于Spring 5,Reactor和Spring WebFlux。不仅如此,它还包括断路器集成,使用Eureka进行服务发现,并且与OAuth 2.0集成起来要容易得多!
接下来让我们深入了解。
创建一个Spring Cloud Eureka Server项目
首先创建一个目录来保存你的所有项目,例如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 Gateway项目
接下来,创建一个包含一些Spring Cloud依赖项的api-gateway项目。
|
|
一分钟后,我们将重新配置该项目。
使用Spring WebFlux创建反应式微服务
Car微服务将包含此示例代码的很大一部分,因为它包含支持CRUD的功能齐全的REST API。
使用start.spring.io创建car-service项目:
|
|
这个命令中的dependencies参数很有趣。你可以看到其中包括Spring WebFlux,以及MongoDB。Spring Data还为Redis和Cassandra提供了响应式驱动程序。
你可能还对R2DBC(反应性关系数据库连接)感兴趣,R2DBC是一种将反应性编程API引入SQL数据库的工作。在本示例中,我没有使用它,因为在start.spring.io上尚不可用。
使用Spring WebFlux构建REST API
我是大众的忠实拥护者,尤其是公交车和臭虫等经典车。你是否知道大众在未来几年内将推出大量电动汽车? 我对ID Buzz感到非常兴奋,它具有经典曲线,全电动而且拥有350匹以上的马力!
如果你不熟悉ID Buzz,请看这张来自大众汽车的照片。

让我们从这个API示例中获得乐趣,并使用电动VW作为我们的数据集。该API将跟踪各种汽车名称和发布日期。
在src / main / java /…/ CarServiceApplication.java中添加Eureka注册,示例数据初始化和反应性REST API:
|
|
- 添加@EnableEurekaClient批注以进行服务发现
- @ Slf4j是Lombok的一个方便注释,可用于登录类
- ApplicationRunner bean用默认数据填充MongoDB
- 删除MongoDB中的所有现有数据,以免添加新数据
- 订阅结果,以便同时调用deleteAll()和saveAll()
- 带有Spring Data NoSQL和Lombok注释的汽车类,以减少样板
- CarRepository接口扩展了ReactiveMongoRepository,几乎没有任何代码即可提供CRUD功能!
- 使用CarRepository执行CRUD操作的CarController类
- Spring WebFlux返回单个对象的Mono发布者
10. 为多个对象返回一个Flex发布者
如果你使用IDE来构建项目,则需要为IDE设置Lombok。
你还需要修改car-service项目的application.properties以设置其名称和端口。
|
|
运行MongoDB
运行MongoDB的最简单方法是从car-service / pom.xml中的flappoodle依赖项中删除测试范围。这将导致你的应用程序启动嵌入式MongoDB依赖关系。
|
|
你还可以使用Homebrew安装和运行MongoDB
|
|
或者,使用Docker:
|
|
使用WebFlux传输数据
这就完成了使用Spring WebFlux构建REST API所需完成的所有工作。
“但是等等!”你可能会说。 “我以为WebFlux就是关于流数据的?”
在此特定示例中,你仍然可以从/cars端点流式传输数据,但不能在浏览器中。
除了使用服务器发送事件或WebSocket之外,浏览器无法使用流。但是,非浏览器客户端可以通过发送具有application/stream+json值的Accept header来获取JSON流(感谢Rajeev Singh的技巧)。
你可以通过启动浏览器并使用HTTPie发出请求来测试此时一切正常。但是,编写自动化测试会更好!
使用WebTestClient测试你的WebFlux API
WebClient是Spring WebFlux的一部分,可用于发出响应请求,接收响应以及使用有效负载填充对象。 伴随类WebTestClient可用于测试WebFlux API。 它包含与WebClient相似的请求方法,以及检查响应正文,状态和标头的方法。
修改car-service项目中的src/test/java/…/CarServiceApplicationTests.java类以包含以下代码。
|
|
为了证明它有效,请运行./mvnw test。测试通过后,请拍一下自己的背!

如果你使用的是Windows,请使用 mvnw test.
这篇先讲到这,下篇继续:使用Spring Cloud Gateway保护反应式微服务(二)
另外近期整理了一套完整的java架构思维导图,分享给同样正在认真学习的每位朋友~


使用Spring Cloud Gateway保护反应式微服务(一)的更多相关文章
- 使用Spring Cloud Gateway保护反应式微服务(二)
抽丝剥茧,细说架构那些事——[优锐课] 接着上篇文章:使用Spring Cloud Gateway保护反应式微服务(一) 我们继续~ 将Spring Cloud Gateway与反应式微服务一起使用 ...
- 微服务网关实战——Spring Cloud Gateway
导读 作为Netflix Zuul的替代者,Spring Cloud Gateway是一款非常实用的微服务网关,在Spring Cloud微服务架构体系中发挥非常大的作用.本文对Spring Clou ...
- Spring Cloud Gateway简单入门,强大的微服务网关
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 见名知义,Spring Cloud Gateway是用于微服务场景的网关组件,它是基于Spring WebFlu ...
- Spring Cloud Gateway入门
1.什么是Spring Cloud GatewaySpring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技 ...
- API网关spring cloud gateway和负载均衡框架ribbon实战
通常我们如果有一个服务,会部署到多台服务器上,这些微服务如果都暴露给客户,是非常难以管理的,我们系统需要有一个唯一的出口,API网关是一个服务,是系统的唯一出口.API网关封装了系统内部的微服务,为客 ...
- 快速突击 Spring Cloud Gateway
认识 Spring Cloud Gateway Spring Cloud Gateway 是一款基于 Spring 5,Project Reactor 以及 Spring Boot 2 构建的 API ...
- 熬夜肝了这篇Spring Cloud Gateway的功能及综合使用
前言 SpringCloud 是微服务中的翘楚,最佳的落地方案. Spring Cloud Gateway 是 Spring Cloud 新推出的网关框架,之前是 Netflix Zuul.网关通常在 ...
- 微服务网关 Spring Cloud Gateway
1. 为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...
- Spring Cloud gateway 网关服务二 断言、过滤器
微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...
随机推荐
- elasticsearch数据组织结构
elasticsearch数据组织结构 1. mapping 1.1. 简介 mapping:意为映射关系,特别是指组织结构.在此语境中可理解为数据结构,包括表结构,表约束,数据类型等 ...
- spark sql 访问mysql数据库
pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...
- gitlab回退到某次commit——本地+远程
## 查看所有commits记录$ git log ## gitlab回退到某次commit$ git reset --hard 3018a546427e1f865524b82b488d6a2721d ...
- 取消Oracle数据库密码期限 取消用户锁定
1.首先查用户被锁时间:sql>select username,account_status,lock_date from dba_users where username='SA'; 2.解锁 ...
- 【转】ssh 远程执行命令
原文:https://blog.csdn.net/liuxiao723846/article/details/82667482 SSH 是 Linux 下进行远程连接的基本工具,不光可以登录,也可以远 ...
- 2019最新整理JAVA面试题附答案
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
- Keras的TimeDistributed层
Keras的TimeDistributed层主要用途是在时间维度上进行全连接. 比如Faster RCNN,1张图生成了16个ROI,需要对每一个ROI进行分类和回归,ROI的维度是7×7×512,长 ...
- 面试问题之——给你图片的url,你能知道它所占的字节空间吗?
从一个需求说起 这标题起得有点标题党,实际情况是我最近在做一个公司内部工具时,遇到了这么一个需求,给定一个静态资源站点上某张图片的url(比如https://a.xxxcdn.com/demo.jpg ...
- word2vec 构建中文词向量
词向量作为文本的基本结构——词的模型,以其优越的性能,受到自然语言处理领域研究人员的青睐.良好的词向量可以达到语义相近的词在词向量空间里聚集在一起,这对后续的文本分类,文本聚类等等操作提供了便利,本文 ...
- 为小学生出四则运算题目.java
import java.util.Scanner; import java.util.Random; public class test{ public static int s1 = new Ran ...