1. 程式人生 > >Spring Cloud(六):服務閘道器zuul

Spring Cloud(六):服務閘道器zuul

通過前面幾篇文章的介紹,Spring Cloud微服務架構可通過Eureka實現服務註冊與發現,通過Ribbon或Feign來實現服務間的負載均衡呼叫,通過Hystrix來為服務呼叫提供服務降級、熔斷機制避免雪崩效應,通過Spring Cloud Config實現服務配置的集中化管理。微服務架構內部管理的基本元件差不多都已涵蓋了,但是我們的服務最終是需要提供給客戶端訪問的,客戶端如何來訪問這些微服務,就需要引入一個叫服務閘道器的元件了。

zuul

zuul是netflix提供的一個基於JVM的路由與服務端負載均衡器。它在客戶端與後端服務之間建立了一道關卡,客戶端所有請求必須經過zuul轉發到後端對應的微服務,返回結果再經由zuul返回給客戶端。zuul與Eureka,Config組合的基本結構如圖

zuul作為Eureka Client從Eureka Server獲取其它微服務的配置資訊,從而可以將客戶端請求通過Service ID來負載均衡地轉發到後端的服務例項,同時也作為Config Client從Config Server獲取自身所需的配置資訊。

在netflix內部,zuul被用來實現安全認證、動態路由、反向代理、服務遷移、服務削峰、壓力測試、金絲雀測試(灰度釋出測試)等功能。本文介紹zuul的基本使用與路由規則。

基本使用

建立maven專案 springcloud-zuul

1.pom.xml中引入依賴 spring-cloud-starter-netflix-zuul

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

2.application.yml配置檔案中新增必要的配置,主要是eureka客戶端配置

spring:
  application:
    name: zuul-server

server:
  port: 8765

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

3.啟動類添加註解 @EnableZuulProxy

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
}

一如既往的簡單,Spring Cloud之所以流行就是因為它基於Spring Boot將一些通用的功能進行了開箱即用的封裝,使得開發者簡單幾步就能快速整合一個微服務框架。

依次啟動前文所建立的springcloud-eureka, springcloud-config, springcloud-eureka-client, springcloud-zuul,http://localhost:8765/hello-service/hello 返回 Hello, welcome to spring cloud. env: hello-service-dev, value: hello-service-dev 可見通過zuul的請求轉發到了hello-service。

為了驗證zuul轉發請求具備負載均衡的能力,可以將springcloud-eureka-client 中的hello介面返回值做一些調整,並改變埠重啟一個例項,再次請求http://localhost:8765/hello-service/hello 將能看到返回結果在兩者之間切換。

以上配置檔案中並沒有加任何路由配置,zuul是怎麼將請求正確轉發到對應的微服務的呢? 請看下面的路由規則。

路由規則

1.預設路由規則

zuul提供了預設的路由規則,不需要任何配置就會預設將註冊的服務進行路徑對映。我們可以通過actuator提供的介面來檢視,在application.yml中新增配置

management:
  endpoints:
    web:
      exposure:
        include: "*"

放開actuator的其它介面訪問(預設只放開了/info 與/health介面), 瀏覽器中訪問 http://localhost:8765/actuator/routes, 可以看到返回的zuul預設的路由對映關係

zuul預設將 /service-id/** 的請求路由到Service ID(即spring.application.name的值)為 service-id的服務,如 /hello-service/hello,將轉發到hello-service服務的/hello介面。

2.自定義路由規則

我們看到zuul的預設路由規則將config-server也映射出來了,對於這類內部服務我們不希望暴露,則可以通過 zuul.ignoredServices 來進行遮蔽,在application.yml配置檔案中新增

zuul:
  ignored-services: "config-server"

重啟,再次檢視http://localhost:8765/actuator/routes , config-server已經被遮蔽了。

通過zuul.routes可新增自定義路由,可以有 zuul.routes.{route-name}.path + zuul.routes.{route-name}.serviceId或urlzuul.routes.{service-id}: path 兩個格式, 如下

zuul:
  ignored-services: "config-server"
  routes:
    hello:
      path: /hi/**
      serviceId: hello-service
    hello-service: /hi2/**
    jboost:
      path: /jboost/**
      url: http://blog.jboost.cn

訪問 http://localhost:8765/hi/hello 或 http://localhost:8765/hi2/hello 都將路由到 hello-service的hello介面,訪問 http://localhost:8765/jboost/ 將訪問到jboost部落格首頁。新增自定義路由後,預設路由仍然存在, 你仍然可以通過 http://localhost:8765/hello-service/hello 來訪問 hello-service的hello介面。

預設的路由規則將Service ID作為匹配路徑,看起來有點長,我們想將匹配路徑縮短一點,比如hello-service的匹配路徑想改為 /hello/**, 而不是/hello-service/**, 如果像上面配置,一個微服務系統可能涉及幾十甚至上百個服務,那配置起來將是一場噩夢。別急, zuul提供了 ServiceRouteMapper 介面來解決這一問題,其中 PatternServiceRouteMapper 可以基於正則表示式來進行路由抽取。

建立一個配置類,注入一個 PatternServiceRouteMapper 的bean,如下

@Configuration
public class ZuulConfiguration {

    @Bean
    public PatternServiceRouteMapper serviceRouteMapper() {
        return new PatternServiceRouteMapper(
                "(?<name>^.+)-(?<postfix>.+$)",
                "${name}");
    }
}

該實現將會對所有服務的路由進行調整,service id 形如 name-postfix的匹配路徑為 /name/**, 如hello-service 匹配 /hello/**。 如果正則表示式匹配失敗,則還是以預設規則進行路由,如果匹配成功,則預設規則失效,但在配置檔案中定義的路由仍然有效。上述驗證中,你都可以通過 http://localhost:8765/actuator/routes 來檢視當前生效的路由。

其它配置

zuul使用Ribbon來定位服務例項,所有請求都在hystrix command裡執行,所以在zuul中可以新增Ribbon, Hystrix相關配置(具體參考前面Ribbon、Hystrix相關文章)

  • zuul.ignoredPatterns 對某些路徑進行遮蔽,如 /**/admin/** 將會遮蔽所有路徑中包含admin的介面訪問
  • zuul.sensitiveHeaders 對一些header進行過濾,不傳遞給後端服務,預設包括Cookie,Set-Cookie,Authorization, 如果要讓zuul傳送所有header,則需要顯式地將sensitiveHeaders置空值
  • zuul.prefix 為所有對映新增字首,如/api, 這樣route裡配的 /myusers/** 就能匹配客戶端請求的/api/myusers/**。預設zuul代理在轉發時,字首會被移除,通過設定zuul.stripPrefix=false可不移除

總結

本文簡單介紹了zuul的基本使用與路由規則,更高階的應用我們後面繼續。
認真生活,快樂分享
歡迎關注微信公眾號:空山新雨的技術空間
獲取Spring Boot,Spring Cloud,Docker等系列技術文章

相關推薦

Spring Cloud服務zuul

通過前面幾篇文章的介紹,Spring Cloud微服務架構可通過Eureka實現服務註冊與發現,通過Ribbon或Feign來實現服務間的負載均衡呼叫,通過Hystrix來為服務呼叫提供服務降級、熔斷機制避免雪崩效應,通過Spring Cloud Config實現服務配置的集中化管理。微服務架構內部管理的基本

Spring Cloud服務zuul過濾器

上文介紹了Zuul的基本使用與路由功能,本文接著介紹Zuul的核心概念 —— Zuul過濾器(filter)。 Zuul的功能基本通過Zuul過濾器來實現(類比於Struts的攔截器,只是Struts攔截器用到責任鏈模式,Zuul則是通過FilterProcessor來控制執行),在不同的階段,通過不同型別的

一起來學Spring Cloud | 第服務 ( Zuul)

本章節,我們講解springcloud重要元件:微服務閘道器Zuul。如果有同學從第一章看到本章的,會發現我們已經講解了大部分微服務常用的基本元件。 已經講解過的: 一起來學Spring Cloud | 第一章 :如何搭建一個多模組的springcloud專案 一起來學Spring Cloud | 第二章:服

Spring基礎快速入門spring cloud4APIZuul

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

SpringCloud服務Zuul

一、服務閘道器 官方文件:  https://springcloud.cc/spring-cloud-dalston.html#_router_and_filter_zuul 路由在微服務體系結構的一個組成部分。例如,/可以對映到您的Web應用程式,/api/users對映

Spring Cloud服務Zuul高階篇11

時間過的很快,寫springcloud(十):服務閘道器zuul初級篇還在半年前,現在已經是2018年了,我們繼續探討Zuul更高階的使用方式。 上篇文章主要介紹了Zuul閘道器使用模式,以及自動轉發機制,但其實Zuul還有更多的應用場景,比如:鑑權、流量轉發、請求統計等等,這些功能都可以使用Z

Spring Cloud服務zuul10

前面的文章我們介紹了,Eureka用於服務的註冊於發現,Feign支援服務的呼叫以及均衡負載,Hystrix處理服務的熔斷防止故障擴散,Spring Cloud Config服務叢集配置中心,似乎一個微服務框架已經完成了。 我們還是少考慮了一個問題,外部的應用如何來訪問內部各種各樣的微服務呢?在

Spring Boot + Spring Cloud 實現許可權管理系統 後端篇二十一服務Zuul

線上演示 使用者名稱:admin 密碼:admin 技術背景 前面我們通過Ribbon或Feign實現了微服務之間的呼叫和負載均衡,那我們的各種微服務又要如何提供給外部應用呼叫呢。 當然,因為是REST API介面,外部客戶端直接呼叫各個微服務是沒有問題的,但出於種種原因,這並不是一個好的選擇。 讓客戶端直

Spring Cloud服務容錯保護 Hystrix【Finchley 版】

回調 alt 差異 ner 隔離 簡化 保護 不可用 無法 Spring Cloud(四):服務容錯保護 Hystrix【Finchley 版】 發表於 2018-04-15 | 更新於 2018-05-07 | 分布式系統中經常會出現某個基礎服務不可用造成整個系統

Spring Cloud服務提供與調用 Eureka【Finchley 版】

fan default fun cer 觀察 微服務 divide 動態 erl Spring Cloud(三):服務提供與調用 Eureka【Finchley 版】 發表於 2018-04-15 | 更新於 2018-05-07 | 上一篇文章我們介紹了 Eure

Spring Cloud服務註冊與發現 Eureka【Finchley 版】

LEDE .com Go eureka clean 英文逗號 開始 效果 sam Spring Cloud(二):服務註冊與發現 Eureka【Finchley 版】 發表於 2018-04-15 | 更新於 2018-05-07 | 上一篇主要介紹了相關理論,這一

Spring基礎快速入門spring cloud2服務發現之eureka

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Spring Cloud基礎教程路由使用Zuul

一、概述Zuul的主要功能是路由轉發和過濾器。路由功能是微服務的一部分,比如/client-a/轉發到到a服務,/client-b/轉發到到b服務。zuul預設和Ribbon結合實現了負載均衡的功能。二、準備將服務註冊與發現這篇部落格中的Eureka-Client-A工程,複

Spring Cloud服務註冊中心Eureka

Spring Cloud 基於 Netflix 的幾個開源專案進行了封裝,提供包括服務註冊與發現(Eureka),智慧路由(Zuul),熔斷器(Hystrix),客戶端負載均衡(Ribbon)等在內的核心元件。 在微服務系統中,服務少則十幾、幾十個,多則上百、幾百個(據悉 Netflix 的雲平臺上運行了50

springcloud(十一)服務Zuul高階篇

Zuul的核心 Filter是Zuul的核心,用來實現對外服務的控制。Filter的生命週期有4個,分別是“PRE”、“ROUTING”、“POST”、“ERROR”,整個生命週期可以用下圖來表示。 Zuul大部分功能都是通過過濾器來實現的,這些過濾器型別對應於請求的典型生命週期。 PRE: 這

springcloud(十)服務zuul初級篇

前面的文章我們介紹了,Eureka用於服務的註冊於發現,Feign支援服務的呼叫以及均衡負載,Hystrix處理服務的熔斷防止故障擴散,Spring Cloud Config服務叢集配置中心,似乎一個微服務框架已經完成了。 我們還是少考慮了一個問題,外部的應用如何來訪問內部

Java B2B2C o2o多使用者商城 springcloud架構(十)服務zuul初級篇

為什麼需要API Gateway 1、簡化客戶端呼叫複雜度 在微服務架構模式下後端服務的例項數一般是動態的,對於客戶端而言很難發現動態改變的服務例項的訪問地址資訊。因此在基於微服務的專案中為了簡化前端的呼叫邏輯,通常會引入API Gateway作為輕量級閘道器,同時API Gateway中也

跟我學SpringCloud | 第九篇服務Zuul

SpringCloud系列教程 | 第九篇:服務閘道器Zuul初探 前面的文章我們介紹了,Eureka用於服務的註冊於發現,Feign支援服務的呼叫以及均衡負載,Hystrix處理服務的熔斷防止故障擴散,Spring Cloud Config服務叢集配置中心,似乎一個微服務框架已經完成了。 我們還是少考慮了一

跟我學SpringCloud | 第十篇服務Zuul高階篇

SpringCloud系列教程 | 第十篇:服務閘道器Zuul高階篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 上一篇我們主要聊到了Zuul的使用方式,以及自動轉發機制,其實Zuul還有更多的使

跟我學SpringCloud | 第十七篇服務Zuul基於Apollo動態路由

目錄 SpringCloud系列教程 | 第十七篇:服務閘道器Zuul基於Apollo動態路由 Apollo概述 Apollo相比於Spring Cloud Config優勢 工程實戰 示例程