在SpringCloud2023中快速整合SpringCloudGateway閘道器

落叶微风發表於2024-05-09

你好,這裡是codetrend專欄“SpringCloud2023實戰”。

本文主要簡單介紹SpringCloud2023實戰中SpringCoudGateway的搭建。

後續的文章將會介紹在微服務中使用熔斷Sentinel、鑑權OAuth2、SSO等技術。

前言

閘道器的選型不多,目前spring支援和維護的專案是 Spring Cloud Gateway。

Spring Cloud Gateway作為一個輕量級、高效能、可定製的閘道器服務,具有與Spring生態系統的緊密整合、負載均衡、斷路器等豐富的功能,適用於構建微服務架構中的閘道器層,提供統一的訪問控制、路由轉發和過濾處理等功能。

Gateway 具有以下優點:

  • 高度可定製性:Spring Cloud Gateway採用了一種基於過濾器鏈的方式來處理請求,可以根據實際需求自定義過濾器,實現對請求的各個環節進行精細化控制和處理。這種可定製性使得開發人員可以根據具體業務場景快速構建符合需求的閘道器。
  • 整合簡單:Spring Cloud Gateway與Spring生態系統緊密整合,特別是與Spring Boot結合使用時,可以充分利用Spring Boot的自動配置和約定大於配置的特性,簡化了閘道器的配置和部署過程。同時,它也與其他Spring Cloud元件(如Eureka、Ribbon、Hystrix等)無縫整合,提供了完善的微服務治理能力。
  • 輕量高效能:Spring Cloud Gateway基於Reactor和WebFlux框架,採用非阻塞的非同步程式設計模型,相比傳統的Servlet容器,具有更好的效能和吞吐量。它還支援響應式程式設計風格,能夠處理大量併發請求,並透過非同步IO模型提供更低的延遲。
  • 內建負載均衡:Spring Cloud Gateway內建了負載均衡功能,可以根據服務例項的健康狀態和負載情況自動進行請求的負載均衡。透過與服務註冊中心整合,可以動態地發現和管理服務例項,實現智慧路由和負載均衡。
  • 支援斷路器:Spring Cloud Gateway整合了Hystrix,可以透過配置斷路器模式來保護後端服務免受故障的影響。當後端服務出現故障或超時時,可以快速失敗並返回預定義的錯誤響應,提高系統的穩定性和容錯能力。
  • 動態路由:Spring Cloud Gateway支援動態路由配置,可以根據需要動態新增、刪除或修改路由規則,而無需重啟閘道器服務。這種動態路由的特性使得系統更具靈活性和可擴充套件性,能夠快速適應業務需求的變化。

前置條件

  • 閘道器和服務提供者都需要整合註冊中心,方便使用負載均衡。
  • 使用JDK17+,這也是SpringBoot3的最低要求。

Gateway如何工作的

這張圖大概說明了閘道器如何工作的。

客戶端向 Spring Cloud Gateway 傳送請求。如果閘道器處理器對映確定請求匹配某個路由,則將其傳送到閘道器 Web 處理器。該處理器將請求透過特定於請求的過濾器鏈。

過濾器被分為前後兩部分,原因是過濾器可以在代理請求傳送之前和之後執行邏輯。

所有前置過濾器邏輯都會被執行。然後發出代理請求。代理請求發出後,將執行後置過濾器邏輯。

Gateway整合

引入pom.xml

  • 引入Gateway主要是引入 spring-cloud-starter-gateway
  • 同時需要整合註冊中心,以實現服務呼叫的負載均衡。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>io.rainforest</groupId>
        <artifactId>banana</artifactId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>banana-gateway</artifactId>
    <description>spring cloud gateway</description>
    <packaging>jar</packaging>


    <dependencies>
        <!--gateway 閘道器依賴,內建webflux 依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>
        <!--註冊中心客戶端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>
        <!-- LB 擴充套件 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!-- 工具包依賴 -->
        <dependency>
            <groupId>io.rainforest</groupId>
            <artifactId>banana-common-core</artifactId>
        </dependency>
        <!--介面文件-->
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
        </dependency>
    </dependencies>

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

</project>

修改配置

  • 新增配置檔案 application.yml,閘道器配置主要是 spring.cloud.gateway 下面的配置。
spring.application.name: gateway
spring:
  cloud:
    zookeeper:
      connect-string: localhost:2181
    gateway:
      discovery:
        locator:
          enabled: false
          lowerCaseServiceId: true
      routes:
        - id: client1
          uri: lb://client1
          predicates:
            - Path=/client1/**
#          filters:
#            - StripPrefix=0
        - id: client2
          uri: lb://client2
          predicates:
            - Path=/client2/**
          filters:
            - StripPrefix=0
        - id: client3
          uri: lb://client3
          predicates:
            - Path=/client3/**
          filters:
            - StripPrefix=0
server:
  port: 10100
  servlet:
    context-path: /gateway

  • spring.cloud.gateway.routes 配置不同的服務路由。

修改啟動類

  • 啟動類不需要特殊修改。
package io.rainforest.banana.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

呼叫demo

不需要修改程式碼就可以開箱即用Gateway。此處僅展示如何呼叫。

實際情況中閘道器還需要使用它強大的Filter來實現各種功能。

在這裡Gateway就相當於一個更加強大的Nginx。只做了路由分發。

  • 透過 localhost:10100/client3/** 可以訪問註冊中心服務編碼為client3的所有介面。

完整原始碼資訊檢視可以在gitee或者github上搜尋r0ad

關於作者

來自一線全棧程式設計師nine的探索與實踐,持續迭代中。

歡迎關注或者點個小紅心~

相關文章