網站首頁 編程語言 正文
學習SprinngCloud到了網關這一組件,照例簡單記錄下網關的作用
網關有以下幾個作用:
- 統一入口:未全部為服務提供一個唯一的入口,網關起到外部和內部隔離的作用,保障了后臺服務的安全性。
- 鑒權校驗:識別每個請求的權限,拒絕不符合要求的請求。
- 動態路由:動態的將請求路由到不同的后端集群中。
- 減少客戶端與服務端的耦合:服務可以獨立發展,通過網關層來做映射。
?
在1.x版本中都是采用Zuul網關。但是在2.x版本中,zuul的升級一直跳票,SpringCloud最后自己研發了一個網關代替Zuul,就是SpringCloud Gateway,Gateway就是原zuul1.x版的替代。
Spring Cloud Gateway 里明確的區分了 Router 和 Filter,并且一個很大的特點是內置了非常多的開箱即用功能,并且都可以通過 SpringBoot 配置或者手工編碼鏈式調用來使用。
比如內置了 10 種 Router,使得我們可以直接配置一下就可以隨心所欲的根據 Header、或者 Path、或者 Host、或者 Query 來做路由。
比如區分了一般的 Filter 和全局 Filter,內置了 20 種 Filter 和 9 種全局 Filter,也都可以直接用。當然自定義 Filter 也非常方便。
接著開始實戰,首先創建一個新的moudule,就叫gateway
?然后引入依賴
<!-- gateway網關 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--eureka客戶端依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
接著創建啟動類
package com.wl.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author wl
* @date 2022/3/7 16:34
*/
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
System.out.println("o(* ̄▽ ̄*)o啟動成功!!!?(? ???ω??? ?)?");
}
}
然后對配置文件進行配置
server:
port: 10010
spring:
application:
name: gateway
cloud:
gateway:
# 網關路由配置
routes:
- id: user-service
# lb表示負債均衡
uri: lb://user-service
# 斷言
predicates:
# 按照路徑匹配
- Path=/user/**
# 過濾器
filters:
- AddRequestHeader=topic, wl is a good man
其中predicates意為斷言,配置Path=/user/**表示只有以/user開頭的請求路徑才會放行,否則攔截。除了可以按路徑匹配,還可以設置按時間,比如Before=xx時間表示在xx時間前放行,After=xx時間表示在xx時間后放行,一共有11種選項可進行配置
?filter過濾器則可以對請求和響應進行修改處理,此處配置為給user-service這個服務的請求頭添加一段話。Spring Cloud Gateway 內置的過濾器工廠一覽表如下:
?啟動服務,訪問10010端口,如圖
?除此以外,還有一個GlobalFilter可以作為全局的過濾器,這里同樣參考黑馬程序員視頻寫了個小例子,針對權限為admin的用戶放行,否則攔截。
package com.wl.gateway.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
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;
/**
* @author wl
* @date 2022/3/7 17:00
*/
@Order(Ordered.HIGHEST_PRECEDENCE)
@Component
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.獲取請求參數
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> queryParams = request.getQueryParams();
//2.獲取請求參數中的authorization參數
String authorize = queryParams.getFirst("authorization");
//3.判斷參數是否等于admin
if ("admin".equals(authorize)) {
//4.是,放行
return chain.filter(exchange);
}
//5.1 設置狀態碼
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//5.2 攔截請求
return exchange.getResponse().setComplete();
}
}
重新啟動,再次訪問
?顯示401,在url后面加上?authorization=admin再次訪問
?另外,如果有多個過濾器,可以配置@Order注解里的數字來進行排序,數字越小,執行順序越靠前。
原文鏈接:https://blog.csdn.net/wl_Honest/article/details/123335679
相關推薦
- 2023-01-15 GoLang?RabbitMQ?TTL與死信隊列以及延遲隊列詳細講解_Golang
- 2022-02-19 Android~日志工具Log
- 2022-07-18 python中數組array和列表list的基本用法及區別解析_python
- 2022-03-27 Android自定義模擬時鐘控件_Android
- 2022-06-01 ASP.Net?Core中的日志與分布式鏈路追蹤_實用技巧
- 2022-10-30 詳解Python?中的命名空間、變量和范圍_python
- 2022-03-19 關于docker中?WSL?配置與修改問題_docker
- 2022-04-20 Python設計模式結構型代理模式_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同步修改后的遠程分支