SpringCloud Zuul 網關搭建及配置

 

目錄

一.Zuul網關

二.Zuul服務的前期準備

2.1 註冊中心EurekaServer的搭建

2.2 EurekaService的搭建

三.Zuul服務搭建

五.Zuul的訪問

六.Zuul的更多功能


前言:博主一直力求做到寫博客儘量的詳細來減少大家花在踩坑上的時間,若有寫的不好或錯誤的地方,還需各方大佬指正。

一.Zuul網關

    網關,是一種網絡關口,既然是關口,就需要知道哪些東西能通過哪些東西不能通過。

    在微服務中,Zuul是SpringCloud衆多組件中的一個,用於微服務的網關。在微服務中,各自服務之間的調用不可能都在各自服務中來實現安全與認證功能,因此需要一個專門的微服務來提供這些功能。當請求從客服端發到服務器,如果經過網關的一系列驗證和過濾符合訪問要求,那麼在之後訪問其他微服務或由網關路由轉發之後的訪問時,不需要再做同樣的安全認證。這是網關的主要功能。

    實際上,Zuul給我們提供的網關服務種類是很多的。後面會介紹他的一些功能。如果你已經搭建了註冊中心那麼可以直接看第三節:Zuul服務搭建

二.Zuul服務的前期準備

2.1 註冊中心EurekaServer的搭建

爲了搭建好網關後,能通過網關來訪問各模塊微服務來證明網關的搭建成功,因此這裏需要提前搭建一些可用的微服務。第一步我們先新建一個Project

選擇Springboot作爲啓動器,微服務的標配。當然你用Maven的骨架來搭建也完全可以,構建項目並沒有非要用哪一種方式搭建。重要的是後面你知道pom裏應該引入那些依賴,application.yml怎麼配置。這些纔是搭建微服務需要主要的地方。這裏我使用Spring Initializr

idea給你默認的內容如下:

Group和Artifact我們已經見得太多了,當我們指定這兩個參數時,項目名和包名應該與之適配。不過當然可以不一樣。

比如默認值 Group爲com.example,Artifact爲demo,那麼項目名應該爲demo和Artifact一致,包名Package應該爲com.example.demo,爲Group和Artifact的合體 。當然這裏不強制,只是一種規範,比如別人看見你的包名爲com.example.demo時,立馬可以知道他屬於com.example組下的demo項目。一些使用語言,Java版本,項目類型啥的。

在這裏因爲我是作爲測試springcloud相關組件的目的,那麼我這裏設置如下:

細心的朋友會發現,當我們改完1和2,idea會自動給我們修改3和4選項,既然是規範idea當然希望大家準守。改完1和2,我們點擊Next。這一步相當於選擇這個項目需要的一些組件,比如這個項目你需要用到springmvc?Mybatis?MySQL?那麼在這裏選擇後,idea會去加載這些相關的依賴並在pom裏爲大家自動引入這些依賴。

這裏我們要搭建一些測試的微服務,首先搭建1個Eureka註冊中心。 所有的微服務都需要在這裏註冊。微服務的註冊與發現詳細的搭建過程可以參考上一篇博文:https://blog.csdn.net/qq_29519041/article/details/85238270

如上圖選擇Eureka Server,點Next,如下圖,項目爲zuul,而模組這裏我們先搭建微服務的註冊中心Eureka Server,所以這裏我把模組名命名爲eurekaserver,繼續點Next。改了模組名,idea會默認在項目目錄下建立模組的文件夾,因此可以看見第二個紅框自動變化。繼續點下一步。

因爲我之前有項目所以這裏選擇開啓新的idea窗口。New Window

點擊import change之後等待idea加載依賴

查看項目結構:

此時我習慣把application.properties後綴改爲yml。這樣配置書寫的格式符合yml的風格,比較好看。

現在需要做下面幾件事,由於我們開始構建項目時選擇了Eureka Server,所以pom.xml中不需要手動添加依賴了。

首先在啓動類SpringcloudApplication中添加EurekaServer的註解: @EnableEurekaServer

然後在application.yml中添加相關配置:

server:
  port: 9000  #eureka註冊中心服務端口

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false #不向eureka註冊中心註冊。也就是爲了關閉自己向自己註冊,eureka默認要向自己註冊
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

就可以啓動服務了:

訪問註冊中心:按照配置的端口號訪問。我這裏配了9000,端口隨意,如下圖代表Eureka註冊中心部署成功了。

顯示沒有實例在此中心註冊。沒事接下來我們開始配置zuul網關,它也是一個服務需要註冊到此註冊中心來。

 

2.2 EurekaService的搭建

有了註冊中心,我們現在需要搭建服務的真正提供者,EurekaService,第四節我們建四個。

eurekaservice01,eurekaservice02,eurekaservice03,eurekaservice04,第一個如下,第二三四個按着第一個的建,修改一下名字,端口號還有方法返回值。

需要用到mvc

服務提供者同樣需要註冊到註冊中心。

改名你懂得

 

完成:

接下來是同樣的套路,改yml,啓動類添加註解:@EnableEurekaClient

yml配置如下(因爲是測試所有很簡陋):

server:
  port: 8900 # 服務提供方

# 指定當前eureka客戶端的註冊地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:9000/eureka/
  instance:
    hostname: localhost

#當前服務名稱
spring:
  application:
    name: eurekaservice1

注意當前服務名稱。這裏用於註冊到註冊中心的名字,還可以啓動很多同樣爲eurekaservice1的名字的微服務到註冊中心,zuul從註冊中心Eureka Server獲取所有服務名爲eurekaservice01的服務列表後,會採用負載均衡策略訪問其中一臺服務提供者獲取資源。

下圖我們之前zuul中的配置serviceId就是指向這裏的服務名稱,這是微服務調用的精髓,通過服務名調用。

 

既然是服務提供者 ,這裏要編寫controller類了:新建controller包,新建Test01類,編寫REST的方法。返回服務1

按照服務提供者1的搭建方式,現在搭建服務提供者2:

同樣是新建模組,名字改爲...02,yml配置文件中端口號與服務1要不同,服務名稱相同,爲了測試負載均衡,REST方法返回值設爲服務2。

yml:

server:
  port: 8901 # 服務提供方

# 指定當前eureka客戶端的註冊地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:9000/eureka/
  instance:
    hostname: localhost

#當前服務名稱
spring:
  application:
    name: eurekaservice1

同樣的方法再建兩個服務提供者3和4,服務名稱都爲eurekaservice2,端口號分別爲8902,和8903。REST方法返回值分別爲,服務3和服務4。

 

三.Zuul服務搭建

有了第二節的準備,搭建了註冊中心,和服務的提供者,我們現在開始搭建Zuul網關服務,最後通過zuul訪問註冊中心獲取服務列表,然後訪問服務提供者。

新建模組:

 這裏模組名設爲zuul。包名設置爲zuul,等會生成的啓動類就會是帶有zuul了。EurekaServer也可以這樣只是我開始搭的時候沒有注意到。

需要Eureka的客戶端組件,和zuul組件,點next

 模組名設爲zuul,不強制

 項目結構:

在啓動類配置註解 @EnableEurekaClient,@EnableZuulProxy,@EnableZuulProxy可以稱爲@EnableZuulServer的增強版,當Zuul與Eureka、Ribbon等組件配合使用時,我們使用@EnableZuulProxy。 

配置pom文件:

server:
   port: 9100

spring:
  application:
    name: zuul

eureka:
  client:
    service-url:
        defaultZone: http://localhost:9000/eureka/ #當前zuul網關想要註冊到哪個註冊中心這裏註冊到之前搭的9000上。

#路由規則定義。這裏定義兩種路由規則route1和route2
#,代表訪問網關/test01/**或/test02/**時。
#路由到服務名爲 eurekaservice1或 eureka
#service2中的服務集羣去。
zuul:
  routes:
    route1:
      path: /test01/**
      serviceId: eurekaservice1
    route2:
      path: /test02/**
      serviceId: eurekaservice2

啓動項目:

聰明的你再去註冊中心看就能看見zuul服務已經被註冊到註冊中心了

有了網關,

五.Zuul的訪問

我們有一個網關服務zuul,一個註冊中心eurekaserver,4個服務提供者eurekaservice,4個服務提供者,其中兩個提供

服務名爲eurekaservice1的服務,另外兩個提供eurekaservice2的服務,現在我們來啓動4個服務提供者,在註冊中心查看,並通過網關訪問測試網關的服務是否正常。

總項目結構:

啓動後註冊中心查看:

如之前所想,兩個服務名下各兩臺服務提供者。

現在回想之前zuul的路由配置:

那麼我訪問zuul網關的test01/**下的任何服務都會給我轉發到服務名爲eurekaservice1下的01和02服務下。我們來試試

第一次訪問:test01

第二次訪問:test01

可以看見zuul網關做了轉發和負載均衡,使用的是ribbon輪詢的方式負載均衡。

那麼可以猜想到我們訪問test02,zuul網關會在服務名爲eurekaservice2的服務3和服務4之間去訪問了。我們來看看:

至此我們已經實踐完成zuul網關的基本功能轉發和負載均衡。第三節會在yml中繼續配置一些參數,來實踐zuul的更多功能。

六.Zuul的功能介紹

6.1 傳統路由配置

6.1.1 傳統路由配置

 

6.1.2 單實例配置

 

6.1.3 多實例配置

 

6.2 服務路由配置

6.3 服務路由的默認規則

6.4 自定義路由映射規則

6.5 路徑匹配

6.6 忽略表達式

6.7 路由前綴

 

 

 

 

發佈了108 篇原創文章 · 獲贊 183 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章