抽絲剝繭,細說架構那些事——【優銳課】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架構思惟導圖,分享給一樣正在認真學習的每位朋友~