微服務SpringCloud之服務網關zuul一

前面學習了Eureka、Feign、Hystrix、Config,本篇來學習下API網關zuul。在微服務架構中,後端服務往往不直接開放給調用端,而是通過一個API網關根據請求的url,路由到相應的服務。當添加API網關後,在第三方調用端和服務提供方之間就創建了一面牆,這面牆直接與調用方通信進行權限控制,後將請求均衡分發給後臺服務端。

爲什麼需要API Gateway

1、簡化客戶端調用複雜度

在微服務架構模式下後端服務的實例數一般是動態的,對於客戶端而言很難發現動態改變的服務實例的訪問地址信息。因此在基於微服務的項目中爲了簡化前端的調用邏輯,通常會引入API Gateway作爲輕量級網關,同時API Gateway中也會實現相關的認證邏輯從而簡化內部服務之間相互調用的複雜度。

2、數據裁剪以及聚合

通常而言不同的客戶端對於顯示時對於數據的需求是不一致的,比如手機端或者Web端又或者在低延遲的網絡環境或者高延遲的網絡環境。

因此爲了優化客戶端的使用體驗,API Gateway可以對通用性的響應數據進行裁剪以適應不同客戶端的使用需求。同時還可以將多個API調用邏輯進行聚合,從而減少客戶端的請求數,優化客戶端用戶體驗

3、多渠道支持

當然我們還可以針對不同的渠道和客戶端提供不同的API Gateway,對於該模式的使用由另外一個大家熟知的方式叫Backend for front-end, 在Backend for front-end模式當中,我們可以針對不同的客戶端分別創建其BFF,進一步瞭解BFF可以參考這篇文章:Pattern: Backends For Frontends

4、遺留系統的微服務化改造

對於系統而言進行微服務改造通常是由於原有的系統存在或多或少的問題,比如技術債務,代碼質量,可維護性,可擴展性等等。API Gateway的模式同樣適用於這一類遺留系統的改造,通過微服務化的改造逐步實現對原有系統中的問題的修復,從而提升對於原有業務響應力的提升。通過引入抽象層,逐步使用新的實現替換舊的實現。

在Spring Cloud體系中, Spring Cloud Zuul就是提供負載均衡、反向代理、權限認證的一個API gateway。

zuul簡單使用

一、引入依賴

引入spring-cloud-starter-netflix-zuul,需要注意springboot的版本號和spring-cloud的版本號,這邊在實現的過程中就出現因版本不一致導致的錯誤。下面的xml中也直接引入了後面要用的spring-cloud-starter-netflix-eureka-client。

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>SpringColudZuulSimple</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>SpringColudZuulSimple</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <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-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
View Code

二、使用@EnableZuulProxy

在main方法中添加@EnableZuulProxy註解。

三、設置配置文件

在application.properties中增加如下配置。

spring.application.name=gateway-service-zuul
server.port=8890
zuul.routes.baidu.path=/it/**
zuul.routes.baidu.url=https://www.cnblogs.com/

四、測試

在瀏覽器輸入http://localhost:8890/it/5ishare,瀏覽器會跳轉到如下頁面。

 

 

 

 服務化

實際上在實現微服務架構時,服務名與服務實例地址的關係在eureka server中已經存在了,所以只需要將Zuul註冊到eureka server上去發現其他服務,就可以實現對serviceId的映射。

一、引入依賴

在上面的SpringColudZuulSimple中添加spring-cloud-starter-netflix-eureka-client依賴。

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

二、添加配置

spring.application.name=gateway-service-zuul
server.port=8890
zuul.routes.baidu.path=/it/**
zuul.routes.baidu.url=https://www.cnblogs.com/
zuul.routes.api-a.path=/producer/**
zuul.routes.api-a.serviceId=spring-cloud-producer
eureka.client.serviceUrl.defaultZone=http://localhost:8088/eureka/

三、測試

依次啓動EurekaServer、EurekaClient、SpringColudZuul。在瀏覽器輸入http://localhost:8890/producer/hello?name=cuiyw

 

網關的默認路由規則

 默認情況下,Zuul會代理所有註冊到Eureka Server的微服務,並且Zuul的路由規則如下:http://ZUUL_HOST:ZUUL_PORT/微服務在Eureka上的serviceId/**會被轉發到serviceId對應的微服務。註銷掉gateway-service-zuul-eureka項目中關於路由的配置:

#zuul.routes.api-a.path=/producer/**
#zuul.routes.api-a.serviceId=spring-cloud-producer

重啓輸入http://localhost:8890/spring-cloud-producer/hello?name=cuiyw

 

參考:http://www.ityouknow.com/springcloud/2017/06/01/gateway-service-zuul.html

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