springcloud教程 -- 4.網關zuul的使用詳解

一、zuul的簡單介紹

強烈建議閱讀官網介紹,官網寫的非常棒!!!

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

1.zuul是什麼?

原文搬運:

Zuul is the front door for all requests from devices and web sites to the backend of the Netflix streaming application. As an edge service application, Zuul is built to enable dynamic routing, monitoring, resiliency and security. It also has the ability to route requests to multiple Amazon Auto Scaling Groups as appropriate.

譯文:

Zuul是所有來自設備和web站點到Netflix流媒體應用程序後端的請求的前門。作爲一個邊緣服務應用程序,Zuul的構建是爲了支持動態路由、監視、彈性和安全性。它還可以根據需要將請求路由到多個Amazon自動伸縮組。Netflix API流量的數量和多樣性有時會導致生產問題迅速而且沒有任何警告。我們需要一個允許我們快速改變行爲的系統,以便對這些情況做出反應。

2.爲什麼使用zuul?

Netflix API流量的數量和多樣性有時會導致生產問題在沒有警告的情況下迅速出現。我們需要一個能讓我們迅速改變行爲以應對這些情況的系統。

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

  身份驗證和安全性——爲每個資源確定身份驗證需求並拒絕不滿足需求的請求。

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

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

  壓力測試——逐步增加集羣的流量,以評估性能。

  減少負載——爲每種類型的請求分配容量,並刪除超過限制的請求。

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

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

3.總結

1.Zuul具有基本的路由功能,外部請求經由zuul設置的策略進行路由,實現系統訪問入口的統一,提高系統的安全性

2.zuul具有功能豐富的過濾器,是我們對請求進行加工處理變得更爲簡單。

二、實際應用demo

接着前文我們創建了springcloud的6個demo工程,本章節介紹如何使用zuul

沒看過上文的,請先查看相關文章:

springcloud教程 -- 1.快速搭建入門級demo, 看這一篇就夠了

springcloud教程 -- 2.feign的使用實踐優雅的發送請求

springcloud教程 -- 3.微服務熔斷機制,斷路器hystrix的使用詳解

1. 接前文的demo基礎,在j-cloud下添加moudle:j-cloud-zuul

2.項目結構如下:

3.pom.xml文件內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.jorian.framework</groupId>
    <artifactId>j-cloud-zuul</artifactId>
    <version>1.0.0</version>
    <name>j-cloud-zuul</name>
    <description>Demo project for Spring Boot</description>
    <!-- lookup parent from repository -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath />
    </parent>
    <!-- 屬性設置 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!-- eureka  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- zuul -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <!--LOMBOK-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>
        <!--單元測試依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <!-- dependency management -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

4.啓動器JCloudZuulApplication代碼如下:

package cn.jorian.framework;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy  //開啓zuul代理
@EnableEurekaClient		//zuul服務要註冊到Eureka上
public class JCloudZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(JCloudZuulApplication.class, args);
    }
}

5.配置文件application.yml如下:

注意:

1.routes.app-a指的應用app-a,這個名字可改爲app-b,app-c

2.routes.app-a.path指的是屬於應用app-a的請求,使用**進行通配

3.routes.app-a.servieId指的是請求被指向的應用名稱

下圖配置代表:http://127.0.0.1:9000/u/addUser   會被重新指向 provider-user/addUser ,而provider-user已經在Eureka中註冊,所以最終的請求路徑爲:http://127.0.0.1:7901/addUser

注意:假如我們系統中啓動了兩個provider-user實例,那麼zuul會自動負載均衡,默認輪詢來轉發請求。

server:
  port: 9000
spring:
  application:
    name: gateway-zuul
eureka:
  client:
    serviceUrl:
      defaultZone: http://jorian:123456@localhost:8761/eureka
zuul:
  ignoredServices: '*'
  routes:
    app-a:
      path: /u/**
      serviceId: provider-user

 

6.以上步驟做完,依次啓動j-cloud-server,j-cloud-provider1,j-cloud-zuul

7.在註冊中心查看各個服務是否上線,上線如下:

8.在瀏覽器輸入 網關地址+應用名稱+接口,例如:http://localhost:9000/u/user/sayHello

能夠返回接口的結果:

 9.負載均衡測試:再啓動一個provider-user,即工程:j-cloud-provider2

再次反覆訪問網關地址+應用名稱+接口,例如:http://localhost:9000/u/user/sayHello

返回結果會自動切換,證明zuul對請求進行了負載均衡

第n次:

第n+1次:

10.其餘複雜情況請自行挖掘

 

至此,zuul的基本學習已經完成

您可繼續關注後續內容更新

或者在github下載完整demo工程:若對您有用,請star,謝謝

 

 

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