SpringCloud微服務(05):Zuul組件,實現路由網關控制

来源:https://www.cnblogs.com/cicada-smile/archive/2019/08/14/11355224.html
-Advertisement-
Play Games

一、Zuul組件簡介 1、基礎概念 Zuul 網關主要提供動態路由,監控,彈性,安全管控等功能。在分散式的微服務系統中,系統被拆為了多個微服務模塊,通過zuul網關對用戶的請求進行路由,轉發到具體的後微服務模塊中。 2、Zuul的作用 1)按照不同策略,將請求轉發到不同的服務上去; 2)聚合API接 ...


一、Zuul組件簡介

1、基礎概念

Zuul 網關主要提供動態路由,監控,彈性,安全管控等功能。在分散式的微服務系統中,系統被拆為了多個微服務模塊,通過zuul網關對用戶的請求進行路由,轉發到具體的後微服務模塊中。

2、Zuul的作用

1)按照不同策略,將請求轉發到不同的服務上去;

2)聚合API介面,統一對外暴露,提高系統的安全性;

3)實現請求統一的過濾,以及服務的熔斷降級;

3、案例結構

啟動順序如下:

# 註冊中心
node05-eureka-7001
# 兩個服務提供者
node05-provider-6001
node05-provider-6002
# 網關控制
node05-zuul-7002

啟動成功後,註冊中心展示如下:

二、Zuul使用詳解

1、核心依賴

<!-- 路由網關 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

2、核心配置文件

server:
  port: 7002
spring:
  application:
    name: cloud-node05-parent
eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://registry01.com:7001/eureka/
zuul:
  # 首碼,可以用來做版本控制
  prefix: /v1
  # 禁用預設路由,執行配置的路由
  ignored-services: "*"
  routes:
    # 配置6001介面微服務
    pro6001:
      serviceId: node05-provider-6001
      path: /api-6001/**
    # 配置6002介面微服務
    pro6002:
      serviceId: node05-provider-6002
      path: /api-6002/**
  • 啟動類註解:@EnableZuulProxy

3、統一服務降級

實現FallbackProvider介面,自定義響應提示。

@Component
public class FallBackConfig implements FallbackProvider {
    private static final Logger LOGGER = LoggerFactory.getLogger(FallBackConfig.class) ;
    @Override
    public ClientHttpResponse fallbackResponse(Throwable cause) {
        // 捕獲超時異常,返回自定義信息
        if (cause instanceof HystrixTimeoutException) {
            return response(HttpStatus.GATEWAY_TIMEOUT);
        } else {
            return fallbackResponse();
        }
    }
    private ClientHttpResponse response(final HttpStatus status) {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() {
                return status;
            }
            @Override
            public int getRawStatusCode() {
                return status.value();
            }
            @Override
            public String getStatusText() {
                return status.getReasonPhrase();
            }
            @Override
            public void close() {
                LOGGER.info("close");
            }
            @Override
            public InputStream getBody() {
                String message =
                        "{\n" +
                            "\"code\": 200,\n" +
                            "\"message\": \"微服務飛出了地球\"\n" +
                        "}";
                return new ByteArrayInputStream(message.getBytes());
            }
            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
    @Override
    public String getRoute() {
        return "*";
    }
    @Override
    public ClientHttpResponse fallbackResponse() {
        return response(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

4、統一過濾器

繼承ZuulFilter類,自定義過濾動作。

@Component
public class FilterConfig extends ZuulFilter {
    private static final Logger LOGGER = LoggerFactory.getLogger(FilterConfig.class) ;
    @Override
    public String filterType() {
        return "pre";
    }
    @Override
    public int filterOrder() {
        return 0;
    }
    @Override
    public boolean shouldFilter() {
        return true;
    }
    @Override
    public Object run() {
        RequestContext requestContext = RequestContext.getCurrentContext() ;
        try {
            doBizProcess(requestContext);
        } catch (Exception e){
            LOGGER.info("異常:{}",e.getMessage());
        }
        return null;
    }

    public void doBizProcess (RequestContext requestContext) throws Exception {
        HttpServletRequest request = requestContext.getRequest() ;
        String reqUri = request.getRequestURI() ;
        if (!reqUri.contains("getAuthorInfo")){
            requestContext.setSendZuulResponse(false);
            requestContext.setResponseStatusCode(401);
            requestContext.getResponse().getWriter().print("Path Is Error...");
        }
    }
}

5、測試流程

1)測試網關配置

訪問如下介面,響應正常,說明網關配置生效:

http://localhost:7002/v1/api-6001/getAuthorInfo/1
http://localhost:7002/v1/api-6002/getAuthorInfo/2

2)測試服務降級

關閉6001服務,再次訪問介面,提示信息如下,說明服務降級策略生效:

{
    "code": 200,
    "message": "微服務飛出了地球"
}

3)測試過濾器

因為請求URI不匹配getAuthorInfo,所以被攔截,說明過濾器略生效:

http://localhost:7002/v1/api-6001/
響應提示:
Path Is Error...

三、源代碼地址

GitHub地址:知了一笑
https://github.com/cicadasmile
碼雲地址:知了一笑
https://gitee.com/cicadasmile


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

-Advertisement-
Play Games
更多相關文章
  • 以使用靜態方法 啟動 Springboot 為例,啟動流程主要分為 SpringApplication 的創建和運行兩部分; 創建 1. 設置資源載入器,此處為空 2. 設置 Springboot 啟動類 3. 根據類路徑判斷 web 類型,預設為 SERVLET Spring MVC 4. 讀取每 ...
  • 續上一篇隨筆: https://www.cnblogs.com/kingstarer/p/8469016.html 《工作碰上的技術問題及處理經驗》(二) 我這人記憶力比較差,經常出現有些知識學了不久後就忘了,或者有些問題花了很多時間百度解決後,再過一段時間碰上時只有模糊印象,卻忘了具體解決方法。 ...
  • [TOC] STL提供了一組表示容器、迭代器、函數對象和演算法的模板。 + 容器是一個與數組類似的單元,可以存儲若幹個值。STL容器是同質的,即存儲的值的類型相同; + 演算法是完成特定任務(如對數組進行排序或在鏈表中查找特定值)的處方; + 迭代器能夠用來遍歷容器的對象,與能夠遍曆數組的指針類似,是廣 ...
  • 1.5.如何根據字典中值的大小,對字典中的項進行排序 第一種方法:列表解析 第二種使用sorted 1.6.如何統計序列中元素的頻度 1.7.如何快速找到多個字典中的公共鍵 1.8.如何讓字典保持有序 ...
  • 1.新建site-packages目錄,進入到site-packages目錄下; 2.在site-packages目錄下執行pip freeze >requirements.txt; 3.查看requirements.txt,可以看到當前機器的python所有依賴包已生成列表 ​ 4.在當前目錄下執 ...
  • ASCII (美)不支持中文, 用於pyhton2版本 gbk (國標) 英文用8位 中文16位 unicode (萬國碼) 英文16位 中文32位 utf 8 (可變長編碼)英文8位 歐洲文16位 亞洲24位 linux utf 8 mac utf 8 windows gbk ...
  • 第一種表示方式:\n 輸出: 通過字元串加字元串的方式,把name和alex加一起,加\n用來換行. 輸出結果 第二種:%s 輸出: a變數中的%s是占位用的,而print中的%是用來補位的,補位順序要和變數a中的一致,不能多,也不能少. 輸出: b中的%%為意譯,不是表示什麼功能而是僅僅表示一個% ...
  • 1、Struts開發基礎 1.1 MVC的基本概念 mvc將一個應用系統的輸入、處理和輸出流程按照Model(模型)、View(視圖)和Controller(控制器)三部分進行分離,劃分成模型層、視圖層和控制層。三層之間以最少的耦合來協同工作,從而提高了應用 系統的可擴展性和可維護性。 MVC思想的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...