微服務-GateWay(網關)

所謂網關是什么意思?

? ? ? ?相當于就是你們小區家的保安,進出小區都得獲得保安的同意,守護你們小區的生命財產健康,網關也是如此,對每個請求都嚴格把關,將合法的或者是獲得權限的請求進入服務器

網關的功能:

  • 身份驗證和權限校驗
  • 服務路由、負載均衡
  • 請求限流

?一般的常見的網關分別是:

Gateway:基于Spring5中提供的WebFlux,屬于響應式編程的實現,具有更好的性能

zuul:基于servlet的實現,屬于阻塞式編程

搭建網關服務

1.創建新的module,引入SpringCloudGateway的依賴和nacos的服務發現依賴:

   <!--nacos服務注冊發現依賴--><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>

2.編寫路由配置即nacos地址:

server:port: 10010
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:routes:- id: user-service # 路由標示,必須唯一uri: lb://userservice # 路由的目標地址predicates: # 路由斷言,判斷請求是否符合規則- Path=/user/** # 路徑斷言,判斷路徑是否是以/user開頭,如果是則符合

總結:

網關搭建的步驟:

1.創建項目,引入nacos服務發現和gateway依賴

2.配置application.yml,包括服務基本信息、nacos地址、路由

路由配置包括:

1.理由id:路由的唯一標識

2.路由目標:路由的目標地址,http代表固定地址,lb代表根據服務名負載均衡

3路由斷言:判斷路由的規則

4.路由過濾器:對去請求或響應做處理

路由斷言工廠(Route Predicate Factory)

網關路由可以配置的內容為:

  • 路由id:路由唯一標示
  • uri:路由目的地,支持lb和http兩種
  • predicates:路由斷言,判斷請求是否符合要求,符合則轉發到路由目的地

? ? ? ?配置文件中的規則只是字符串,這些字符串會被Predicate Factory讀取并處理,轉變為路由判斷的條件,例如“Path=/user/**”是按照路徑進行匹配,只讓以/user開頭的就認為是符合的

  • filter:路由過濾器,處理請求或響應

11種工廠:

?路由過濾器GatewayFilter

GatewayFilter是網關中提供的一種過濾器,可以對進入網關的請求和微服務返回的響應做處理

?下面列舉幾個Spring提供的不同的路由過濾器工廠:

現在要求給進入A服務的所有請求添加一個請求頭,你會怎么實現?

給某個服務單獨添加請求頭:

spring:cloud:gateway:routes:#網關路由配置- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**filters: #過濾器- AddRequestHeader=Truth,Itcast is freaking awesome!#添加請求頭

如果要對所有的路由都生效,即可將過濾工廠寫到default下,如:

spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:routes:- id: user-service # 路由標示,必須唯一uri: lb://userservice # 路由的目標地址predicates: # 路由斷言,判斷請求是否符合規則- Path=/user/** # 路徑斷言,判斷路徑是否是以/user開頭,如果是則符合- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**default-filters:#對所有的路由都生效的過濾器- AddRequestHeader=Truth,Itcast is freaking awesome!

全局過濾器

? ? ? ?全局過濾器的作用也是處理一切網關的請求和微服務響應,與GatewayFilter的作用一樣,區別在GatewayFilter通過配置定義,處理邏輯時固定的,而GlobalFilter的邏輯需要自己寫代碼實現,定義是實現GlobalFilter接口

//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.獲取請求參數ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> params = request.getQueryParams();// 2.獲取參數中的 authorization 參數String auth = params.getFirst("authorization");// 3.判斷參數值是否等于 adminif ("admin".equals(auth)) {// 4.是,放行return chain.filter(exchange);}// 5.否,攔截// 5.1.設置狀態碼exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 5.2.攔截請求return exchange.getResponse().setComplete();}@Overridepublic int getOrder() {return -1;}

步驟:

1.實現GlobalFilter接口

2.添加@Order注解或者實現Ordered接口

3.編寫處理邏輯

過濾器執行順序

  • ?每一個過濾器都必須指定一個int類型的order值,order值越小,優先級越高,執行順序越靠前
  • GlobalFilter通過實現Ordered接口,或者添加@Order注解來指定order值
  • 路由過濾器和defaultFilter的order由Spring指定,默認是按照聲明順序從1遞增
  • 當過濾器的order值一樣時,會按照defaultFilter>局部路由過濾器>GlobalFilter的順序執行

跨域問題

? ? ? ?跨域問題:域名不一致就是跨域。瀏覽器禁止請求的發起者與服務器發生跨域ajax請求,請求被瀏覽器攔截的問題

CORS:

spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:globalcors: #全年的跨域處理add-to-simple-url-handler-mapping: true #解決options請求被攔截問題corsconfigurations: '[/**]':allowedOrigins: #允許哪些網站的跨域請求-"http://127.0.0.1:8090"allowedMethods: #允許的跨域ajax的請求方式-"GET"-"POST"-"DELETE"-"PUT"-"OPTIONS"allowedHeaders: "*" #允許在請求中攜帶的頭信息allowCredentials: true #是否允許攜帶cookiemaxAge: 360000 #這次跨域檢測的有效期

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41115.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41115.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41115.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式之解釋器模式詳解及實例

1、解釋器設計模式概述&#xff1a; 解釋器模式&#xff08;Interpreter Pattern&#xff09;是一種設計模式&#xff0c;它主要用于描述如何構建一個解釋器以解釋特定的語言或表達式。該模式定義了一個文法表示和解釋器的類結構&#xff0c;用于解釋符合該文法規則的語句。解…

擴散模型實戰(四):從零構建擴散模型

推薦閱讀列表&#xff1a; 擴散模型實戰&#xff08;一&#xff09;&#xff1a;基本原理介紹 擴散模型實戰&#xff08;二&#xff09;&#xff1a;擴散模型的發展 擴散模型實戰&#xff08;三&#xff09;&#xff1a;擴散模型的應用 本文以MNIST數據集為例&#xff0c;從…

智能樓宇綜合布線實訓室建設方案

一、樓宇智能綜合布線實訓室方案概述 樓宇智能綜合布線實訓室方案旨在為學生提供一個真實的學習和實踐環境&#xff0c;以培養他們在樓宇智能綜合布線領域的實際操作能力和技能。以下是一個概述&#xff1a; 1. 培養目標&#xff1a;培養學生在樓宇智能綜合布線方面的綜合能力…

Shader學習(三)(片元著色器)

1、在片元著色器處理漫反射 // Upgrade NOTE: replaced _World2Object with unity_WorldToObjectShader "Custom/specularfragement" {properties{_sp("Specular",color) (1,1,1,1)_shiness("Shiness",range(1,64)) 8}SubShader{pass {tags{&…

深入理解設計模式-行為型之模板(和回調區別聯系)

概述 模板設計模式&#xff08;Template Design Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一個算法的骨架&#xff0c;將算法的一些步驟延遲到子類中實現。模板設計模式允許子類在不改變算法結構的情況下重新定義算法的某些步驟。 模板設計模式的核心思想…

網絡通信原理應用層(第五十一課)

1)DNS:域名解析系統,端口號TCP或UDP的53 2)域名注冊網站 -新網 www.xinnet.com -萬網-阿里云 www.net.cn -中國互聯 hulian.top 配置通過域名訪問網站(NETBASE第七課)_IHOPEDREAM的博客-CSDN博客 2、FTP 1)FTP概述 -文件傳輸協議 -控制連接:TCP 21 <

對redis、redisson、springcache總結

<一> redis-緩存中間件 什么是redis redis是c語言開發的&#xff0c;一個高性能key-value鍵值對內存數據庫&#xff0c;可以用來做數據庫、緩存、消息中間件的一種非關系型數據庫。 redis數據存儲在哪里 內存和磁盤中&#xff0c;但是redis的讀寫都在內存中&#xff0c;…

leetcode-413. 等差數列劃分(java)

等差數列劃分 leetcode-413. 等差數列劃分題目描述雙指針 上期經典算法 leetcode-413. 等差數列劃分 難度 - 中等 原題鏈接 - 等差數列劃分 題目描述 如果一個數列 至少有三個元素 &#xff0c;并且任意兩個相鄰元素之差相同&#xff0c;則稱該數列為等差數列。 例如&#xff0…

16 腦洞大開:GUI測試還能這么玩

頁面對象自動生成技術 頁面對象自動生成技術&#xff0c;屬于典型的“自動化你的自動化”的應用場景。它的基本思路是&#xff0c;你不用再手工維護 Page Class 了&#xff0c;只需要提供 Web 的 URL&#xff0c;它就會自動幫你生成這個頁面上所有控件的定位信息&#xff0c;并…

JMeter接口測試數據分離驅動應用

步驟&#xff1a; 創建csv文件&#xff0c;編寫接口測試用例 新建線程組——創建循環控制器&#xff08;循環次數填用例總數&#xff09; 創建CSV數據文件設置&#xff0c;設置參數。&#xff08;注意&#xff1a;是否允許帶引號&#xff1f;&#xff1a;一定要設置為true&a…

深度學習實戰48-【未來的專家團隊】基于AutoCompany模型的自動化企業概念設計與設想

大家好,我是微學AI,今天給大家介紹一下深度學習實戰48-【未來的專家團隊】基于AutoCompany模型的自動化企業概念設計與設想,文本將介紹AutoCompany模型的概念設計,涵蓋了AI智能公司的各個角色,并結合了GPT-4接口來實現各個角色的功能,設置中央控制器,公司運作過程會生成…

【MFC常用問題記錄】

MFC 記錄 MFC的edit control控件顯示1.控件添加變量M_edit后&#xff1a;2.控件ID為IDC_EDIT1: 線程函數使用 MFC的edit control控件顯示 1.控件添加變量M_edit后&#xff1a; CString str; int x 10; str.Format(_T("%d"),x); M_edit.SetWindowText(str)2.控件ID…

JMM內存模型之happens-before闡述

文章目錄 一、happens-before的定義二、happens-before的規則1. 程序順序規則&#xff1a;2. 監視器鎖規則&#xff1a;3. volatile變量規則&#xff1a;4. 傳遞性&#xff1a;5. start()規則&#xff1a;6. join()規則&#xff1a; 一、happens-before的定義 如果一個操作hap…

【編程二三事】ES究竟是個啥?

在最近的項目中&#xff0c;總是或多或少接觸到了搜索的能力。而在這些項目之中&#xff0c;或多或少都離不開一個中間件 - ElasticSearch。 今天忙里偷閑&#xff0c;就來好好了解下這個中間件是用來干什么的。 ES是什么? ? ES全稱ElasticSearch&#xff0c;是個基于Lucen…

性能優化的重要性

性能優化的重要性 性能優化的重要性摘要引言注意事項代碼示例及注釋性能優化的重要性 性能優化的重要性在 Java 中的體現響應速度資源利用效率擴展性與可維護性并發性能合理的鎖策略線程安全的數據結構并發工具類的應用避免競態條件和死鎖 總結代碼示例 博主 默語帶您 Go to Ne…

一張圖看懂 USDT三種類型地址 Omni、ERC20、TRC20的區別

USDT是當前實用最廣泛&#xff0c;市值最高的穩定幣&#xff0c;它是中心化的公司Tether發行的。在今年的4月17日之前&#xff0c;市場上存在著2種不同類型的USDT。4月17日又多了一種波場TRC20協議發行的USDT&#xff0c;它們各自有什么區別呢?哪個轉賬最快到賬&#xff1f;哪…

谷歌推出首款量子彈性 FIDO2 安全密鑰

谷歌在本周二宣布推出首個量子彈性 FIDO2 安全密鑰&#xff0c;作為其 OpenSK 安全密鑰計劃的一部分。 Elie Bursztein和Fabian Kaczmarczyck表示&#xff1a;這一開源硬件優化的實現采用了一種新穎的ECC/Dilithium混合簽名模式&#xff0c;它結合了ECC抵御標準攻擊的安全性和…

[LeetCode]矩陣對角線元素的和

解題 思路 1: 循環,找到主對角線的下標和副對角線的下標,如果矩陣長或寬為奇數的時候,需要減去中間公共的那一個值,中間公共的那個數的下標為mat[mat.size()/2][mat.size()/2]副對角線的下標為 mat [i][mat.size()-i-1] class Solution { public:int diagonalSum(vector<ve…

JVM中判定對象是否回收的的方法

引用計數法 引用計數法是一種垃圾回收&#xff08;Garbage Collection&#xff09;算法&#xff0c;用于自動管理內存中的對象。在引用計數法中&#xff0c;每個對象都有一個關聯的引用計數器&#xff0c;用于記錄對該對象的引用數量。 當一個新的引用指向對象時&#xff0c;…

Hive底層數據存儲格式

前言 在大數據領域,Hive是一種常用的數據倉庫工具,用于管理和處理大規模數據集。Hive底層支持多種數據存儲格式,這些格式對于數據存儲、查詢性能和壓縮效率等方面有不同的優缺點。本文將介紹Hive底層的三種主要數據存儲格式:文本文件格式、Parquet格式和ORC格式。 一、三…