【Spring Cloud】API網關

目錄

  • 什么是API網關
  • 為什么需要API網關
    • 前言
    • 問題列表
  • API網關解決了什么問題
    • 常見的網關解決方案
    • Nginx+Lua
    • Spring Cloud Netflix Zuul
      • SpringCloud Zuul的IO模型
        • 弊端
    • Spring Cloud Gateway
  • 第二代網關——Gateway
    • Gateway的特征
    • Spring Cloud Gateway的處理流程
    • Spring Cloud Gateway的相關概念
      • Route(路由)
      • Predicate(斷言)
      • Filter(過濾器)
  • 案例
    • 需求
    • 搭建Gateway微服務網關
      • 1.創建項目
      • 2.添加Gateway依賴
      • 3.修改配置——基礎URI的路由配置方式
        • 配置解析
  • 網關過濾器
    • 為網關添加過濾器
      • 1.在上述案例的基礎上,創建AuthGlobalFilter并實現GlobalFilter、Ordered接口
      • 2.重寫方法
      • 3.filter方法驗證token參數
      • 4.添加過濾器定義
      • 5.驗證

什么是API網關

  • API Gateway(API 網關),顧名思義,是出現在系統邊界上的一個面向 API 的、串行集中式的強管控服務,這里的邊界是企業 IT 系統的邊界,可以理解為企業級應用防火墻,主要起到隔離外部訪問與內部系統的作用。在微服務概念的流行之前,API 網關就已經誕生了,例如銀行、證券等領域常見的前置機系統,它也是解決訪問認證、報文轉換、訪問統計等問題的問題列表。
  • API 網關的流行,源于近幾年來移動應用與企業間互聯需求的興起。移動應用、企業互聯,使得后臺服務支持的對象,從以前單一的Web應用,擴展到多種使用場景,且每種使用場景對后臺服務的要求都不盡相同。這不僅增加了后臺服務的響應量,還增加了后臺服務的復雜性。隨著微服務架構概念的提出,API網關成為了微服務架構的一個標配組件。
  • API 網關是一個服務器,是系統對外的唯一入口。API 網關封裝了系統內部架構,為每個客戶端提供定制的 API。所有的客戶端和消費端都通過統一的網關接入微服務,在網關層處理所有非業務功能。API 網關并不是微服務場景中必須的組件。

在這里插入圖片描述

為什么需要API網關

前言

  • 不同的微服務一般會有不同的網絡地址,而外部客戶端可能需要調用多個服務的接口才能完成一個業務需求,如果讓客戶端直接與各個微服務通信,會有以下的問題

問題列表

  • 客戶端會多次請求不同的微服務,增加了客戶端的復雜性。
  • 存在跨域請求,在一定場景下處理相對復雜。
  • 認證復雜,每個服務都需要獨立認證。
  • 難以重構,隨著項目的迭代,可能需要重新劃分微服務。例如,可能將多個服務合并成一個或者將一個服務拆分成多個。如果客戶端直接與微服務通信,那么重構將會很難實施。
  • 某些微服務可能使用了防火墻 / 瀏覽器不友好的協議,直接訪問會有一定的困難。

API網關解決了什么問題

在這里插入圖片描述

常見的網關解決方案

Nginx+Lua

  • Nginx 適合做門戶網關,是作為整個全局的網關。
  • Gateway 可以實現熔斷、重試等功能,這是 Nginx 不具備的。

Spring Cloud Netflix Zuul

  • Zuul 是 Netflix 公司開源的一個 API 網關組件,Spring Cloud 對其進行二次基于 Spring Boot 的注解式封裝做到開箱即用。
  • 可以做到請求轉發,根據配置或者默認的路由規則進行路由和 Load Balance,無縫集成 Hystrix。

SpringCloud Zuul的IO模型

  • Zuul 是Netflix出品的開源微服務網關,可與 Eureka、Ribbon、Hystrix 等組件配合使用,
  • Zuul 的核心是一系列過濾器
  • Spring Cloud中所集成的Zuul版本,采用的是Tomcat容器,使用的是傳統的Servlet IO處理模型。
弊端
  • servlet是一個簡單的網絡IO模型,當請求進入servlet container時,servlet container就會為其綁定一個線程,在并發不高的場景下這種模型是適用的
  • 但是一旦并發上升,線程數量就會上漲,而線程資源代價是昂貴的(上線文切換,內存消耗大)嚴重影響請求的處理時間。
  • 在一些簡單的業務場景下,不希望為每個request分配一個線程,只需要1個或幾個線程就能應對極大并發的請求,這種業務場景下servlet模型沒有優勢。

Spring Cloud Gateway

  • Spring Cloud官方推出的第二代網關框架,性能顯著提升;

第二代網關——Gateway

  • SpringCloud Gateway 是 Spring Cloud 的一個全新項目,該項目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技術開發的網關,它旨在為微服務架構提供一種簡單有效的統一的 API 路由管理方式。
  • SpringCloud Gateway 作為 Spring Cloud 生態系統中的網關,目標是替代 Zuul。而為了提升網關的性能,SpringCloud Gateway是基于WebFlux框架實現的,而WebFlux框架底層則使用了高性能的Reactor模式通信框架Netty。
  • Spring Cloud Gateway 的目標,不僅提供統一的路由方式,并且基于 Filter 鏈的方式提供了網關基本的功能,例如:安全,監控/指標,和限流。

Gateway的特征

  • 基于Spring Framework 5、Project Reactor和Spring Boot 2.0構建
  • 能夠在任意請求屬性上匹配路由
  • predicates(謂詞) 和 filters(過濾器)是特定于路由的
  • 集成了Hystrix斷路器
  • 集成了Spring Cloud DiscoveryClient
  • 易于編寫謂詞和過濾器
  • 請求速率限制
  • 路徑重寫

Spring Cloud Gateway的處理流程

  1. 客戶端向 Spring Cloud Gateway 發出請求。
  2. 然后在 Gateway Handler Mapping 中找到與請求相匹配的路由,將其發送到 Gateway Web Handler。
  3. Handler 再通過指定的過濾器鏈來將請求發送到我們實際的服務執行業務邏輯,然后返回。
  4. 過濾器之間用虛線分開是因為過濾器可能會在發送代理請求之前(“pre”)或之后(“post”)執行業務邏輯。

在這里插入圖片描述

Spring Cloud Gateway的相關概念

Route(路由)

  • 網關配置的基本組成模塊,和Zuul的路由配置模塊類似。
  • 一個Route模塊由一個 ID,一個目標 URI,一組斷言和一組過濾器定義。
  • 如果斷言為真,則路由匹配,目標URI會被訪問。

Predicate(斷言)

  • 這是一個 Java 8 的 Predicate,可以使用它來匹配來自 HTTP 請求的任何內容,
  • 例如 headers 或參數。斷言的輸入類型是一個 ServerWebExchange。

Filter(過濾器)

  • 和Zuul的過濾器在概念上類似,可以使用它攔截和修改請求,并且對上游的響應,進行二次處理。
  • 過濾器為org.springframework.cloud.gateway.filter.GatewayFilter類的實例。

案例

需求

  • 提供三個微服務EurekaServer、Consumer端、Provider端
  • 通過網關轉發微服務請求
    • 要求訪問Gateway網關,然后轉發請求到Consumer端,然后繼續調取Provider端服務

搭建Gateway微服務網關

1.創建項目

指定artifactId為:demo-gateway

2.添加Gateway依賴

  • 還要添加Spring Cloud依賴,此處省略
        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

3.修改配置——基礎URI的路由配置方式

  • 指定服務端口、Eureka Server地址等信息
spring:application:name: demo-gatewaycloud:gateway:routes:- id: user-consumer-1uri: lb://demo-user-consumerpredicates:- Path=/api/user/**config:uri: http://localhost:7600label: devprofile: dev
eureka:client:service-url:defaultZone: http://192.168.2.220:7776/eureka
配置解析
屬性解釋
id我們自定義的路由 ID,保持唯一
uri目標服務地址, lb代表從注冊中心獲取服務
predicates路由條件,Predicate 接受一個輸入參數,返回一個布爾值結果。該接口包含多種默認方法來將 Predicate 組合成其他復雜邏輯。
Path轉發地址格式
filters過濾器鏈
StripPrefix作用是去掉請求路徑的最前面n個部分截取掉,StripPrefix=1就代表截取路徑的個數為1,比如前端過來請求http://localhost:8085/user/login,匹配成功后,路由到后端的請求路徑就會變成http://localhost:8082/login

網關過濾器

  • 每個服務在處理請求的時候都要判斷是否驗證token
  • 需要驗證token是否有效
  • 效率低
    • 每個請求都需要轉發到具體的微服務后再判斷,然后將判斷的結果回轉給網關
  • 在網關轉發前就行進過濾處理
    • 過濾器

為網關添加過濾器

創建網關過濾器

1.在上述案例的基礎上,創建AuthGlobalFilter并實現GlobalFilter、Ordered接口

2.重寫方法

  • filter:過濾器實現
  • getOrder():過濾順序

3.filter方法驗證token參數

public class AuthGlobalFilter implements org.springframework.cloud.gateway.filter.GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getHeaders().getFirst("token");if (token == null || token.isEmpty()) {System.out.println("token為空,不能通過");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

4.添加過濾器定義

修改啟動類,添加方法

    @Beanpublic AuthGlobalFilter globalFilter() {return new GlobalFilter();}

5.驗證

  • 請求接口
  • 分別攜帶token和不攜帶token驗證請求結果

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

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

相關文章

數據集要點和難點以及具體應用案例

數據集(Data set),又稱為資料集、數據集合或資料集合,是一種由數據所組成的集合。它通常以表格形式出現,其中每一列代表一個特定變量,每一行對應于某一成員的數據集的問題。數據集列出的價值觀為每一個變量,如身高和體重的一個物體或價值的隨機數,每個數值被稱為數據資…

我的又一個神奇的框架——Skins換膚框架

為什么會有換膚的需求 app的換膚&#xff0c;可以降低app用戶的審美疲勞。再好的UI設計&#xff0c;一直不變的話&#xff0c;也會對用戶體驗大打折扣&#xff0c;即使表面上不說&#xff0c;但心里或多或少會有些難受。所以app的界面要適當的改版啊&#xff0c;要不然可難受死…

Android Surface對應的Buffer怎么傳遞給HWC

Android Surface對應的Buffer怎么傳遞給HWC 引言 因為要預研Android Video overlay&#xff0c;需要將SurfaceView對應的GraphicBuffer從drm_hwcomposer中剝離出來&#xff0c;這就需要們了解SurfaceView對應的GraphicBuffer的前世今生&#xff0c;以及它的數據流向以及在各個…

輕兔推薦 —— vfox

簡介 vfox 是一個跨平臺且可擴展的版本管理工具&#xff0c;終于有一個可以管理所有運行環境的工具了 - 支持一鍵安裝 Java、Node.js、Flutter、.Net、Golang、PHP、Python等多種環境 - 支持一鍵切換不同版本 特點 支持Windows(非WSL)、Linux、macOS! 支持不同項目不同版本、…

(四)事件系統

視頻鏈接:尚硅谷2024最新版微信小程序 文章目錄 事件綁定和事件對象事件分類以及阻止事件冒泡事件傳參-data-*自定義數據事件傳參-mark 自定義數據事件綁定和事件對象 小程序中綁定事件與在網頁開發中綁定事件幾乎一致,只不過在小程序不能通過 on 的方式綁定事件,也沒有 cli…

C# 9.0的init訪問器

不控制可變性 下面是我們最常見的屬性聲明方式&#xff0c;允許屬性在類的內部和外部都可以讀取和修改 public int Id { get; set; }namespace Demo {public class Company{public int Id { get; set; }public Company(){}public Company(int id){Id id; // 可以在構造函數中…

22.Volatile原理

文章目錄 Volatile原理1.Volatile語義中的內存屏障1.1.volatile寫操作的內存屏障1.1.1.StoreStore 屏障1.1.2.StoreLoad 屏障 1.2.volatile讀操作的內存屏障1.2.1.LoadStore屏障1.2.2.LoadLoad屏障 2.volatile不具備原子性2.1.原理 Volatile原理 1.Volatile語義中的內存屏障 在…

用于生成 Avatar 的文本引導式情感和運動控制-InstructAvatar

網址 https://wangyuchi369.github.io/InstructAvatar/ 用于生成 Avatar 的文本引導式情感和運動控制 官網翻譯 最近的會說話的頭像生成模型在實現與音頻的真實和準確的嘴唇同步方面取得了長足的進步&#xff0c;但在控制和傳達頭像的詳細表情和情感方面往往存在不足&#…

APM2.8如何做加速度校準

加速度的校準建議準備一個六面平整&#xff0c;邊角整齊的方形硬紙盒或者塑料盒&#xff0c;如下圖所示&#xff0c;我們將以它作為APM校準時的水平垂直姿態參考&#xff0c;另外當然還需要一塊水平的桌面或者地面 首先用雙面泡沫膠或者螺絲將APM主板正面向上固定于方形盒子上&…

JavaScrip原型對象

參考 JavaScrip原型對象 | LogDicthttps://www.logdict.com/archives/javascripyuan-xing-mo-shi

每天寫兩道(二)LRU緩存、

146.LRU 緩存 . - 力扣&#xff08;LeetCode&#xff09; 請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 實現 LRUCache 類&#xff1a; LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存int get(int key) 如果關鍵字 key 存在于緩存…

如何使用Python和大模型進行數據分析和文本生成

如何使用Python和大模型進行數據分析和文本生成 Python語言以其簡潔和強大的特性&#xff0c;成為了數據科學、機器學習和人工智能開發的首選語言之一。隨著大模型&#xff08;Large Language Models, LLMs&#xff09;如GPT-4的崛起&#xff0c;我們能夠利用這些模型實現諸多…

Revit——(2)模型的編輯、軸網和標高

目錄 一、關閉縮小的隱藏窗口 二、標高&#xff08;可創建平面&#xff0c;其他標高線復制即可&#xff09; 三、軸網 周圍的四個圈和三角表示四個里面&#xff0c;可以移動&#xff0c;不要刪除 一、關閉縮小的隱藏窗口 二、標高&#xff08;可創建平面&#xff0c;其他標…

計算機體系結構期末快速復習

文章目錄 前言CPI&#xff0c;MIPS&#xff08;大題1&#xff09;加速比&#xff08;大題2&#xff09;流水線&#xff08;大題3&#xff09;CRAY-1向量機&#xff08;大題4&#xff09;Tomasulo算法&#xff08;大題5&#xff09;概念簡答題計算機系統結構的經典定義什么是透明…

深入分析 Android Activity (二)

文章目錄 深入分析 Android Activity (二)1. Activity 的啟動模式&#xff08;Launch Modes&#xff09;1.1 標準模式&#xff08;standard&#xff09;1.2 單頂模式&#xff08;singleTop&#xff09;1.3 單任務模式&#xff08;singleTask&#xff09;1.4 單實例模式&#xf…

利用邊緣計算網關的工業設備數據采集方案探討-天拓四方

隨著工業4.0時代的到來&#xff0c;工業設備數據采集成為了實現智能制造、提升生產效率的關鍵環節。傳統的數據采集方案往往依賴于中心化的數據處理方式&#xff0c;但這種方式在面對海量數據、實時性要求高的工業場景時&#xff0c;往往顯得力不從心。因此&#xff0c;利用邊緣…

CSS實現一個雨滴滑落效果

使用純CSS來實現一個真實的雨滴滑落效果可能會有些挑戰&#xff0c;因為CSS主要關注于靜態樣式和簡單的動畫效果。然而&#xff0c;你可以使用CSS動畫和keyframes來模擬一個雨滴滑落的簡化效果。 以下是一個基本的示例&#xff0c;展示如何使用CSS來模擬雨滴從頂部滑落到底部的…

AI學習指南數學工具篇-MATLAB中的凸優化工具

AI學習指南數學工具篇-MATLAB中的凸優化工具 在人工智能領域&#xff0c;凸優化是一個非常重要的數學工具&#xff0c;它在機器學習、深度學習、數據分析等領域都有著廣泛的應用。而MATLAB作為一款強大的數學工具軟件&#xff0c;提供了豐富的凸優化工具和函數&#xff0c;為用…

二叉樹的鏈式結構(二叉樹)與順序結構(堆)---數據結構

一、樹的概念與結構 1、樹的概念 樹是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系的集合。我們常把它叫做樹&#xff0c;是因為它看起來像一棵倒掛的樹&#xff0c;它的根是朝上的&#xff0c;而葉是朝下的。 下面…

給我一個用斷言結果執行下一步的例子

在使用 pytest 和 Selenium 進行自動化測試時&#xff0c;通常我們會根據斷言的結果來決定測試流程的走向。如果斷言失敗&#xff0c;測試通常會停止執行后續的步驟&#xff0c;因為失敗意味著被測系統沒有按照預期工作。然而&#xff0c;有時候我們可能需要在斷言失敗后執行特…