網站首頁 編程語言 正文
SpringCloud之Gateway統一網關
Gateway網關可以幫助處理一些校驗的問題。并不是所有的請求都可以請求到資源路徑,以及做一些身份驗證等等。
看黑馬的課程ppt都非常形象,摘錄出來。我們的客戶端訪問訪問我們的微服務的資源的時候需要通過這個網關。當然你要關閉其它的訪問路徑,讓訪問必須要經過這個網關。
網關對訪問進行校驗,校驗通過后就可以訪問到我們的微服務。當然網關內部是可以做很多的處理。我們下面說。微服務之間進行http客戶端Feign提供的接口實現服務之間的相關訪問調用。
這些都是·大概的淺顯的介紹,我們大概了解到Gateway網關類似于門鎖。
Gateway是SpringCloud提供的一種網關api,當然還有其它類型的api,zuul,Gateway這個性能還是比較好一些。
廢話不多說,我們直接嘗試去使用。
我們創建一個專門作為網關的模塊。
<!-- 引入nacos的服務發現依賴-->
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 網關gateway依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
然后我們還需要去配置一下相關的屬性信息。
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
server-addr: localhost:8848 # nacos 地址
gateway:
routes:
- id: user-service # 路由唯一標識
uri: lb://userservice #路由的目標地址,lb是負載均衡 userservice是服務名
predicates: #路由斷言,判斷請求是否符合規則
- Path=/user/** #路徑斷言,判斷路徑是否以/user開頭,如果符合就會分配到相應的路由
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
# - After=2023-01-20T17:42:47.789-07:00[Asia/Shanghai] #網關的時間的我路由規則
當然配置不止這些,我們舉例出這個來說明一些屬性。
一定要仔細分析圖啊!客戶端發來的請求,然后到達網關的路由,路由中會有一個路由斷言。
斷言我們可以認為它是一種判斷規則,根據斷言來分配到相應規則的路由目標地址。這里面的路由規則絕不是只有路徑的匹配,還有相關的過濾規則等等。
分配搭配相應的目標地址后我們會調用相關的微服務,這里微服務會有一個負載均衡的過程,因為一個服務可能會純在多個實例,這里會進行負載均衡。我們請求到對應的微服務實例后就可以訪問或者說請求到數據。
這樣的理解我認為是最簡單的理解方式。
需要了解的就是這樣的配置官方文檔會給出詳細的說明。
完全可以查閱去使用。
不要忘記去寫一個啟動類。因為網關本身也需要是一個服務。
看一些配置,斷言工廠
這個斷言工廠的斷言工廠是比較容易理解的,包括對請求頭,請求方式,cookies,等等的要求。
還有就是路由過濾器,這些可以去spring的路由過濾器工廠去找。它是對請求或者響應做出處理。
上面這個是路由過濾器,要想全局可以這樣配,可以對所有路由生效。功能是全局,但是并不叫全局過濾器。
下面這個才叫全局過濾器
不過這個全局過濾器并不是通過配置文件,需要我們寫一段代碼。一定是需要去官方網站的文檔中進行查看的。
官方文檔給出了這個說明,總之我們需要實現一個接口,我們按照這個實現我們的邏輯就可以了。
package com.jgdabc.gateway;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
@Order(-1)//這個值指定的大小說明了該過濾器的優先級,值小優先級高
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//獲取請求參數
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> params = request.getQueryParams();
String authorization = params.getFirst("Authorization");
if ("admin".equals(authorization))
{
return chain.filter(exchange);
}
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
return exchange.getResponse().setComplete();
// 獲取參數中的authorization
// 判斷然后給出處理邏輯
}
}
現在我們測試,注意我們從網關走
我們不加Authorization是通不過網關的。
加上Authorization并匹配正確值
這樣我們就驗證了。后面的邏輯其實都是基于這個開展的。
我們這邊認識到了三個過濾器,來看執行順序。
全局過濾器我們可以在注解中指定order的值,值小,優先級別高。
網關這邊的知識還存在一個跨域的問題。主要是瀏覽器的同源策略。是一種安全措施。具體來看一點,我覺得文章寫的挺不錯的。
一文帶你了解跨域原理與解決辦法
我們后端服務處理這個問題的思路就是CORS方案。CORS是什么,上面鏈接文章有說明,就不贅述了。
? 由于同源策略的限制,AJAX請求是不允許進行跨域請求的,這是比較典型的。
spring官方文章有對此的的處理模板
你還可以設置其他的參數比如
這些都是淺顯的介紹,就說這么多吧。
原文鏈接:https://blog.csdn.net/jgdabc/article/details/125739282
相關推薦
- 2022-06-06 typescript中abstractClass(抽象類)、extends、abstract
- 2023-02-28 ts之 命名空間 namespace、三斜線指令、聲明文件(declare 聲明ts的變量函數第三方
- 2022-09-18 iOS開發底層探索界面優化示例詳解_IOS
- 2023-05-30 Python賦值邏輯的實現_python
- 2022-07-03 C語言詳細講解const的用法_C 語言
- 2022-05-15 Qt中QPixmap、QImage、QPicture、QBitmap四者區別詳解_C 語言
- 2022-10-07 C++函數指針與指針函數有哪些關系和區別_C 語言
- 2022-09-24 如何將一個CSV格式的文件分割成兩個CSV文件_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支