<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Netflix Zuul 示例 – Zuul API 網關模式 – Spring Cloud 教程 > 原文: [https://howtodoinjava.com/spring-cloud/spring-cloud-api-gateway-zuul/](https://howtodoinjava.com/spring-cloud/spring-cloud-api-gateway-zuul/) 學習使用 **Netflix Zuul** 以及與 **Spring Cloud** 的牢固綁定來創建**負載均衡器**。 在這里,我們將主要關注 **API 網關模式**及其用法。 我們將構建一個 **netflix zuul 示例**,在此示例中,我們將創建一個微服務生態系統并測試其 **Zuul API 網關**在整個生態系統中的有效性和適用性。 這是一種非常常見的微服務模式,Zuul 的創建者 Netflix 大量智能地利用了這種模式,Netflix 聲稱所有 Netflix 流量首先進入 Zuul 集群,該集群主要負責基于不同的動態路由,監控,彈性和安全性。 基于 groovy 的自定義過濾器。 ## 1\. Zuul 在微服務生態系統中是什么位置? 構建微服務時,一個常見的問題是為系統的客戶端應用程序提供唯一的網關。 您的服務被劃分為小型微服務應用程序,否則用戶不應該看到它們,否則可能會導致大量的開發/維護工作。 此外,在某些情況下,整個生態系統網絡流量可能會通過單個點,這可能會影響群集的性能。 為解決此問題,Netflix(微服務的主要采用者)創建并開放了其 **Zuul 代理服務器**,并在之后將其開源,Pivotal 下面的 Spring 將其收納在 **Spring Cloud 技術棧**中, 只需幾個簡單的步驟即可輕松有效地使用 zuul。 Zuul 是一種邊緣服務,代理對多個支持服務的請求。 它為您的生態系統提供了統一的“前門”,允許任何瀏覽器,移動應用程序或其他用戶界面使用來自多個主機的服務。 您可以將 Zuul 與其他 Netflix 堆棧組件(例如 Hystrix 進行容錯)和 Eureka 進行服務發現進行集成,或將其用于管理系統中的路由規則,過濾器和負載平衡。 最重要的是,所有這些組件都可以通過 spring boot / cloud 方法由 spring 框架很好地適應。 ![](https://img.kancloud.cn/aa/65/aa651adaf1b96380e9838b562f3246aa_777x375.jpg) 前端具有 Zuul 網關的微服務生態系統 ## 2\. Zuul 組件 Zuul 主要具有四種類型的過濾器,使我們能夠攔截任何特定事務在請求處理的不同時間軸上的流量。 我們可以為特定的網址格式添加任意數量的過濾器。 * **前置過濾器** – 在路由請求之前被調用。 * **后置過濾器** – 在路由請求后調用。 * **路由過濾器** – 用于路由請求。 * **錯誤過濾器** – 在處理請求時發生錯誤時調用。 ![](https://img.kancloud.cn/d0/2e/d02ec8b242e4ecb38c59d36470b56960_740x432.jpg) Zuul 內部具有不同過濾器的請求處理流程 ## 3\. netflix zuul 示例概述 現在,讓我們使用 Zuul 代理創建一個簡單而有意義的生態系統,以免臟污。 我們將創建以下工件來演示整個過程: * **學生微服務** – 基于 Spring Boot 的微服務,它將僅公開一個 URL 以啟用某些搜索功能。 為簡單起見,我們只返回硬編碼的值,但在現實世界中,我們可以連接到此服務的任何位置以獲取數據。 * **Zuul 網關服務代理** – 將再次基于 Spring Boot,它將基本上攔截所有學生服務的流量并應用一系列請求過濾器,然后路由到基礎服務,并在響應服務時再次路由, 它將應用一些響應過濾。 由于它是網關,因此我們可以有效地使用過濾器來采取許多有趣且有用的操作。 網關服務的一些常見責任是: * 在網關層應用**微服務身份驗證和安全性**以保護實際服務 * 我們可以通過啟用一些日志記錄以獲取邊緣的有意義的數據和統計信息,從而對進入生態系統的所有流量進行**微服務洞察并監視**,以便為我們提供準確的生產視圖。 * **動態路由**可以根據需要將請求路由到不同的后端群集。 * 我們可以通過逐漸增加到新集群的流量來進行**運行時壓力測試**,以便在許多情況下(例如, 群集具有新的硬件和網絡設置,或者已部署了新版本的生產代碼。 * 我們可以進行**動態減載**,即為每種類型的請求分配容量,并丟棄超出限制的請求。 * 我們可以應用**靜態響應處理**,即直接在邊緣構建一些響應,而不是將其轉發到內部集群進行處理。 #### 技術棧和運行時 * Java 1.8 和 Eclipse IDE 作為開發環境 * Spring Cloud Zuul 作為網關代理供應器 * Spring Boot 作為應用程序框架 * Spring Rest 用于將微服務公開為 REST * Maven 作為構建工具 ## 4\. 創建學生微服務 請按照以下步驟開發學生微服務,該服務將公開幾個 REST 終結點,這些終結點以后可通過 zuul 代理進行訪問。 稍后我們將研究 zuul 部分,讓我們首先創建學生服務。 #### 4.1. 創建 Spring Boot 項目 從[ spring 初始化器頁面](https://start.spring.io/)創建一個具有相關性(即`Web`和`Rest Repositories`)的 Spring Boot 項目。 給出其他 Maven GAV 坐標并下載項目。 ![](https://img.kancloud.cn/88/3d/883dd800ba61655123488488ab909e55_1350x701.jpg) 學生服務 Maven 項目生成 將項目解壓縮并將其作為`existing maven project`導入 Eclipse。 在此步驟中,使用命令`mvn clean install`重新構建 Maven,以便正確下載所有 Maven 依賴項。 #### 4.2. 添加一些 REST 端點 現在,我們將僅向該服務添加一些 REST 端點,以便稍后測試代理。 為此,我們需要通過添加注解`@RestController`來添加一個 REST 控制器。 為簡單起見,我們將添加一個模型類`Student`。 完成所有更改后,該類將如下所示。 ```java package com.example.springboostudentservice; import java.util.Date; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @SpringBootApplication public class SpringBootStudentServiceApplication { @RequestMapping(value = "/echoStudentName/{name}") public String echoStudentName(@PathVariable(name = "name") String name) { return "hello <strong style=\"color: red;\">" + name + " </strong> Responsed on : " + new Date(); } @RequestMapping(value = "/getStudentDetails/{name}") public Student getStudentDetails(@PathVariable(name = "name") String name) { return new Student(name, "Pune", "MCA"); } public static void main(String[] args) { SpringApplication.run(SpringBootStudentServiceApplication.class, args); } } class Student { String name; String address; String cls; public Student(String name, String address, String cls) { super(); this.name = name; this.address = address; this.cls = cls; } public String getName() { return name; } public String getAddress() { return address; } public String getCls() { return cls; } } ``` #### 4.3. 應用配置 現在打開`application.properties`文件并添加這些條目。 ```java spring.application.name=student server.port=8090 ``` 在這里,我們通過屬性`spring.application.name=student`為該服務命名,并且通過`server.port=8090`定義默認端口。 我們需要覆蓋默認端口,因為我們將在本地主機中運行不同微服務的多個實例。 #### 4.4. 驗證學生服務 最后,使用命令`mvn clean install`進行 maven 構建,并通過運行命令`java -jar target\spring-boot-zuulgatwayproxy-student-service-0.0.1-SNAPSHOT.jar`作為 Spring Boot 應用程序啟動該項目。 現在,一旦服務器啟動,請轉到瀏覽器并測試端點是否正常運行。 `http://localhost:8090/echoStudentName/Sajal` ![](https://img.kancloud.cn/ff/e7/ffe73ef443a8c1dd1451722ebe58067f_639x203.jpg) 瀏覽器輸出 `http://localhost:8090/getStudentDetails/Sajal` ![](https://img.kancloud.cn/46/97/469733a13a45f4883335500610ee5c01_657x127.jpg) 瀏覽器輸出 現在,我們將使用 Zuul 創建實際的代理服務。 ## 5\. 創建 Zuul 網關服務代理 這將再次是基于 Spring Boot 的微服務,但它具有特殊功能。 它將使用 zuul 創建一個 API 網關代理,該代理將代理學生服務。 稍后,我們可以添加任何數量的微服務,例如學生服務,并能夠創建強大的微服務生態系統。 #### 5.1. 創建 Spring Boot 項目 從具有`Zuul`依賴關系的[ spring 初始化器頁面](https://start.spring.io/)創建一個 Spring Boot 項目。 給出其他 Maven GAV 坐標并下載項目。 ![](https://img.kancloud.cn/27/20/2720aee75ee2961d322b2da410e67a43_1356x701.jpg) Zuul 代理服務 Maven 項目生成 將項目解壓縮并將其作為現有的 maven 項目導入 Eclipse。 在此步驟中,使用命令`mvn clean install`重新構建 Maven,以便正確下載所有 Maven 依賴項。 #### 5.2. 啟用 Zuul 服務代理 現在,在`src`文件夾中的 Spring 運行應用程序類上添加`@EnableZuulProxy`注解。 使用此注解,此工件將像 Zuul 服務代理一樣工作,并將啟用 API 網關層的所有功能,如前所述。 然后,我們將添加一些過濾器和路由配置。 ```java package com.example.springbootzuulgatwayproxy; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.context.annotation.Bean; import com.example.springbootzuulgatwayproxy.filters.ErrorFilter; import com.example.springbootzuulgatwayproxy.filters.PostFilter; import com.example.springbootzuulgatwayproxy.filters.PreFilter; import com.example.springbootzuulgatwayproxy.filters.RouteFilter; @SpringBootApplication @EnableZuulProxy public class SpringBootZuulgatwayproxyApplication { public static void main(String[] args) { SpringApplication.run(SpringBootZuulgatwayproxyApplication.class, args); } @Bean public PreFilter preFilter() { return new PreFilter(); } @Bean public PostFilter postFilter() { return new PostFilter(); } @Bean public ErrorFilter errorFilter() { return new ErrorFilter(); } @Bean public RouteFilter routeFilter() { return new RouteFilter(); } } ``` #### 5.3. Zuul 路由配置 打開`application.properties`并添加以下條目: ```java #Zuul routes. Here for /student path, we are routing to localhost:8090 with extra path after that. zuul.routes.student.url=http://localhost:8090 #Ribbon is auto integrated with Zuul and for this exercise we are not using that. ribbon.eureka.enabled=false #Will start the gateway server @8080 server.port=8080 ``` 在這里,`zuul.routes.student.url`將路由所有請求`/student`的流量到實際的學生服務服務器。 這樣,我們也可以將路由添加到其他服務。 `ribbon.eureka.enabled`與 Zuul 自動集成。 `server.port` – 需要覆蓋默認端口,因為我們將在本地主機中運行不同微服務的多個實例。 #### 5.4. 添加 Zuul 過濾器 如我們已經描述的,我們現在將添加一些過濾器,Zuul 支持 4 種類型的過濾器,即`pre`,`post`,`route` 和`error`。 在這里,我們將創建每種類型的過濾器。 要編寫過濾器,我們基本上需要執行以下步驟: * 需要擴展`com.netflix.zuul.ZuulFilter` * 需要覆蓋`filterType`,`filterOrder`,`shouldFilter`和`run`方法。 這里`filterType`方法只能返回四個字符串 – `pre/post/route/error`中的任何一個。 依賴此值,過濾器將像特定過濾器一樣工作。 * `run`方法是根據我們的要求放置過濾器邏輯的地方。 * 同樣,我們可以根據需要添加任意數量的任何特定過濾器,在這種類型的過濾器執行階段,這種情況`filterOrder`將用于確定該過濾器的順序。 **前置過濾器代碼** – 我們將添加以下前置過濾器。 目前,出于測試目的,過濾器除了`println`以外無所作為。 但是實際上,這些功能足以執行前面提到的許多重要切面。 ```java package com.example.springbootzuulgatwayproxy.filters; import javax.servlet.http.HttpServletRequest; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; public class PreFilter extends ZuulFilter { @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 1; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); System.out.println("Request Method : " + request.getMethod() + " Request URL : " + request.getRequestURL().toString()); return null; } } ``` **后置過濾器** ```java package com.example.springbootzuulgatwayproxy.filters; import com.netflix.zuul.ZuulFilter; public class PostFilter extends ZuulFilter { @Override public String filterType() { return "post"; } @Override public int filterOrder() { return 1; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { System.out.println("Inside Response Filter"); return null; } } ``` **路由過濾器** ```java package com.example.springbootzuulgatwayproxy.filters; import com.netflix.zuul.ZuulFilter; public class RouteFilter extends ZuulFilter { @Override public String filterType() { return "route"; } @Override public int filterOrder() { return 1; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { System.out.println("Inside Route Filter"); return null; } } ``` **錯誤過濾器** ```java package com.example.springbootzuulgatwayproxy.filters; import com.netflix.zuul.ZuulFilter; public class ErrorFilter extends ZuulFilter { @Override public String filterType() { return "error"; } @Override public int filterOrder() { return 1; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { System.out.println("Inside Route Filter"); return null; } } ``` #### 5.5. 注冊 zuul 過濾器 創建這些過濾器的 Bean 定義以進行自動注冊和啟用。 ```java @Bean public PreFilter preFilter() { return new PreFilter(); } @Bean public PostFilter postFilter() { return new PostFilter(); } @Bean public ErrorFilter errorFilter() { return new ErrorFilter(); } @Bean public RouteFilter routeFilter() { return new RouteFilter(); } ``` ## 6\. Netflix Zuul 示例演示 因此,我們啟用了 Zuul,添加了所需的配置并開發了過濾器。 因此,我們可以進行基本測試以了解整個過程。 使用命令`mvn clean install`進行 Maven 構建,并通過運行命令`java -jar target\spring-boot-zuulgatwayproxy-0.0.1-SNAPSHOT.jar`作為 Spring Boot 應用程序啟動該項目。 現在,服務器啟動后,進入瀏覽器并通過訪問學生服務(名稱為`/student`)來測試端點是否正常運行。 `http://localhost:8080/student/getStudentDetails/Sajal` ![](https://img.kancloud.cn/ba/10/ba100b22e48364e4f1dba023419e264f_767x188.jpg) 代理服務輸出 `http://localhost:8080/student/echoStudentName/Sajal` ![](https://img.kancloud.cn/de/5a/de5a14de7e48af90e608584ac7f33bbd_749x235.jpg) 代理服務輸出 ## 7\. 總結 關于 netflix zuul 過濾器示例的全部內容。 我建議您自己做,添加更多基礎服務,并通過代理路由請求,應用不同類型的過濾器,并在過濾器中添加真實的邏輯。 [下載源碼](https://howtodoinjava.com/wp-content/uploads/2017/07/apigateway_zuul.zip) 將我的問題放在評論部分。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看