SpringCloud - Zuul路由網關

【1】Zuul是什麼

Zuul是從設備和網站到Netflix流應用程序後端的所有請求的前門。作爲邊緣服務應用程序,Zuul旨在實現動態路由,監控,彈性和安全性。它還可以根據需要將請求路由到多個合適的Amazon彈性收縮組。

爲什麼創建Zuul?

Netflix API流量的數量和多樣性有時會導致生產問題迅速而且沒有任何警告。我們需要一個允許我們快速改變行爲的系統,以便對這些情況做出反應。

Zuul使用一系列不同類型的過濾器,使我們能夠快速靈活地將功能應用於我們的邊緣服務。這些過濾器可幫助我們執行以下功能:

  • 身份驗證和安全性 - 識別每個資源的身份驗證要求並拒絕不滿足這些要求的請求。

  • 洞察和監控 - 在邊緣跟蹤有意義的數據和統計數據,以便爲我們提供準確的生產視圖。

  • 動態路由 - 根據需要動態地將請求路由到不同的後端羣集。

  • 壓力測試 - 逐漸增加羣集的流量以衡量性能。

  • Load Shedding - 爲每種類型的請求分配容量並刪除超過限制的請求。

  • 靜態響應處理 - 直接在邊緣構建一些響應,而不是將它們轉發到內部集羣

  • 多區域彈性 - 跨AWS區域路由請求,以使我們的ELB使用多樣化,並使我們的優勢更接近我們的成員。

綜上,Zuul包含了對請求的路由和過濾兩個最主要的功能。其中路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎。而過濾器功能則負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎。

Zuul和Eureka進行整合,將Zuul自身註冊爲Eureka服務治理下的應用,同時從Eureka中獲得其他微服務的消息,也即以後的微服務的訪問都是通過Zuul跳轉後獲得。

Zuul官網地址:https://github.com/Netflix/zuul/wiki


【2】Zuul的基本配置

① 創建Module/microservicecloud-zuul-gateway-9527

pom依賴如下:

     <dependencies>
        <!-- zuul路由網關 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <!-- Eureka服務註冊 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- actuator監控 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- hystrix熔斷 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <!-- 日常標配 -->
        <dependency>
            <groupId>com.web.springcloud</groupId>
            <artifactId>microservicecloud-api</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- Boot依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- 熱部署插件 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>

② yml配置文件

server: 
  port: 9527

spring: 
  application:
    name: microservicecloud-zuul-gateway

eureka: 
  client: 
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka  
  instance:
    instance-id: gateway-9527.com
    prefer-ip-address: true 


info:
  app.name: web-microcloud
  company.name: www.web.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$


③ hosts文件修改

# spring cloud eureka
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com
# spring cloud zuul
127.0.0.1 myzuul.com

④ 主啓動類如下

@SpringBootApplication
@EnableZuulProxy
public class Zuul_9527_StartSpringCloudApp
{
    public static void main(String[] args)
    {
        SpringApplication.run(Zuul_9527_StartSpringCloudApp.class, args);
    }
}

此時整個項目架構如下圖:

這裏寫圖片描述


⑤ 測試

啓動三個服務集羣、服務提供者8001和路由9527。

這裏寫圖片描述

不用路由直接測試:http://localhost:8001/dept/get/1

使用路由測試:http://myzuul.com:9527/microservicecloud-dept/dept/get/1

這裏寫圖片描述


【3】路由映射規則實例

如對訪問http://myzuul.com:9527/microservicecloud-dept/dept/get/1請求進行轉發和加固。

① 修改yml文件

zuul: 
  routes: 
    mydept.serviceId: microservicecloud-dept
    mydept.path: /mydept/**

此時,請求轉變爲http://myzuul.com:9527/mydept/dept/get/1

這裏寫圖片描述


此時將/microservicecloud-consumer-dept-feign啓動,測試如下:

這裏寫圖片描述


此時兩種方式都可以訪問:

http://myzuul.com:9527/microservicecloud-dept/dept/get/1

http://myzuul.com:9527/mydept/dept/get/1


② 如何忽略真實服務名?

  • 單服務忽略設置如下:
zuul: 
  ignored-services: microservicecloud-dept
  routes: 
    mydept.serviceId: microservicecloud-dept
    mydept.path: /mydept/**

此時訪問http://myzuul.com:9527/microservicecloud-dept/dept/get/1將會出現Error page。

這裏寫圖片描述


  • 忽略所有服務名
zuul: 
  ignored-services: "*"
  routes: 
    mydept.serviceId: microservicecloud-dept
    mydept.path: /mydept/**

③ 設置請求統一前綴

zuul: 
  prefix: /web
  ignored-services: "*"
  routes: 
    mydept.serviceId: microservicecloud-dept
    mydept.path: /mydept/**

此時http://myzuul.com:9527/mydept/dept/get/1將不可訪問,請求轉變爲http://myzuul.com:9527/web/mydept/dept/get/1

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章