抽丝剥茧,细说架构那些事——【优锐课】html
接着上篇文章:使用Spring Cloud Gateway保护反应式微服务(一)java
咱们继续~react
要在同一个IDE窗口中编辑全部三个项目,我发现建立聚合器pom.xml
颇有用。在项目的父目录中建立pom.xml
文件,而后将下面的XML复制到其中。git
|
建立此文件后,你应该可以在IDE中将其做为项目打开,并能够轻松地在项目之间导航。
在api-gateway
项目中,将@EnableEurekaClient
添加到主类以使其可以感知Eureka。
|
而后,修改src/main/resources/application.properties
文件以配置应用程序名称。
|
在ApiGatewayApplication
中建立一个RouteLocator
,以配置路由。 你可使用YAML配置Spring Cloud Gateway,但我更喜欢Java。
|
更改完这些代码后,你应该可以启动全部三个Spring Boot应用程序,并点击http://localhost:8080/cars.
|
建立一个/fave-cars
端点,以剔除你不喜欢的汽车。
首先,添加一个负载平衡的WebClient.Builder
bean。
|
而后在同一文件中的ApiGatewayApplication
类下添加Car POJO和FaveCarsController
。
|
使用WebClient检索汽车并过滤掉你不喜欢的汽车。
|
若是你没有使用为你自动导入的IDE,则须要将如下内容复制/粘贴到ApiGatewayApplication.java
的顶部:
|
从新启动网关应用程序以查看http://localhost:8080/fave-cars终结点仅返回ID Buzz。
在撰写本文时,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构建了一个具备弹性和反应性的微服务架构。如今,让咱们看看如何保护它!
若是你想在WebFlux应用程序中使用Feign,请参阅feign-reactive项目。在这个特定示例中,我不须要Feign。
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账户(若是你没有账户,请注册)。
将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以进行用户受权。
你可能不会在网关自己上为应用程序构建UI。 你可能会改用SPA或移动应用。 要将网关配置为充当资源服务器(查找带有承载令牌的Authorization
header),请在与主类相同的目录中添加新的SecurityConfiguration
类。
|
若是你在用户界面上使用SPA,则还须要配置CORS。你能够经过向该类添加CorsWebFilter
bean来实现。
|
确保你的进口商品与如下商品相符。
|
Spring Cloud Gateway的文档介绍了如何使用YAML或WebFluxConfigurer
配置CORS。不幸的是,我没法任其工做。
若是你在网关中配置了CORS,则能够测试它是否能够与WebTestClient一块儿使用。用如下代码替换ApiGatewayApplicationTests
中的代码。
|
ReactiveJwtDecoder
,以便你设置指望值并在解码时返回模拟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资源服务器。
|
从新启动你的汽车服务应用程序,如今它已受到匿名入侵者的保护。
|
启用安全性后,你在car-service
项目中添加的测试将再也不起做用。 修改CarServiceApplicationTests.java
中的代码,以将JWT访问令牌添加到每一个请求。
|
再次运行测试,一切都会经过!
你只需为网关与该受保护的服务进行一个小小的更改便可。这很是简单!
在ApiGatewayApplication.java
中,添加一个应用Spring Cloud Security的TokenRelayGatewayFilterFactory
的过滤器。
|
从新启动你的API网关,你应该可以查看http://localhost:8080/cars并使一切正常运行。
很好,你不以为吗?
感谢阅读!
另外近期整理了一套完整的java架构思惟导图,分享给一样正在认真学习的每位朋友~