目錄
工作原理
Zuul閘道有自動轉送機制,但其實Zuul還有更多的應用場景,例如:鑑權、流量轉送、請求統計等等,這些功能都可以使用Zuul來實現。
首頁 Java java教程 SpringCloud之zuul的原理及使用方法介紹

SpringCloud之zuul的原理及使用方法介紹

Apr 11, 2019 pm 01:18 PM
java springboot springcloud

這篇文章帶給大家的內容是關於SpringCloud之zuul的原理及使用方法介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

簡介

Zuul是所有從裝置和web網站到Netflix串流應用程式後端的請求的前門。作為一個邊緣服務應用程序,Zuul的建置是為了支援動態路由、監視、彈性和安全性。它還可以根據需要將請求路由到多個Amazon自動伸縮群組。

Zuul使用了一系列不同類型的篩選器,讓我們能夠快速且靈活地將功能應用到edge服務中。這些過濾器幫助我們執行以下功能:

  • 身份驗證和安全性—識別每個資源的身份驗證需求並拒絕不滿足這些需求的請求。
  • 洞察和監控——在邊緣追蹤有意義的數據和統計數據,以便為我們提供準確的生產視圖。
  • 動態路由-根據需要動態地將請求路由到不同的後端叢集。
  • 壓力測試-逐步增加群集的流量,以評估效能。
  • 減少負載-為每種類型的請求分配容量,並刪除超過限制的請求。
  • 靜態回應處理-直接在邊緣建立一些回應,而不是將它們轉送到內部群集
  • 多區域彈性-跨AWS區域路由請求,以使我們的ELB使用多樣化,並使我們的優勢更接近我們的成員

工作原理

#在高級視圖中,Zuul 2.0是一個Netty伺服器,它運行預過濾器(入站過濾器),然後使用Netty客戶機代理請求,然後在運行後過濾器(出站過濾器)後返回回應。

SpringCloud之zuul的原理及使用方法介紹

篩選器是Zuul業務邏輯的核心所在。它們能夠執行非常大範圍的操作,並且可以在請求-回應生命週期的不同部分運行,如上圖所示。

  • Inbound Filters在路由到來源之前執行,可以用於驗證、路由和裝飾請求。
  • Endpoint Filters 可用於傳回靜態回應,否則內建的ProxyEndpoint過濾器將把請求路由到來源。
  • Outbound Filters 在從來源取得回應後執行,可用於度量、裝飾使用者回應或新增自訂頭。

還有兩種類型的篩選器:同步和非同步。因為我們是在一個事件循環上運行的,所以千萬不要阻塞過濾器。如果要阻塞,可以在一個非同步過濾器中阻塞,在一個單獨的threadpool上阻塞-否則可以使用同步過濾器。

實用過濾器

  • DebugRequest-尋找一個查詢參數來為請求新增額外的偵錯日誌
  • Healthcheck -簡單的靜態端點過濾器,返回200,如果一切引導正確
  • ZuulResponseFilter -新增訊息頭部提供額外的細節路由,請求執行,狀態和錯誤原因
  • GZipResponseFilter -可以啟用gzip出站回應
  • SurgicalDebugFilter -可以將特定的請求路由到不同的主機進行偵錯
##使用技巧

##依賴:

    <dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-starter-netflix-zuul</artifactid>
        </dependency>
登入後複製

MyFilter 過濾器

@Component
public class MyFilter extends ZuulFilter {

    private static Logger log = LoggerFactory.getLogger(MyFilter.class);

    /**
     * pre:路由之前
     * routing:路由之时
     * post: 路由之后
     * error:发送错误调用
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤的顺序
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 这里可以写逻辑判断,是否要过滤,本文true,永远过滤
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }


    /**
     * 过滤器的具体逻辑。
     * 可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            }catch (Exception e){}

            return null;
        }
        log.info("ok");
        return null;
    }

}
登入後複製

application.yml設定路由轉送

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8769
spring:
  application:
    name: cloud-service-zuul
zuul:
  routes:
    api-a:
      path: /api-a/**
      serviceId: cloud-service-ribbon
    api-b:
      path: /api-b/**
      serviceId: cloud-service-feign
登入後複製

#啟用zuul

@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
public class CloudServiceZuulApplication {

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

}
登入後複製

路由熔斷

/**
 * 路由熔断
 */
@Component
public class ProducerFallback implements FallbackProvider {
    private final Logger logger = LoggerFactory.getLogger(FallbackProvider.class);

    //指定要处理的 service。
    @Override
    public String getRoute() {
        return "spring-cloud-producer";
    }

    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
        if (cause != null && cause.getCause() != null) {
            String reason = cause.getCause().getMessage();
            logger.info("Excption {}",reason);
        }
        return fallbackResponse();
    }

    public ClientHttpResponse fallbackResponse() {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.OK;
            }

            @Override
            public int getRawStatusCode() throws IOException {
                return 200;
            }

            @Override
            public String getStatusText() throws IOException {
                return "OK";
            }

            @Override
            public void close() {

            }

            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream("The service is unavailable.".getBytes());
            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }


}
登入後複製
總結

Zuul閘道有自動轉送機制,但其實Zuul還有更多的應用場景,例如:鑑權、流量轉送、請求統計等等,這些功能都可以使用Zuul來實現。


#

以上是SpringCloud之zuul的原理及使用方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

Java 完美數指南。這裡我們討論定義,如何在 Java 中檢查完美數?

Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

Java 版 Weka 指南。這裡我們透過範例討論簡介、如何使用 weka java、平台類型和優點。

Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

Java 史密斯數指南。這裡我們討論定義,如何在Java中檢查史密斯號?帶有程式碼實現的範例。

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java 中的時間戳至今 Java 中的時間戳至今 Aug 30, 2024 pm 04:28 PM

Java 中的時間戳記到日期指南。這裡我們也結合範例討論了介紹以及如何在java中將時間戳記轉換為日期。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

如何在Spring Tool Suite中運行第一個春季啟動應用程序? 如何在Spring Tool Suite中運行第一個春季啟動應用程序? Feb 07, 2025 pm 12:11 PM

Spring Boot簡化了可靠,可擴展和生產就緒的Java應用的創建,從而徹底改變了Java開發。 它的“慣例慣例”方法(春季生態系統固有的慣例),最小化手動設置

See all articles