Spring Cloud 學習 (五) Zuul

Zuul 作為路由網關組件,在微服務架構中有著非常重要的作用,主要體現在以下 6 個方面:

  1. Zuul, Ribbon 以及 Eureka 相結合,可以實現智能路由和負載均衡的功能,Zuul 能夠將請求流量按某種策略分發到集群狀態的多個服務實例
  2. 網關將所有服務的 API 接口統一聚合,并統一對外暴露。外界系統調用 API 接口時,都是由網關對外暴露的 API 接口,外界系統不需要知道微服務系統中各服務相互調用的復雜性。微服務系統也保護了其內部微服務單元的 API 接口 , 防止其被外界直 接調用,導致服務的敏感信息對外暴露
  3. 網關服務可以做用戶身份認證和權限認證,防止非法請求操作 API 接口,對服務器起到保護作用
  4. 網關可以實現監控功能,實時日志輸出,對請求進行記錄
  5. 網關可以用來實現流量監控,在高流量的情況下,對服務進行降級
  6. API 接口從內部服務分離出來,方便做測試

Zuul 的核心是一系列過濾器,可以在 Http 請求的發起和響應返回期間執行一系列的過濾器:

  1. PRE 過濾器:在請求路由到具體的服務之前執行,這種類型的過濾器可以做安全驗證,例如身份驗證、 參數驗證等
  2. ROUTING 過濾器:用于將請求路由到具體的微服務實例。在默認情況下,它使用 Http Client 進行網絡請求
  3. POST 過濾器:在請求己被路由到微服務后執行。 一般情況下,用作收集統計 信息、指標,以及將響應傳輸到客戶端
  4. ERROR 過濾器:在其他過濾器發生錯誤時執行

Zuul 采取了動態讀取、編譯和運行這些過濾器。過濾器之間不能直接相互通信,而是通過 RequestContext 對象來共享數據,每個請求都會創建一個 RequestContext 對象。Zuul 過濾器具有以下關鍵特性:

  1. Type (類型): Zuul 過濾器的類型,這個類型決定了過濾器在請求的哪個階段起作用,例如 Pre、Post 階段等
  2. Execution Order (執行順序): 規定了過濾器的執行順序,Order 的值越小越先執行
  3. Criteria (標準): Filter 執行所需的條件
  4. Action (行動): 如果符合執行條件,則執行 Action (即邏輯代碼)

使用 Zuul

新建 spring-cloud-eureka-zuul-client

pom

<parent><artifactId>spring-cloud-parent</artifactId><groupId>com.karonda</groupId><version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion><artifactId>spring-cloud-eureka-zuul-client</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency>
</dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

application.yml

server:port: 8051eureka:client:service-url:defaultZone: http://localhost:8001/eureka/spring:application:name: zuul-clientzuul:routes:hiapi:path: /hiapi/**serviceId: eureka-clientribbonapi:path: /ribbonapi/**serviceId: ribbon-clientfeignapi:path: /feignapi/**serviceId: feign-client

啟動類

@EnableZuulProxy // 開啟 Zuul
@SpringBootApplication
public class EurekaZuulClientApp {public static void main(String[] args){SpringApplication.run(EurekaZuulClientApp.class, args);}
}

測試

  1. 啟動 eureka-server
  2. 啟動 eureka-client (兩個實例:一個 8011 端口,一個 8012 端口)
  3. 啟動 eureka-ribbon-client
  4. 啟動 eureka-feign-client
  5. 啟動 eureka-zuul-client

多次訪問 http://localhost:8031/hiapi/hi?name=victor 可以看到 8011 和 8012 端口交替出現 (Zuul 默認 與 Ribbon 結合實現了負載均衡)

多次訪問 http://localhost:8031/ribbonapi/hi?name=victor 可以看到 8011 和 8012 端口交替出現

多次訪問 http://localhost:8031/feignapi/hi?name=victor 可以看到 8011 和 8012 端口交替出現

在 Zuul 上配置熔斷器

實現 FallbackProvider 接口

@Component
public class MyFallbackProvider implements FallbackProvider {@Overridepublic String getRoute() {return "eureka-client"; // 如果所有的路由服務都加熔斷功能,返回 "*"}@Overridepublic ClientHttpResponse fallbackResponse(String route, Throwable cause) {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {return HttpStatus.OK;}@Overridepublic int getRawStatusCode() throws IOException {return 200;}@Overridepublic String getStatusText() throws IOException {return "OK";}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {return new ByteArrayInputStream("error, fallback".getBytes());}@Overridepublic HttpHeaders getHeaders() {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);return headers;}};}
}

測試

  1. 關閉所有的 eureka-client
  2. 重啟 eureka-zuul-client

在 Zuul 中使用過濾器

繼承 ZuulFilter

@Component
public class MyFilter extends ZuulFilter {private static Logger logger = LoggerFactory.getLogger(MyFilter.class);@Overridepublic String filterType() {return PRE_TYPE;}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();Object accessToken = request.getParameter("token");if(accessToken == null){logger.warn("token is empty");ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(401);try {ctx.getResponse().getWriter().write("token is empty");} catch (IOException e) {return null;}}logger.info("ok");return null;}
}

測試

  1. 重啟 eureka-zuul-client

訪問 http://localhost:8051/hiapi/hi?name=victor

訪問 http://localhost:8051/hiapi/hi?name=victor&token=xx

完整代碼:GitHub

本人 C# 轉 Java 的 newbie, 如有錯誤或不足歡迎指正,謝謝

?

轉載于:https://www.cnblogs.com/victorbu/p/11017272.html

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

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

相關文章

如何利用445端口進行入侵滲透 445端口入侵原因詳細解析。大家在進行入侵滲透個人電腦的時候,經常會碰到各種各樣的端口,比如135,1433,445,3306等端口,現在小編就給大家講解下445端口如

如何利用445端口進行入侵滲透 445端口入侵原因詳細解析。大家在進行入侵滲透個人電腦的時候&#xff0c;經常會碰到各種各樣的端口&#xff0c;比如135&#xff0c;1433&#xff0c;445&#xff0c;3306等端口&#xff0c;現在小編就給大家講解下445端口如何入侵。 445端口入侵…

項目復盤

前言 最近一年半多一直在做一個CMS項目&#xff0c;做了快兩年了也沒有上線&#xff0c;而且開發還走了不少&#xff0c;其中有不少原因是因為開發中頻繁改動需求導致開發人員失去耐心&#xff0c;但是其中還有一個重要的原因就是架構設計的不好&#xff0c;導致很多服務的邊界…

父、子頁面之間頁面元素的獲取,方法的調用

一、在iframe頁面上調取父級頁面元素 1.在父頁面上獲取iframe頁面元素(在父頁面修改子頁面div的背景色為紅色) js代碼如下&#xff1a; 1 <script type"text/javascript"> 2 window.onload function(){ 3 var iframe document.getElementById(iframeId)…

fiddler,他和其他抓包軟件有什么區別,如何使用fiddler進行抓包

前言&#xff1a;本文章是搭配《批量獲取微信公眾號》一文&#xff0c;介于群里朋友很熱情&#xff0c;我就趁著上班測完bug 來撰寫該文章&#xff0c;那么讀完本文&#xff0c;你會學習到什么呢&#xff1f; 什么是fiddler&#xff0c;他和其他抓包軟件有什么區別&#xff0c…

Vue導入非模塊化的第三方插件功能無效解決方案

一、問題&#xff1a; 最近在寫vue項目時&#xff0c;想引入某些非模塊化的第三方插件時&#xff0c;總是發現會有報錯。且在與本地運行插件測試對比時發現插件根本沒有注入到jQuery中&#xff08;console.log($.fn)查看當前jq有哪些方法&#xff09;&#xff0c;例如&#xff…

ES6筆記 -- 字符串拓展

字符串拓展 Unicode 相關 JS 允許使用/uxxxx的Unicode方式顯示字符, 但是只限于碼點在/u0000~/uFFFF之間, 超過該范圍的碼點必須用雙字節形式表示ES6 中, 將碼點放入大括號內, 就可以解讀JS 不能處理4個字節的字符, 字符串長度會被誤判為2ES6 提供了codePointAt方法, 能夠正確處…

android 轉發短信

通過這些代碼也可以對遠程手機實現短信控制。有興趣的可以自己改一下&#xff0c;說一下簡單的原理&#xff0c;要實現控制的話&#xff0c;必須得走一個固定的號碼&#xff0c;固定的格式&#xff0c;然后通過得到此號碼的內容&#xff0c;然后通過固定的內容&#xff0c;就可…

[Noi2016]區間

傳送門 Code /* 線段樹 尺取法 */ #include<bits/stdc.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)>(b)?(b):(a)) #define reg register inline int read() {int x0,f1;char chgetchar();while(ch<0||ch>9){if(…

安裝CentOS6.8并配置網絡圖文解說親測全過程

安裝環境&#xff1a; 本文是在win10系統安裝上VMWare并配置Centos6.8虛擬機。 準備工作 1.安裝VMWare虛擬機 1.1下載VMWare12資源鏈接&#xff1a;https://pan.baidu.com/s/1AhfMSDXLO-aA0eMqnuMWHg 提取碼&#xff1a;iftd 1.2安裝VMWare&#xff0c;在安裝過程中需要輸入密鑰…

Paxos算法是萊斯利·蘭伯特(Leslie Lamport)1990年提出的一種基于消息傳遞的一致性算法。

Paxos算法是萊斯利蘭伯特(Leslie Lamport)1990年提出的一種基于消息傳遞的一致性算法。Paxos算法解決的問題是一個分布式系統如何就某個值&#xff08;決議&#xff09;達成一致。在工程實踐意義上來說&#xff0c;就是可以通過Paxos實現多副本一致性&#xff0c;分布式鎖&…

09、策略模式

2019獨角獸企業重金招聘Python工程師標準>>> 策略模式與工廠模式最大的區別在于&#xff0c;策略模式注重的是對算法的維護&#xff0c;也可以理解為對算法的封裝。而工廠模式&#xff0c;則只是負責創建類&#xff0c;在剛接觸策略模式時候&#xff0c;往往與工廠模…

Linux創建、刪除文件和文件夾命令

https://www.cnblogs.com/c-x-m/p/9794082.html轉載于:https://www.cnblogs.com/sun-ldy/p/10279025.html

Java編寫代理服務器(Burp攔截Demo)一

大家都知道大名鼎鼎的BurpSuite代理神器&#xff0c;對于抓取HTTP請求非常好用&#xff0c;偶然&#xff0c;一朋友問我Java應該如何去編寫代理服務器&#xff08;因為他想做某些東西&#xff09;&#xff0c;有沒有相關的API 去實現&#xff0c;我想說&#xff0c;差不多你能想…

mysql實戰33 | 我查這么多數據,會不會把數據庫內存打爆?

我經常會被問到這樣一個問題&#xff1a;我的主機內存只有 100G&#xff0c;現在要對一個 200G 的大表做全表掃描&#xff0c;會不會把數據庫主機的內存用光了&#xff1f;這個問題確實值得擔心&#xff0c;被系統 OOM&#xff08;out of memory&#xff09;可不是鬧著玩的。但…

[BZOJ2125]最短路

Description 給一個N個點M條邊的連通無向圖&#xff0c;滿足每條邊最多屬于一個環&#xff0c;有Q組詢問&#xff0c;每次詢問兩點之間的最短路徑。 Input 輸入的第一行包含三個整數&#xff0c;分別表示N和M和Q 下接M行&#xff0c;每行三個整數v&#xff0c;u&#xff0c;w表…

Rabbit MQ windows下安裝

Rabbit MQ 是建立在強大的Erlang OTP平臺上&#xff0c;因此安裝Rabbit MQ的前提是安裝Erlang。通過下面兩個連接可以下載安裝最新的版本&#xff1a; 下載并安裝 Eralng OTP For Windows otp_win64_18.3.exe&#xff08;erlang的環境&#xff09;運行安裝 Rabbit MQ Serve…

spark集群配置以及java操作spark小demo

spark 安裝配置使用java來操作sparkspark 安裝 tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz rm spark-2.4.0-bin-hadoop2.7.tgz mv spark-2.4.0-bin-hadoop2.7 sparksudo vim /etc/profileexport SPARK_HOME/usr/local/stormexport PATH$PATH:$SPARK_HOME/binsource /etc/profile…

C++筆記(3)——string.h相關的一些小知識

strlen() 用于得到字符數組中第一個\0前的字符的個數&#xff0c;格式如下&#xff1a; strlen(數組); 例子&#xff1a; #include <stdio.h> #include <string.h>int main(){char str[10];gets(str);int len strlen(str);printf("%d\n", len);return 0…

最近發現系統rabbitmq丟消息比較嚴重,于是想了些方案來查找原因,給將消息發送方式添加確認機制。 我們在本地模擬了wms發送打標消息的場景. 1. 有事務 2. 先發點對點隊列, 再發訂

最近發現系統rabbitmq丟消息比較嚴重&#xff0c;于是想了些方案來查找原因&#xff0c;給將消息發送方式添加確認機制。 我們在本地模擬了wms發送打標消息的場景. 1. 有事務 2. 先發點對點隊列, 再發訂閱隊列 3. 批量發送 4. 在生產環境與測試環境的RabbitMQ都進行了測試 …

uoj#388. 【UNR #3】配對樹(線段樹合并)

傳送門 先考慮一個貪心&#xff0c;對于一條邊來說&#xff0c;如果當前這個序列中在它的子樹中的元素個數為奇數個&#xff0c;那么這條邊就會被一組匹配經過&#xff0c;否則就不會 考慮反證法&#xff0c;如果在這條邊兩邊的元素個數都是偶數&#xff0c;那么至少有兩組匹配…