Spring Cloud Zuul 閘道器(一)

JiangYue發表於2019-03-01

利用之前提到的微服務元件,已經可以建立起一個簡單的微服務系統:

  • 通過 Spring Cloud Eureka 實現高可用服務註冊中心
  • 通過 Spring Cloud Ribbon 或 Feign 實現服務間負載均衡的介面呼叫
  • 通過 Spring Cloud Hystrix 實現執行緒隔離和熔斷,防止故障擴散

但是由於在微服務架構中,後端服務往往不直接開放給外部程式呼叫,所以需要一個 API 閘道器,根據請求的 Url 路由到相應的服務。API 閘道器負責外部應用到微服務系統之間的請求路由、負載均衡和校驗過濾等功能的實現。

在 Spring Cloud 體系中,Spring Cloud Zuul 元件提供 API 閘道器的支援。

Spring Cloud Zuul 將自身註冊為 Eureka 服務治理下的應用,從 Eureka 中獲取服務例項資訊,從而維護路由規則和服務例項。

同時, Zuul 提供了一套過濾器機制,通過建立過濾器對校驗過濾提供支援,可以使微服務應用更專注於業務邏輯的開發。

閘道器實踐

在實現閘道器服務的功能之前,需要搭建幾個用於路由和過濾使用的微服務應用,之後就可以著手閘道器的構建。

1.新增相關依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
複製程式碼

2.通過註解啟用閘道器功能

package com.ulyssesss.apigateway;

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

@EnableZuulProxy
@SpringBootApplication
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }
}
複製程式碼

3.配置路由規則

Zuul 可以按傳統路由方式進行配置,zuul.routes.<route>.path 配置匹配規則,zuul.routes.<route>.url 配置服務地址,其中 <route> 為路由名稱,可以任意指定。

按下方配置啟動應用,訪問 http://localhost:5555/hello-service/hello 會轉發到 http://localhost:8081/hello 。

## 服務名稱、埠號、服務註冊中心地址
spring.application.name=api-gateway
server.port=5555
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

## 傳統路由單例項配置
zuul.routes.hello-service.path=/hello-service/**
zuul.routes.hello-service.url=http://localhost:8081/
複製程式碼

按傳統路由方式進行多服務例項配置時,需關閉負載均衡和 Eureka 的結合,通過配置 Ribbon 的服務列表進行負載均衡。

## 傳統路由多例項配置
zuul.routes.hello-service.path=/hello-service/**
zuul.routes.hello-service.service-id=hello-service
ribbon.eureka.enabled=false
hello-service.ribbon.listOfServers=http://localhost:8081/,http://localhost:8082/
複製程式碼

傳統配置方式需要花費大量時間維護 path 和 url 的關係,在與 Eureka 結合後,可以通過服務發現機制自動維護對映關係。

## 面向服務的路由
zuul.routes.hello-service.path=/hello-service/**
zuul.routes.hello-service.service-id=hello-service

## 面向服務路由的簡介配置
## zuul.routes.<serviceId>=<path>
zuul.routes.feign-consumer=/feign-consumer/**
複製程式碼

由於大部分的路由配置規則都會採用服務名作為外部請求的字首,所以 Spring Cloud Zuul 為 Eureka 中的每一個服務都自動建立一個預設的路由規則,如同上面的面上服務的路由。要排除指定服務的預設規則,需要新增如下配置。

## 排除指定服務的預設規則
zuul.ignored-services=hello-service,feign-consumer

## 關閉所有服務的預設規則
#zuul.ignored-services=*
複製程式碼

以上全部配置如下:

spring.application.name=api-gateway
server.port=5555
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

## 傳統路由單例項配置
#zuul.routes.hello-service.path=/hello-service/**
#zuul.routes.hello-service.url=http://localhost:8081/

## 傳統路由多例項配置
#zuul.routes.hello-service.path=/hello-service/**
#zuul.routes.hello-service.service-id=hello-service
#ribbon.eureka.enabled=false
#hello-service.ribbon.listOfServers=http://localhost:8081/,http://localhost:8082/

## 面向服務的路由
## zuul.routes.<route>.path 指定請求路徑
## zuul.routes.<route>.serviceId 指定服務名稱
## <route> 為路由名稱,可任意指定
#zuul.routes.hello-service.path=/hello-service/**
#zuul.routes.hello-service.service-id=hello-service

## 面向服務路由的簡潔配置
## zuul.routes.<serviceId>=<path>
#zuul.routes.feign-consumer=/feign-consumer/**

## 外部請求字首作為服務名為 zuul 預設規則,上方面向服務路由其實都可以省略

## 排除指定服務的預設規則
#zuul.ignored-services=hello-service,feign-consumer

## 關閉預設規則
#zuul.ignored-services=*
複製程式碼

原文地址

示例程式碼 歡迎 Star

相關文章