微服務網關 —— SpringCloud Netflix Zuul

来源:https://www.cnblogs.com/Yee-Q/archive/2023/08/27/17659939.html
-Advertisement-
Play Games

## 概述 Spring Cloud Zuul 是 Spring Cloud Netflix 子項目的核心組件之一,可以作為微服務架構中的 API 網關使用,有以下用途: - 鑒權:對於訪問每個服務的請求進行鑒權,拒絕鑒權失敗的請求 - 監控:對系統的請求進行監控,記錄請求響應日誌,實時統計當前系統 ...


概述

Spring Cloud Zuul 是 Spring Cloud Netflix 子項目的核心組件之一,可以作為微服務架構中的 API 網關使用,有以下用途:

  • 鑒權:對於訪問每個服務的請求進行鑒權,拒絕鑒權失敗的請求
  • 監控:對系統的請求進行監控,記錄請求響應日誌,實時統計當前系統的訪問量以及監控狀態
  • 壓力測試:幫助對集群進行可控的壓力測試
  • 灰度測試:灰度發佈可以保證整體系統的穩定,在初始灰度時就可以發現問題併進行調整
  • 動態路由:基於請求路徑,將請求分發到指定的客戶端
  • 負載控制:統一控制客戶端請求壓力,超過壓力的請求直接拒絕
  • 靜態響應處理:在邊緣位置直接建立部分響應,避免其流入內部集群

構建 Zuul 網關

創建 zuul-service 項目,引入依賴,本項目基於 SpringBoot 2.3.1,SpringCloud Hoxton.SR12

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

在 application.yml 配置文件中添加如下配置:

server:
  port: 9080 # 指定運行埠

spring:
  application:
    name: zuul-service # 指定服務名稱
    
zuul:
  routes:
    blog:
      path: /baidu/**
      url: https://www.baidu.com  # url用於配置符合path的請求路徑路由到的服務地址

在啟動類中添加 @EnableZuulProxy 註解

@EnableZuulProxy
@SpringBootApplication
public class ZuulServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulServiceApplication.class, args);
    }
}

Spring Cloud Netflix Zuul 提供了許多過濾器,具體取決於啟用的 Zuul 的註解,@EnableZuulProxy@EnableZuulServer 的超集,包含 @EnableZuulServer 安裝的所有過濾器

啟動項目,在瀏覽器中輸入訪問地址 http://localhost:9080/baidu,發現請求被路由到百度界面,Zuul 服務搭建成功


Zuul 路由配置

上一節,我們使用路徑的方式匹配路由規則,path 的結構如下

# 其中customName 為用戶自定義名稱
zuul:
  routes:
    customName:
      # 可使用的通配符有以下幾種:
      # ?:單個字元
      # *:任意多個字元,不包含多級路徑
      # **:任意多個字元,包含多級路徑
      path: xxx

對於 url 路徑匹配,還可以使用服務名稱匹配

zuul:
  routes:
    # users為用戶自定義名稱
    users:
      path: /users/**
      # serviceId用於配置符合path的請求路徑路由到的服務名稱
      serviceId: users-service

服務名稱匹配也可以使用簡化的配置

zuul:
  routes:
    service-provider:
      path: /users/**

如果只配置 path 不配置 serviceld,則 customName 相當於服務名稱,即 service-provider 會被當作服務名稱,使用 serviceId 要將 zuul 服務註冊到註冊中心使用,比如 Eureka,從而拉取註冊服務列表名稱完成調用

如果想排查配置,可以使用 ignored-services

zuul:
  ignoredServices: "*"
  routes:
    users:
      path: /users/**

ignored-services 可以配置不被 zuul 管理的服務列表,多個服務名稱使用號分隔,配置的的務將不被 Zuul代理,在上面的實例中,除了用戶服務外,所有的服務均被忽略

可以通過 zuul.prefix 配置路由首碼,例如:

zuul:
  prefix: /api
  routes:
    users:
      path: /users/**

配置請求路徑首碼,所有基於此首碼的請求都由 Zuul 網關提供代理


Zuul 過濾器

Zuul 定義過濾器用來過濾代理請求,提供額外功能邏輯,如許可權驗證、日誌記錄等,filter 與 filter 之間不直接通信,在請求線程中會通過 RequestContext 來共用狀態,它內部是用 ThreadLocal 實現的

Zuul 過濾器分為前置過濾、路由後過濾、後置過濾以及異常過濾:

  • 前置過濾:在請求進入 Zuul 後,立刻執行的過濾邏輯
  • 路由後過濾:在請求進入 Zuul 後,Zuul 實現請求路由,併在遠程服務調用之前執行過濾邏輯
  • 後置過濾:遠程服務調用結束後執行過濾邏輯
  • 異常過濾:任意一個過濾器發生異常或遠程服務調用無結果反饋時(調用超時)執行過濾邏輯

ZuulFilter 類及其父類 IZuulFilter 共提供了四種抽象方法:

  • filterType:返回字元串數據,代表當前過濾器的類型,可選值有:
    • pre:前置過濾器,在請求被路由前執行,通常用於處理身份認證、日誌記錄等
    • route:在路由執行後,服務調用前被調用
    • error:任意一個 filter 發生異常或遠程服務調用沒有反饋時執行(超時),通常用於處理異
    • post:在 route 或 error 執行後被調用,一般用於收集服務信息、統計服務性能指標等,也可以對 response 結果做特殊處理
  • filterOrder:返回 int 數據,用於為同一種 filterType 的多個過濾器定製執行順序,返回值越小,執行順序越優先
  • shouldFilter:返回 boolean 數據,代表當前 filter 是否生效
  • run:具體的過濾執行邏輯

具體實例如下:

public class tokenFilter extends ZuulFilter {

    @Override
    public String filterType() {
        //定義過濾器的類型,pre 表示在請求被路由前執行
        return "pre";
    }

    @Override
    public int filterOrder() {
        //返回int 數據,用於為同一種 filterType 的多個過濾器定製執行順序
        //返回值越小,執行順序越優先
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        //判斷過濾器是否生效,true 代表生效
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        //獲取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        //獲取 request 對象
        HttpServletRequest request = currentContext.getRequest();
        //從請求頭獲取 token 的參數
        String userToken = request.getParameter("token");
        if (StringUtils.isEmpty(userToken)) {
            //返回錯誤提示
            //false:表示不會繼續往下執行,不會調用服務介面,直接響應給客戶
            currentContext.setSendZuulResponse(false);
            currentContext.setResponseBody("token is null");
            currentContext.setResponseStatusCode(401);
            return null;
        }
        //否則正常執行,調用服務介面...
        return null;
    }
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 1.1 註釋 **作用**:在代碼中加一些說明和解釋,方便自己或其他程式員程式員閱讀代碼 **兩種格式** 1. **單行註釋**:`// 描述信息` - 通常放在一行代碼的上方,或者一條語句的末尾,==對該行代碼說明== 2. **多行註釋**: `/* 描述信息 */` - 通常放在一段代 ...
  • ## 1 拉取鏡像 指定版本,在git查看相應版本,參考: https://github.com/openzipkin/zipkin 如2.21.7 ```bash docker pull openzipkin/zipkin:2.21.7 ``` ## 2 啟動 Zipkin預設埠為9411。啟動 ...
  • # Nacos集群搭建 # 1.集群結構圖 官方給出的Nacos集群圖: ![image-20210409210621117](https://img2023.cnblogs.com/blog/3014273/202308/3014273-20230827184442168-301140741.pn ...
  • 最近github上發現了一個庫(`plottable`),可以用簡單的方式就設置出花哨的 `DataFrame` 樣式。 github上的地址:[https://github.com/znstrider/plottable](https://github.com/znstrider/plottabl ...
  • Kafka 是一個基於發佈-訂閱模式的消息系統,它可以在多個生產者和消費者之間傳遞大量的數據。Kafka 的一個顯著特點是它的高吞吐率,即每秒可以處理百萬級別的消息。那麼 Kafka 是如何實現這樣高得性能呢?本文將從七個方面來分析 Kafka 的速度優勢。 - 零拷貝技術 - 僅可追加日誌結構 - ...
  • 在 gRPC 中使用 JWT(JSON Web Tokens)進行身份驗證是一種常見的做法,它可以幫助你確保請求方的身份和許可權。下麵是一種使用 gRPC 和 JWT 進行身份驗證的步驟: 1. **生成和簽發 JWT:** 在用戶登錄成功後,你需要生成一個 JWT 並將其簽發給用戶。JWT 中可以包 ...
  • 最近接觸到了 [github.com/json-iterator/go](https://github.com/json-iterator/go) , 是由滴滴開源的第三方json編碼庫,它同時提供Go和Java兩個版本。 > 文中大量內容來自 github 上的 wiki 文檔,有興趣的朋友可以直 ...
  • [原題](https://www.luogu.com.cn/problem/UVA908) ## 1.題意分析 題意就是給你很多組數,對於每組數,有三組小數據。第一組小數據先輸入一個n表示頂點數,然後再輸入n-1條邊表示初始邊數。其它組小數據先輸入一個數k,表示增加的邊的數量,然後再輸入k條邊,表示 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...