1. 程式人生 > >Spring Cloud【Finchley】-14 微服務閘道器Zuul的搭建與使用

Spring Cloud【Finchley】-14 微服務閘道器Zuul的搭建與使用

文章目錄

官方文件

https://cloud.spring.io/spring-cloud-static/Finchley.SR2/single/spring-cloud.html#_router_and_filter_zuul


Zuul概述

在這裡插入圖片描述

Zuul的主要功能是路由轉發和過濾器

路由功能是微服務的一部分,比如/api/user轉發到到user服務,/api/shop轉發到到shop服務。zuul預設和Ribbon結合實現了負載均衡的功能。


引入閘道器前後呼叫流程的變化

在微服務架構中,後端服務往往不直接開放給呼叫端,而是通過一個API閘道器根據請求的url,路由到相應的服務。閘道器直接與呼叫方通訊進行許可權控制,後將請求均衡分發給後臺服務端

簡單畫2個圖,來說明下引入閘道器後,呼叫流程的變化。

不使用閘道器的情況:
在這裡插入圖片描述

引入閘道器後:
在這裡插入圖片描述


搭建單節點的Zuul

這裡我們會把zuul註冊到Eureka上

在這裡插入圖片描述

Step1. 建立子Module microservice-gateway-zuul

在這裡插入圖片描述


Step2. 新增maven依賴

		<!-- eureka client 依賴  . Eureka不是必須的 ,在沒有註冊中心的情況下,也可以使用zuul-->
		<dependency>
			<groupId>org.springframework.cloud<
/groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- zuul 依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>

官方Note: the Zuul starter does not include a discovery client, so, for routes based on service IDs, you need to provide one of those on the classpath as well (Eureka is one choice). 因為我們使用serverID去做路由,所以我們這裡引入了Eureka


Step3. 啟動類添加註解 @EnableZuulProxy

package com.artisan.microservice;

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

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

}

通過註解@EnableZuulProxy宣告一個zuul代理,這個代理整合了Ribbon來定位註冊在Eureka上的微服務,同時還整合了hystrix實現容錯,所有經過zuul的請求都會在Hystrix命令中執行。


Step4. 配置檔案application.yml

server:
  port: 4534
  
spring:
  application:
    name: microservice-gateway-zuul

eureka:
  client:
    service-url:
      defaultZone: http://artisan:[email protected]:8761/eureka
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}

觀察上面的配置檔案,是沒有zuul相關的配置的,我們僅僅添加了一個zuul的依賴,同時將zuul註冊到Eureka上。 至此,一個單節點的最精簡版的zuul就搭建完成了,當然了zuul支援各種配置,我們的這個demo只是沒有用到而已。


Step6. 閘道器功能-路由規則測試

  1. 啟動註冊中心Eureka Server 專案 microservice-discovery-eureka
  2. 啟動服務提供者micorservice-provider-user
  3. 啟動服務消費者 micorservice-consumer-movie-ribbon
  4. 啟動zuul閘道器microservice-gateway-zuul

啟動zuul的時候,可以看到如下日誌

Mapped URL path [/microservice-provider-user/**] onto handler of type [class org.springframework.cloud.netflix.zuul.web.ZuulController]
Mapped URL path [/micorservice-consumer-movie-ribbon/**] onto handler of type [class org.springframework.cloud.netflix.zuul.web.ZuulController]

訪問 Eureka Server頁面 http://localhost:8761/ ,檢視服務註冊情況

在這裡插入圖片描述

驗證下路由轉發的功能

通過配置檔案,我們知道zuul服務的啟動埠為 4534 ,

通過zuul訪問服務提供者提供的服務看下
http://localhost:4534/microservice-provider-user/user/3

在這裡插入圖片描述
url中的microservice-provider-user為註冊在eureka上的微服務的名稱

服務被轉發到了microservice-provider-user微服務中 ,相當於請求 http://localhost:8900/user/3
在這裡插入圖片描述

同理,通過zuul訪問服務消費者
http://localhost:4534/micorservice-consumer-movie-ribbon/movie/4
在這裡插入圖片描述

服務被轉發到了micorservice-consumer-movie-ribbon微服務中 ,相當於請求 http://localhost:7902/movie/4
在這裡插入圖片描述

預設情況下,zuul會代理所有註冊在Eureka Server上的微服務,並且Zuul的路由規則為 http://zuul_host:zuul_port/微服務在EurekaServer上的serviceId/** 被轉發到serviceId對應的微服務上。


Step7. 閘道器功能-負載均衡測試

  1. 啟動註冊中心Eureka Server 專案 microservice-discovery-eureka
  2. 啟動多個服務提供者micorservice-provider-user ,在sts中換個埠,可啟動多個,再加個8901埠上的服務
  3. 啟動服務消費者 micorservice-consumer-movie-ribbon
  4. 啟動zuul閘道器microservice-gateway-zuul

訪問 Eureka Server頁面 http://localhost:8761/ ,檢視服務註冊情況

在這裡插入圖片描述

訪問兩次服務提供者提供的服務,觀察後臺日誌
http://localhost:4534/microservice-provider-user/user/3 ,

8900:
在這裡插入圖片描述

8901:
在這裡插入圖片描述

說明zuul整合了Ribbon負載均衡的功能


Step8. 閘道器功能-Hystrix監控測試

根據前幾篇的學習 Spring Cloud【Finchley】-10Hystrix監控 我們知道要想實現Hystrix監控中,必須要有如下幾個依賴

在這裡插入圖片描述

檢視zuul微服務的pom依賴
在這裡插入圖片描述

前兩個具備了,只需要修改下applicaiton.yml即可。
在這裡插入圖片描述
增加配置,開啟端點監控

#actuator  啟用所有的監控端點 “*”號代表啟用所有的監控端點,可以單獨啟用,例如,health,info,metrics
#  spring boot 升為 2.0 後,為了安全,預設 Actuator 只暴露了2個端點,heath 和 info
management:
  endpoints:
    web:
      exposure:
        include: "*" 
  endpoint:
      health:
        show-details: ALWAYS

重啟下microservice-gateway-zuul微服務

訪問zuul的hystrix.stream http://localhost:4534/actuator/hystrix.stream
在這裡插入圖片描述

說明application.yml中的配置生效了。 ping 說明還未有服務呼叫,接下來呼叫下服務 ,就可以看到了
在這裡插入圖片描述

接下來我們用Dashboard來直觀的看下

訪問micorservice-hystrix-dashboard提供的頁面 http://localhost:8888/hystrix
在這裡插入圖片描述

地址輸入zuul服務的 hystrix stream地址 http://localhost:4534/actuator/hystrix.stream , title 任意,點選Monitor Stream

多訪問幾次 http://localhost:4534/microservice-provider-user/user/3 ,觀察資料的變化 ,如下
在這裡插入圖片描述

通過以上示例,說明zuul已經整合了Hystrix監控。 容錯後面來單獨討論


程式碼

https://github.com/yangshangwei/SpringCloudMaster/tree/master/microservice-gateway-zuul