SpringCloud網關介紹

84d0497bf9774b2084ba10b321da0f73.gif一、Gateway簡介

?

1、官網

上一代zuul 1.X:https://github.com/Netflix/zuul/wiki

?

當前gateway:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/

?

2、是什么

SpringCloud Gateway是SpringCloud的一個全新項目,基于Spring5.O+Springboot 2.0和ProjectReactor等技術開發的網關,它旨在為微服務架構提供一種簡單有效的統一的API路由管理方式。

?

SpringCloudGateway作為SpringCloud生態系統中的網關,目標是替代Zuul,在SpringCloud2.0以上版本中,沒有對新版本的zuul2.0以上最新高性能版本進行集成,仍然還是使用的Zuul 1.x非Reactor模式的老版本。而為了提升網關的性能,SpringCloud Gateway是基于WebFlux框架實現的,而webFlux框架底層則使用了高性能的Reactor模式通信框架Netty。

?

springCloudGateway的目標提供統一的路由方式且基于Filter鏈的方式提供了網關基本的功能,例如:安全,監控/指標,和限流。

?

img

?

3、能干嘛

反向代理

鑒權

流量控制

熔斷

日志監控

微服務架構中網關在哪里?

?

img

?

4、有Zuul了怎么又出來了gateway

neflix不太靠譜,zuul2.0一直跳票,遲遲不發布,一方面因為Zuul1.0已經進入了維護階段,而且Gateway是SpringCloud團隊研發的,是親兒子產品,值得信賴。而且很多功能Zuul都沒有用起來也非常的簡單便捷。Gateway是基于異步非阻塞模型上進行開發的,性能方面不需要擔心。雖然Netflix早就發布了最新的 Zuul 2.x,但 Spring Cloud 貌似沒有整合計劃。而且Netflix相關組件都宣布進入維護期;不知前景如何?多方面綜合考慮Gateway是很理想的網關選擇。

?

5、Gateway特征

基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 進行構建

動態路由:能夠匹配任何請求屬性

可以對路由指定 Predicate(斷言)和 Filter(過濾器)

集成Hystrix的斷路器功能

集成 Spring Cloud 服務發現功能

易于編寫的 Predicate(斷言)和 Filter(過濾器)

請求限流功能

支持路徑重寫

6、SpringCloudGateway與Zuul的區別:

在SpringCloudFinchley正式版之前,SpringCloud推薦的網關是Netflix提供的Zuul:

Zuul 1.x是一個基于阻塞I/O的APIGateway

Zuul 1.x基于ServIet2.5使用阻塞架構,它不支持任何長連接(如WebSocket),Zuul的設計模式和Nginx較像,每次I/O操作都是從工作線程中選擇一個執行,請求線程阻塞到工作線程完成,但是差別是Nginx用C++實現,Zuul用Java實現,而JVM本身會有第一次加載較慢的情況,使得Zuul的性能相對較差。

Zuul 2.x理念更先進想基于Netty非阻塞和支持長連接,但SpringCloud目前還沒有整合。Zuul2.x的性能較Zuul1.x有較大提升。在性能方面,根據官方提供的基準測試,SpringCloudGateway的RPS(每秒請求數)是Zuul的1.6倍。

SpringCloudGateway建立在SpringFramework5、ProjectReactor和SpringB00t2.之上,使用非阻塞API

SpringCloudGateway還支持WebSocket,并且與Spring緊密集成擁有更好的開發體驗

7、Zuul1.x模型

springcloud中所集成的zuul版本,采用的是tomcat容器,使用的是傳統的servlet IO處理模型。

?

Servlet的生命周期?servlet由servlet container進行生命周期管理。

?

container啟動時構造servlet對象并調用servlet init()進行初始化,

container運行時接受請求,并為每個請求分配一個線程(一般從線程池中獲取空閑線程)然后調用service()

container關閉時調用servlet destory()銷毀servlet

img

?

上述模式的缺點

servlete—個簡單的網絡IO模型,當請求進入servlet container時,servlet container就會為其綁定一個線程在并發不高的場景下這種模型是適用的。但是一旦高并發(比如抽風用jemeter壓),線程數量就會上漲,而線程資源代價是昂貴的(上線文切換,內存消耗大)嚴重影響請求的處理時間。

?

在一些簡單業務場景下,不希望為每個request分配一個線程,只需要1個或幾個線程就能應對極大并發的請求,這種業務場景下servlet模型沒有優勢。

?

所以Zuul 1.x是基于servlet之上的一個阻塞式處理模型,即spring實現了處理所有request請求的一個servlet(DispatcherServlet)并由該servlet阻塞式處理處理。所以springcloudzuul無法擺脫servlet模型的弊端。

?

8、GateWay模型

image-20220307223911740

?

傳統的Web框架比如說:struts2,springmvc等都是基于Servlet API與Servlet容器基礎之上運行的。

?

但是,在Servlet3.1之后有了異步非阻塞的支持。而WebFlux是一個典型非阻塞異步的框架,它的核心是基于Reactor的相關API實現的。相對于傳統的web框架來說,它可以運行在諸如Netty,Undertow及支持Servlet3.1的容器上。非阻塞式+函數式編程(Spring5必須讓你使用java8)

?

SpringWebFlux是Spring5.0引入的新的響應式框架區別于SpringMVC,它不需要依賴ServletAPI,它是完全異步非阻塞的,并且基于Reactor來實現響應式流規范。

?

二、Gateway工作流程

1、三大核心概念

(1)Route(路由)

路由是構建網關的基本模塊,它由ID,目標URI,一系列的斷言和過濾器組成,如果斷言為true則匹配該路由

?

(2)Predicate(斷言)

參考的是Java8的java.util.function.Predicate,開發人員可以匹配HTTP請求中的所有內容(例如請求頭或請求參數),如果請求與斷言相匹配則進行路由

?

(3)Filter(過濾)

指的是Spring框架中GatewayFilter的實例,使用過濾器,可以在請求被路由前或者之后對請求進行修改。

?

image-20220307225907461

?

web請求通過一些匹配條件,定位到真正的服務節點。并在這個轉發過程的前后,進行一些精細化控制。

?

predicate就是我們的匹配條件;而filter,就可以理解為一個無所不能的攔截器。有了這兩個元素,再加上目標uri,就可以實現一個具體的路由了。

?

2、Gateway工作流程

官網總結

?

img

?

客戶端向 Spring Cloud Gateway 發出請求。然后在 Gateway Handler Mapping 中找到與請求相匹配的路由,將其發送到 Gateway Web Handler。

?

Handler 再通過指定的過濾器鏈來將請求發送到我們實際的服務執行業務邏輯,然后返回。

?

過濾器之間用虛線分開是因為過濾器可能會在發送代理請求之前(“pre”)或之后(“post”)執行業務邏輯。

?

Filter在“pre”類型的過濾器可以做參數校驗、權限校驗、流量監控、日志輸出、協議轉換等,在“post”類型的過濾器中可以做響應內容、響應頭的修改,日志的輸出,流量監控等有著非常重要的作用。

?

核心邏輯:路由轉發+執行過濾器鏈

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

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

相關文章

.NET Core 依賴注入 Microsoft.Extensions.DependencyInjection

文章目錄 前言什么是依賴注入C# 使用依賴注入框架介紹 Microsoft.Extensions.DependencyInjectionNuget安裝簡單單例使用打印結果 自動裝配舉例自動裝配測試用例打印結果自動裝配執行順序測試用例有歧義構造函數漸進式構造函數循環依賴 自動裝配結論 手動裝配手動注入別名注入 …

Git:版本控制的藝術與實踐

引言: 在軟件開發領域,版本控制是至關重要的一環。它幫助我們跟蹤代碼的變化、管理團隊協作、回溯歷史記錄以及解決沖突等。而Git作為目前最流行的分布式版本控制系統,已經成為了開發者們的必備工具。本文將深入探討Git的核心概念、常用命令以…

使用Docker安裝Superset并設置Oracle訪問和使用PG作Meta數據庫

一、安裝 Docker 安裝一個linux,可以是Centos或Ubuntu,如果是Centos 7.X,那么要注意先將系統自帶的docker先刪除。下文以Centos7.9為例 #刪除自帶的不完整版本 yum remove docker docker-client docker-client-latest \docker-common docker-…

調用win32 api獲取電腦名字和系統目錄

學習一下幾個函數的功能,和調用方式; void CBasenameView::OnDraw(CDC* pDC) {CBasenameDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;TCHAR myname1[50], myname2[50], mydirname1[50], myd…

常見的Linux系統版本

在介紹常見的Linux系統版本之前,首先需要區分Linux系統內核與Linux發行套件系統的不同。Linux系統內核指的是一個由Linus Torvalds負責維護,提供硬件抽象層、硬盤及文件系統控制及多任務功能的系統核心程序。而Linux發行套件系統是我們常說的Linux操作系…

【Vue+Python】—— 基于Vue與Python的圖書管理系統

文章目錄 🍖 前言🎶一、項目描述?二、項目展示🏆三、撒花 🍖 前言 【VuePython】—— 基于Vue與Python的圖書管理系統 🎶一、項目描述 描述: 本項目為《基于Vue與Python的圖書管理系統》,項目…

Minio保姆級教程

轉載自:www.javaman.cn Minio服務器搭建和整合 1、centos安裝minio 1.1、創建安裝目錄 mkdir -p /home/minio1.2、在線下載minio #進入目錄 cd /home/minio #下載 wget https://dl.minio.io/server/minio/release/linux-amd64/minio1.3、minio配置 1.3.1、添加…

Flutter筆記:滑塊及其實現分析1

Flutter筆記 滑塊分析1 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 郵箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/134900784 本文從設計角度&#…

SQL命令---刪除字段

介紹 使用sql語句刪除表字段。 命令 alter table 表名 drop 字段名;例子 刪除a表中的name字段。 alter table a drop name;下面是執行刪除后的表結構:

微服務實戰系列之通信

前言 掰個指頭數一數,博主的“微服務實戰系列”從無到有,從零走到了十五。如果比作時鐘,剛好走過了一刻度。 當初為什么要做這個系列,博主想了又想,私以為作為當下軟件領域的幾個“hot spot”之一,又乘著…

探秘機器學習核心邏輯:梯度下降的迭代過程 (圖文詳解)

一 需求解函數 f() 和 g()函數分別為求y值和求導數的函數。 目的:求該函數的最小值: 代碼: import numpy as np import matplotlib.pyplot as plt f lambda x : (x - 3.5) ** 2 - 4.5 * x 10 g lambda x : 2 * (x - 3.5) - 4.5x np.l…

架構LAMP

目錄 1.什么是LAMP 2.LAMP組成及作用 3.搭建Apache httpd服務 4.編譯安裝mysqld 服務 5.編譯安裝PHP 解析環境 6.安裝論壇 1.什么是LAMP LAMP架構是目前成熟的企業網站應用模式之一,指的是協同工作的一整套系統和相關軟件,能夠提供動態Web站點服務…

MATLAB算法實戰應用案例精講-【人工智能】漫談自動駕駛

目錄 常用數據集 一、自動駕駛領域數據集 1. KITTI數據集 2.CityScapes數據集 3.BDD100K數據集

go與ioc

在Go開發服務端程序時,使用IoC(Inversion of Control)機制并不像在Java等語言中那樣普遍。Go語言的設計哲學傾向于簡潔和直接,更注重代碼的可讀性和可維護性。 在Go中,通常會使用依賴注入(Dependency Inje…

【Python】視頻剪輯小程序

近期遇到一些錄制的視頻需要剪輯。 手機上剪輯操作很耗時,有幾個G的視頻,花了一天的空余時間去剪輯。電腦上也有格式工廠,有很方便。 可是學了Pthon,又無意中了解到了moviepy這個庫,于是自己寫了個簡單的視頻剪輯程序。…

Windows安裝kafka

壓縮包下載地址:https://www.apache.org/dyn/closer.cgi?path/kafka/3.6.1/kafka_2.13-3.6.1.tgz 啟動kafka步驟 zookeeper-server-start.bat rem 閉命令提示符窗口的命令回顯,這樣在運行腳本時不會顯示腳本的具體命令內容 echo offrem 命令行啟動未…

Proteus仿真--8×8LED點陣屏仿電梯數字滾動顯示

本文介紹基于88LED點陣屏仿電梯數字滾動顯示設計(完整仿真源文件及代碼見文末鏈接) 仿真圖如下 其中K1-K5的5個按鍵分別代表不同樓層,摁下按鍵后在8X8LED上便會顯示到對應樓層的跳變信息,模擬電梯的運作 仿真運行視頻 Proteus仿…

nodejs多線程,fork和Worker

一、前言 javascript是單線程執行的,如果想要多線程執行,那么相當于再運行一個node,其實不該理解成多線程,更像是多進程。 二、Worker(‘worker_threads’模塊) worker有點類似exec,直接再cmd執行node命令,不同的是兩…

《安富萊嵌入式周報》第328期:自主微型機器人,火星探測器發射前失誤故障分析,微軟推出12周24期免費AI課程,炫酷3D LED點陣設計,MDK5.39發布

周報匯總地址:嵌入式周報 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬漢嵌入式論壇 - Powered by Discuz! 更新一期視頻教程: 【實戰技能】 單步運行源碼分析,一期視頻整明白FreeRTOS內核源碼框架和運行…

【STM32】TIM定時器基本定時功能

第一部分:定時器基本定時的功能; 第二部分:定時器的輸出比較功能; 第三部分:定時器輸入捕獲的功能; 第四部分:定時器的編碼接口。 1 TIM簡介 TIM(Timer)定時器&#…