spring cloud zuul實踐

来源:https://www.cnblogs.com/lfhappy/archive/2023/07/13/17549185.html
-Advertisement-
Play Games

一、 描述 Spring Cloud Zuul是基於Netflix開源的Zuul項目構建而成,它作為微服務架構中的網關服務,主要用於實現動態路由、負載均衡和請求過濾等功能。 動態路由:Zuul根據預設的路由規則將進來的請求路由到相應的服務實例上。路由規則可以通過配置文件或代碼進行定義,接收到請求後, ...


一、 描述

Spring Cloud Zuul是基於Netflix開源的Zuul項目構建而成,它作為微服務架構中的網關服務,主要用於實現動態路由、負載均衡和請求過濾等功能。

  1. 動態路由:Zuul根據預設的路由規則將進來的請求路由到相應的服務實例上。路由規則可以通過配置文件或代碼進行定義,接收到請求後,Zuul會解析請求的URL,並根據配置的路由規則找到對應的服務地址,將請求轉發到目標服務。

  2. 負載均衡:Zuul內置了Ribbon負載均衡器,可以對請求進行負載均衡。當一個服務有多個實例時,Zuul可以使用負載均衡演算法將請求均勻地分發到不同的實例上,以提高系統的性能和可擴展性。

  3. 請求過濾:Zuul支持自定義過濾器,在請求被路由之前或之後對請求進行處理。過濾器可以用於在路由前進行身份驗證、請求統計、參數校驗等操作,也可以在路由後處理響應結果,比如修改返回數據、添加自定義的響應頭等。開發者可以根據需求創建不同類型的過濾器,並定義過濾器的執行順序。

  4. 整合服務註冊中心:Zuul可以與服務註冊中心(如Zookeeper、Eureka)進行整合,實現動態路由和負載均衡。通過與服務註冊中心交互,Zuul能夠動態地獲取服務實例的信息,並根據需要進行路由和負載均衡。

  5. 高可用和容錯:Zuul支持配置多個實例運行在不同的機器上,以實現高可用性。當一個Zuul實例發生故障時,其他實例可以接管請求處理,確保系統的穩定性和容錯性。

Spring Cloud Zuul通過動態路由、負載均衡和請求過濾等機制,提供了一個強大且靈活的網關服務。它能夠統一管理微服務的入口,實現請求的轉發和過濾,簡化了微服務架構中的通信和調用方式,提高了系統的可伸縮性和可維護性。

      下麵是使用Spring Cloud Zuul的一般實踐步驟

二、添加依賴

引入zuul的依賴spring-cloud-starter-netflix-zuul

1     <dependency>
2       <groupId>org.springframework.cloud</groupId>
3       <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
4     </dependency>
View Code

三、創建啟動類:

      創建一個啟動類,並使用@EnableZuulProxy註解開啟Zuul代理功能。

1 @SpringBootApplication
2 @EnableZuulProxy
3 public class GatewayApplication {
4 
5   public static void main(String[] args) {
6     SpringApplication.run(GatewayApplication.class, args);
7   }
8 
9 }
View Code

四、 配置

在配置文件(如application.yml)中定義Zuul的路由規則。可以使用Zuul的zuul.routes首碼來配置不同的路由規則。

 1 server:
 2   port: 9000
 3 management:
 4   endpoints:
 5     web:
 6       exposure:
 7         include: '*'
 8   server:
 9     port: 12345
10 zuul:
11   routes:
12     configserver:
13       path: /myConfig/**
14       serviceId: config
15     user:
16       path: /myUser/**
17       serviceId: provider
18   ignored-patterns: #忽略指定的路由
19     - /config/**
20     - /gateway/**
21   sensitive-headers:
22 #  ignore-local-service: true # 忽略原來自身的路由。比如,true: 原來的config/xxx/xxx不可再訪問
View Code

上述配置將/myConfig/**的請求轉發到config服務,將/myUser/**的請求轉發到provider服務。

還可以將網關註冊到註冊中心實現高可用。創建bootstrap.yml文件

 1 spring:
 2   application:
 3     name: gateway
 4   cloud:
 5     zookeeper:
 6       discovery:
 7         register: true
 8         enabled: true
 9       connect-string: 192.168.3.100:2181
10     config:
11       discovery:
12         service-id: config
13         enabled: true
View Code

五、配置過濾器

 通過zuul添加過濾器,對請求進行攔截或校驗等等

 1 package com.mike.study.gateway.fiter;
 2 
 3 import com.netflix.zuul.ZuulFilter;
 4 import com.netflix.zuul.context.RequestContext;
 5 import com.netflix.zuul.exception.ZuulException;
 6 import org.apache.commons.lang.StringUtils;
 7 import org.springframework.http.HttpStatus;
 8 import org.springframework.stereotype.Component;
 9 
10 import javax.servlet.http.HttpServletRequest;
11 
12 import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
13 import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
14 
15 /**
16  * @Classname ParameterFilter
17  * @Created by Michael
18  * @Date 2023/7/12
19  * @Description 自定義過濾器
20  */
21 @Component
22 public class ParameterFilter extends ZuulFilter {
23   /**
24    * 前置過濾
25    * @return
26    */
27   @Override
28   public String filterType() {
29     return PRE_TYPE;
30   }
31 
32   /**
33    * 數值越小,優先順序越高
34    * @return
35    */
36   @Override
37   public int filterOrder() {
38     return PRE_DECORATION_FILTER_ORDER - 1;
39   }
40 
41   @Override
42   public boolean shouldFilter() {
43     return true;
44   }
45 
46   @Override
47   public Object run() throws ZuulException {
48 
49     // 獲取請求對象
50     RequestContext context = RequestContext.getCurrentContext();
51     HttpServletRequest request = context.getRequest();
52     // 獲取地址欄傳入的參數
53     String token = request.getParameter("token");
54     System.out.println("token ===>"+token);
55     //模擬校驗token,沒有token則終止轉發
56     if (StringUtils.isEmpty(token)) {
57       context.setSendZuulResponse(false);
58       context.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
59     }
60     return null;
61   }
62 }
ParameterFilter.java

以上代碼時在轉發請求服務前,對參數進行校驗,如果沒有token參數,則停止轉發,並且返回401錯誤

六、測試

測試網關轉發主要需要請求發起方,網關和請求處理方。這裡在原來demo的基礎上,增加網關,所以看到有配置中心,以往的文章有項目的搭建介紹。如果不想那麼複雜,可以去掉配置中心,將配置放置各個module即可,項目組如下

 

準備請求發起方,即consumer,controller通過feign框架請求網關,網關轉發請求provider。consumer的controller如下

 1 import com.mike.study.orderconsumer.client.UserClient;
 2 import com.mike.study.orderconsumer.vo.UserVo;
 3 import org.springframework.web.bind.annotation.GetMapping;
 4 import org.springframework.web.bind.annotation.PathVariable;
 5 import org.springframework.web.bind.annotation.RequestParam;
 6 import org.springframework.web.bind.annotation.RestController;
 7 
 8 import javax.annotation.Resource;
 9 
10 /**
11  * @Classname UserRuttingController
12  * @Created by Michael
13  * @Date 2023/7/9
14  * @Description feign框架調用provider api
15  */
16 @RestController
17 public class UserRuttingController {
18   @Resource
19   private UserClient userClient;
20 
21   @GetMapping("warp/user/2.1/{id}")
22   public UserVo getUser(@PathVariable("id") Integer userId, @RequestParam("token") String token) {
23     System.out.println("使用feign框架調用provide的api");
24     return userClient.getUser(userId, token);
25   }
26 }
controller

Feign介面

 1 import com.mike.study.orderconsumer.vo.UserVo;
 2 import org.springframework.cloud.openfeign.FeignClient;
 3 import org.springframework.web.bind.annotation.GetMapping;
 4 import org.springframework.web.bind.annotation.PathVariable;
 5 import org.springframework.web.bind.annotation.RequestParam;
 6 
 7 /**
 8  * @Classname UserFeigClient
 9  * @Created by Michael
10  * @Date 2023/7/9
11  * @Description feign client
12  */
13 
14 @FeignClient("gateway")
15 public interface UserClient {
16 
17   @GetMapping("myUser/user/{id}")
18   public UserVo getUser(@PathVariable("id") Integer userId,@RequestParam("token") String token);
19 }
UserClient

以上Feign介面配合註冊中心zookeeper使用,訪問的網關地址,而不是直接請求服務提供者的api。

provider module簡單提供一個api查詢用戶信息。

六、測試結果

positive case:token參數有值

 negative case:token參數i為空

 

總結,就是consumer不再直接請求provider server,而是通過zuul作為中轉站,這樣做的好處很多,比如,對consumer的請求進行攔截過濾,驗證,降流等等。

如果該文章對你有所幫助,請點個贊支持下,謝謝!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 教程簡介 Bootstrap 4是功能強大且流行的移動第一前端框架,用於在Web上構建響應式移動第一站點。這是Bootstrap的最新版本,它使用HTML,CSS和JavaScript。 為什麼要使用Bootstrap? * 它包含整個庫中的移動優先樣式,而不是在單獨的文件中使用它們。 * 只 ...
  • ## 教程簡介 JavaMail,顧名思義,提供給開發者處理電子郵件相關的編程介面。它是Sun發佈的用來處理email的API。它可以方便地執行一些常用的郵件傳輸。我們可以基於JavaMail開發出類似於Microsoft Outlook的應用程式。 JavaMail API 提供了一個獨立於平臺和 ...
  • 一. 介紹 sleep() : 是Thread類方法,用於使當前線程暫停執行一段時間。它可以被使用在多線程編程中,用於控制線程的執行速度或者創建時間延遲。 參數: long millis : 參數表示線程休眠的毫秒數。 例如,如果調用Thread.sleep(1000),則當前線程會休眠 1000 ...
  • Git開發手冊 git一些不常用的命令記不住,可以查看git開發手冊(https://m.php.cn/manual/view/34957.html) 1、.git/objects/pack 文件過大 今天從git拉取項目進行開發的時候克隆的很慢,還以為是網速的問題。查看了一些git命令框的拉取網路 ...
  • # 1.1 異常是什麼 python使用異常對象來表示異常狀態,併在遇到錯誤時引發異常。異常對象未被處理,程式將終止並顯示一條錯誤信息。 我們可以通過各種方法引發和捕獲錯誤,並採取對應措施。 # 1.2 將“錯誤”變成異常 自主地引發異常 ## 1.2.1 raise語句 我們通過預測異常可能發生的 ...
  • > 太陽🔆未起床,我去上集訓~ > > 坐著車🚗,到門口🚪,迷迷糊糊坐在電腦💻前~ > > 看一看題目,全都不會😭做! > > 摸電線🔋,開電閘,滋滋滋滋到閻王👼面前~ ### 閑聊一陣 emm,今天我被各種東西**虐**慘😭了! Why? 我媽讓我早上 $\texttt {6:00 ...
  • 我從大二上學期的時候學了數據結構,但是當時對數據結構的重要性並不太重視,直到在升大三的暑假,才意識到數據結構對以後學語言和找工作方面的重要性,所以亡羊補牢,為時未晚,嘗試著結合b站上王道考研數據結構課,來記錄自己對知識和代碼的理解。 數據結構學習的內容可以理解為,我們用代碼怎麼去把現實世界的問題高效 ...
  • java JDK安裝及配置 windows11 jdk-8u261-windows-x64.exe 1、點擊安裝,一路預設即可 2、設置系統環境變數 新建JAVA_HOME指明JDK安裝路徑,就是剛纔安裝時所選擇的路徑C:\Program Files\Java\jdk1.8.0_261,此路徑下包括 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...