<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                * Spring Cloud Zuul 是整合Netflix公司的 Zuul開源項目(官方:https://github.com/Netflix/zuul); * Zuul 包含了對請求路由和校驗過濾兩個最主要的功能: 1.其中路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎, 客戶端請求網關/api/product,通過路由轉發到 product 服務 客戶端請求網關/api/order,通過路由轉發到 order 服務 2.而過濾功能則負責對請求的處理過程進行干預,是實現請求校驗等功能的基礎. * Zuul 和 Eureka 進行整合,將 **Zuul 自身注冊為 Eureka 服務治理中的服務**,同時從 Eureka 中獲得其他微服務的消息,也即以后的訪問微服務都是通過Zuul跳轉后獲得。 ## **1. Zuul路由轉發功能實戰** ### 1.1 新建一個zuul路由模塊 ![](https://img.kancloud.cn/80/51/8051a9198bb8621e0a76c837a58912f0_332x289.png) ### 1.2 修改pom文件 springboot web依賴、Eureka client啟動器依賴、zuul啟動器依賴 ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--zuul路由網關依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> ``` ### 1.3 修改yml,配置Eureka client 因為zuul需要向Eureka server注冊和zuul配置 ~~~ zuul: routes: provider-product: # 路由名稱,名稱任意,路由名稱唯一 path: /product/** # 訪問路徑 serviceId: microservice-product # 指定服務ID,會自動從Eureka中找到此服務的ip和端口 stripPrefix: false # 代理轉發時去掉前綴,false:代理轉發時不去掉前綴 例如:為true時請求 /product/get/1,代理轉發到/get/1 ~~~ 完整配置 ~~~ server: port: 7001 spring: application: name: microservice-zuul-gateway eureka: client: registerWithEureka: true # 服務注冊開關 fetchRegistry: true # 服務發現開關 serviceUrl: # 客戶端(服務提供者)注冊到哪一個Eureka Server服務注冊中心,多個用逗號分隔 # 單機版 Eureka 服務注冊中心 #defaultZone: http://localhost:6001/eureka # 集群版 Eureka 服務注冊中心 defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka instance: instanceId: ${spring.application.name}:${server.port} # 指定實例ID,就不會顯示主機名了 preferIpAddress: true #訪問路徑可以顯示IP地址 zuul: routes: provider-product: # 路由名稱,名稱任意,路由名稱唯一 path: /product/** # 訪問路徑 serviceId: microservice-product # 指定服務ID,會自動從Eureka中找到此服務的ip和端口 stripPrefix: false # 代理轉發時去掉前綴,false:代理轉發時不去掉前綴 例如:為true時請求 /product/get/1,代理轉發到/get/1 ~~~ ### 1.4 @EnableZuulProxy 注解標注啟動類,開啟zuul的功能 ~~~ @EnableZuulProxy //開啟zuul的功能 @SpringBootApplication public class ZuulServer_7001 { public static void main(String[] args) { SpringApplication.run(ZuulServer_7001.class, args); } } ~~~ 啟動Eureka server,服務提供端和消費端,zuul server 觀看Eureka server注冊情況,如下圖Eureka server處于集群模式,一共有三個服務端進行了注冊,其中包括zuul路由 ![](https://img.kancloud.cn/9c/72/9c720e70fd1454aa406a161d47343033_1253x330.png) ### 1.5 路由測試 **1. 不用路由直接訪問** 訪問: http://localhost:8001/product/get/1 ![](https://img.kancloud.cn/bb/74/bb740a41ea1345f62ff1e475d45261d1_564x115.png) **2. 使用路由訪問 (注意是 7001 端口), 當前要加上服務名** 訪問:http://localhost:7001/microservice-product/product/get/1 ![](https://img.kancloud.cn/01/04/0104ab3d03aa1c18cc38b6c676793177_572x104.png) **3.不加服務名,直接通過路由訪問** 因為zuul路由服務已經配置了 /product/** 形式的請求URL,都會轉發到serviceId: microservice-product 微服務實例 ~~~ zuul: routes: provider-product: # 路由名稱,名稱任意,路由名稱唯一 path: /product/** # 訪問路徑 serviceId: microservice-product # 指定服務ID,會自動從Eureka中找到此服務的ip和端口 stripPrefix: false # ~~~ ![](https://img.kancloud.cn/6b/0c/6b0cd0f19d41bc3fe83ab0131438696e_503x119.png) ## **2. 路由過濾實戰** ### **2.1 自定義過濾器** > Zuul核心就是過慮器,通過過慮器實現**請求過慮**,**身份校驗**等。 **自定義過慮器需要繼承 ZuulFilter**,ZuulFilter是一個抽象類,需要覆蓋它的4個方法,如下: **1. filterType**:返回字符串代表過濾器的類型,返回值有: * pre:在請求路由之前執行 * route:在請求路由時調用 * post:請求路由之后調用, 也就是在route和errror過濾器之后調用 * error:處理請求發生錯誤時調用 **2. filterOrder**:此方法返回整型數值,通過此數值來定義過濾器的執行順序,數字越小優先級越高。 **3. shouldFilter**:返回Boolean值,判斷該過濾器是否執行。返回true表示要執行此過慮器,false不執行。 **4. run**:過濾器的業務邏輯。 ### **2.2 自定義LoginFilter** 自定義一個zuul過濾器 LoginFilter ,大致需要以下幾個操作步驟 1. 繼承 ZuulFilter 2. 在類上添加 @Component 注解 (一定不要少了) 3. 實現抽象方法 ~~~ package com.tuna.springcloud.zuul.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @Component //一定不要少了 public class LoginFilter extends ZuulFilter { Logger logger = LoggerFactory.getLogger(getClass()); @Override public String filterType() { return "pre"; // } @Override public int filterOrder() { return 1; //返回值是int,會根據返回值進行定義過濾器的執行順序,值越小優先級越大 } @Override public boolean shouldFilter() { return true; //當前過濾器是否被執行,true則執行,false不執行 } //定義 過濾功能 @Override public Object run() throws ZuulException { //1.獲取請求上下文(zuul封裝) RequestContext context = RequestContext.getCurrentContext(); HttpServletRequest request = context.getRequest(); String token = request.getParameter("token"); //如果說請求帶了token值,則表示已經登錄過 if(token == null) { logger.warn("此操作需要先登錄系統"); //沒有登錄 過,則不進行路由轉發 context.setSendZuulResponse(false);//拒絕訪問 context.setResponseStatusCode(200); //響應狀態碼 try { context.getResponse().getWriter().write("token is empty..."); } catch (IOException e) { e.printStackTrace(); } return null; } //通過,會進行路由轉發 logger.info("通過,會進行路由轉發"); return null; } } ~~~ ### **2.2 測試** 1. 直接訪問,沒有任何token信息,zuul過濾直接拒絕訪問 ![](https://img.kancloud.cn/04/77/04776891275862d5267719a1502276b2_401x122.png) 2. 帶token信息,可以訪問 ![](https://img.kancloud.cn/31/a7/31a769b1735ea578124c0a06d4b68417_578x206.png)
                  <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>

                              哎呀哎呀视频在线观看