使用Spring Cloud Gateway保护反应式微服务(二)
抽丝剥茧,细说架构那些事——【优锐课】
接着上篇文章:使用Spring Cloud Gateway保护反应式微服务(一)
我们继续~
将Spring Cloud Gateway与反应式微服务一起使用
要在同一个IDE窗口中编辑所有三个项目,我发现创建聚合器pom.xml
很有用。在项目的父目录中创建pom.xml
文件,然后将下面的XML复制到其中。
|
创建此文件后,你应该能够在IDE中将其作为项目打开,并可以轻松地在项目之间导航。
在api-gateway
项目中,将@EnableEurekaClient
添加到主类以使其能够感知Eureka。
|
然后,修改src/main/resources/application.properties
文件以配置应用程序名称。
|
在ApiGatewayApplication
中创建一个RouteLocator
,以配置路由。 你可以使用YAML配置Spring Cloud Gateway,但我更喜欢Java。
|
更改完这些代码后,你应该能够启动所有三个Spring Boot应用程序,并点击http://localhost:8080/cars.
|
添加REST API来检索你喜欢的汽车
创建一个/fave-cars
端点,以剔除你不喜欢的汽车。
首先,添加一个负载平衡的WebClient.Builder
bean。
|
然后在同一文件中的ApiGatewayApplication
类下添加Car POJO和FaveCarsController
。
|
使用WebClient检索汽车并过滤掉你不喜欢的汽车。
|
如果你没有使用为你自动导入的IDE,则需要将以下内容复制/粘贴到ApiGatewayApplication.java
的顶部:
|
重新启动网关应用程序以查看http://localhost:8080/fave-cars终结点仅返回ID Buzz。
Hystrix的故障转移呢?
在撰写本文时,Spring Cloud Gateway仅支持Hystrix。 Spring Cloud不赞成直接支持Hystrix,而是使用Spring Cloud Breaker。 不幸的是,该库尚未发布GA版本,因此我决定不使用它。
要将Hystrix与Spring Cloud Gateway结合使用,可以向car-service
路线添加过滤器,如下所示:
|
然后创建一个CarsFallback
控制器来处理/cars-fallback
路由。
|
首先,重新启动网关,并确认http://localhost:8080/cars可以正常工作。然后关闭汽车服务,再试一次,你会看到它现在返回一个空数组。重新启动汽车服务,你会再次看到该列表。
你已经使用Spring Cloud Gateway和Spring WebFlux构建了一个具有弹性和反应性的微服务架构。现在,让我们看看如何保护它!
Feign与Spring Cloud Gateway怎么样?
如果你想在WebFlux应用程序中使用Feign,请参阅feign-reactive项目。在这个特定示例中,我不需要Feign。
具有OAuth 2.0的安全Spring Cloud GatewaySecure
OAuth 2.0是用于委托访问API的授权框架。OIDC(或OpenID Connect)是OAuth 2.0之上的薄层,可提供身份验证。Spring Security对这两个框架都有出色的支持,Okta也是如此。
你可以通过构建自己的服务器或使用开源实现,在不使用云身份提供商的情况下使用OAuth 2.0和OIDC。但是,你不是要使用像Okta这样一直在线的东西吗?
如果你已经拥有Okta帐户,请参见下面的在Okta中创建Web应用程序。否则,我们创建了一个Maven插件,该插件配置了一个免费的Okta开发人员帐户+一个OIDC应用程序(不到一分钟!)。
要使用它,请运行:./mvnw com.okta:okta-maven-plugin:setup
创建一个帐户并配置你的Spring Boot应用程序以与Okta一起使用。
在Okta中创建Web应用程序
登录你的Okta Developer帐户(如果你没有帐户,请注册)。
- 在“Applications”页面上,选择“Add Application”。
- 在“Create New Application”页面上,选择“ Web”。
- 给你的应用程序起一个令人难忘的名称,将http://localhost:8080/login/oauth2/code/okta添加为登录重定向URI,选择“Refresh Token”(除了“Authorization Code”),然后单击“Done”。
将issuer(位于API > Authorization Servers下),客户端ID和客户端密钥复制到两个项目的application.properties
中。
|
接下来,将Okta Spring Boot starter和Spring Cloud Security添加到网关的pom.xml
中:
|
这就是添加Okta OIDC登录所需要做的一切!重新启动你的Gateway应用,并在浏览器中导航到http://localhost:8080/fave-cars,以将其重定向到Okta以进行用户授权。
使你的网关成为OAuth 2.0资源服务器
你可能不会在网关本身上为应用程序构建UI。 你可能会改用SPA或移动应用。 要将网关配置为充当资源服务器(查找带有承载令牌的Authorization
header),请在与主类相同的目录中添加新的SecurityConfiguration
类。
|
带有Spring Cloud Gateway的CORS
如果你在用户界面上使用SPA,则还需要配置CORS。你可以通过向该类添加CorsWebFilter
bean来实现。
|
确保你的进口商品与以下商品相符。
|
Spring Cloud Gateway的文档介绍了如何使用YAML或WebFluxConfigurer
配置CORS。不幸的是,我无法任其工作。
使用WebTestClient和JWT测试网关
如果你在网关中配置了CORS,则可以测试它是否可以与WebTestClient一起使用。用以下代码替换ApiGatewayApplicationTests
中的代码。
|
- 模拟
ReactiveJwtDecoder
,以便你设置期望值并在解码时返回模拟 - 创建一个新的JWT
- 解码后返回相同的JWT
- 将JWT添加到带有
Bearer
前缀的Authorization
header
我喜欢WebTestClient
如何让你如此轻松地设置security headers!你已将Spring Cloud Gateway配置为使用OIDC登录并充当OAuth 2.0资源服务器,但是car服务仍在端口8081
上可用。请修复此问题,以便只有网关可以与它对话。
微服务通信的安全网关
将Okta Spring Boot启动器添加到car-service/pom.xml
:
|
将okta.*
属性从网关的application.properties
复制到汽车服务的属性。然后创建一个SecurityConfiguration
类,使该应用程序成为OAuth 2.0资源服务器。
|
重新启动你的汽车服务应用程序,现在它已受到匿名入侵者的保护。
|
使用WebTestClient和JWT测试你的微服务
启用安全性后,你在car-service
项目中添加的测试将不再起作用。 修改CarServiceApplicationTests.java
中的代码,以将JWT访问令牌添加到每个请求。
|
再次运行测试,一切都会通过!
中继访问令牌:网关到微服务
你只需为网关与该受保护的服务进行一个小小的更改即可。这非常简单!
在ApiGatewayApplication.java
中,添加一个应用Spring Cloud Security的TokenRelayGatewayFilterFactory
的过滤器。
|
重新启动你的API网关,你应该能够查看http://localhost:8080/cars并使一切正常运行。
很好,你不觉得吗?
感谢阅读!
另外近期整理了一套完整的java架构思维导图,分享给同样正在认真学习的每位朋友~
使用Spring Cloud Gateway保护反应式微服务(二)的更多相关文章
- 使用Spring Cloud Gateway保护反应式微服务(一)
反应式编程是使你的应用程序更高效的一种越来越流行的方式.响应式应用程序异步调用响应,而不是调用资源并等待响应.这使他们可以释放处理能力,仅在必要时执行处理,并且比其他系统更有效地扩展. Java生态系 ...
- 微服务网关实战——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 ...
随机推荐
- 360网安学习笔记——Web安全原理与实践
网络安全 基本技能: 1.编程语言 2.计算机网络 3.操作系统 4.office 专业技能 1.web安全 2.网络安全 3.渗透测试 4.代码审计 能力提升 1.书籍 2.站点 3.安全平台 We ...
- ➡️➡️➡️IELTS reading by Simon on Bili
高分必备 雅思考官Simon手把手教你做阅读 p1 https://www.bilibili.com/video/av40131278?p=2 p2 https://www.bilibili.com/ ...
- 关于 UIDatePicker 在iOS9 系统上的一个坑
在使用 UIDatePicker时,在iOS9系统上上遇到一个很奇怪的问题,在其他系统版本中没发现,设置年月日格式显示的视图,在iOS9设备上出现中间月份无法显示的问题: 检查代码没问题,这个视图是使 ...
- [C++基本语法:从菜鸟变成大佬系列,就像1,2,3那么简单](七):C++的修饰符
修饰符是什么? C++允许char,int和double数据类型在它们之前有修饰符.修饰符用于改变基本类型的含义,以便更精确地满足各种情况的需要. 这里列出了数据类型修饰符: signed unsig ...
- android的ListAdapter简单用法
ListAdapter是一个整个Activity有且仅有一个ListView控件的Activity 使用步骤:1. 创建MyListViewAdapter(类名可以自定义) extends ListA ...
- UIKeyWindow的设置
新建一个纯代码iOS项目,需要对AppDelegate文件和项目的Info.plist文件做一番配置. 第一步:将Info.plist中的下面两项的value删除掉(保留空字符串),如下图 第二步:在 ...
- JavaScript高级特征之面向对象笔记二
Prototype 1. 当声明一个函数的时候,浏览器会自动为该函数添加一个属性prototype, 2. 该属性的默认值为{} 3. 可以动态的给prototype增加key和value值 4 ...
- 用Jackson进行Json序列化时的常用注解
Jackson时spring boot默认使用的json格式化的包,它的几个常用注解: @JsonIgnore 用在属性上面,在序列化和反序列化时都自动忽略掉该属性 @JsonProperty(&qu ...
- C# Stream篇(三) -- TextWriter 和 StreamWriter---转载
C# Stream篇(三) -- TextWriter 和 StreamWriter TextWriter 和 StreamWriter 目录: 为何介绍TextWriter? TextWriter的 ...
- python绘制疫情图
python中进行图表绘制的库主要有两个:matplotlib 和 pyecharts, 相比较而言: matplotlib中提供了BaseMap可以用于地图的绘制,但是个人觉得其绘制的地图不太美观, ...