在Spring Boot中實現API閘道器與路由

省赚客开发者团队發表於2024-07-22

在Spring Boot中實現API閘道器與路由

大家好,我是微賺淘客系統3.0的小編,是個冬天不穿秋褲,天冷也要風度的程式猿!今天我們將探討如何在Spring Boot中實現API閘道器與路由。API閘道器是一種用於管理和路由請求的中間層,它可以集中處理認證、路由、負載均衡、快取等功能。Spring Cloud Gateway是Spring提供的一個功能強大的API閘道器解決方案。

一、Spring Cloud Gateway簡介

Spring Cloud Gateway是一個非阻塞的API閘道器,它基於Spring WebFlux構建,支援動態路由、負載均衡、斷路器等功能。它的核心功能包括:

  • 路由:將請求路由到目標服務。
  • 過濾器:在請求和響應過程中進行處理。
  • 負載均衡:將請求均勻分配到多個例項。
  • 斷路器:保護系統免受故障蔓延。

二、整合Spring Cloud Gateway

  1. 新增依賴

    首先,在pom.xml中新增Spring Cloud Gateway的依賴:

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    

    確保在pom.xml中新增了Spring Cloud的版本管理:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2023.0.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
  2. 配置閘道器

    在Spring Boot應用的配置檔案application.yml中定義路由規則。以下是一個簡單的配置示例:

    spring:
      cloud:
        gateway:
          routes:
            - id: service1
              uri: http://localhost:8081
              predicates:
                - Path=/service1/**
              filters:
                - StripPrefix=1
            - id: service2
              uri: http://localhost:8082
              predicates:
                - Path=/service2/**
              filters:
                - StripPrefix=1
    

    在這個配置中,我們定義了兩個路由:

    • service1:將請求轉發到http://localhost:8081,路徑字首/service1將被移除。
    • service2:將請求轉發到http://localhost:8082,路徑字首/service2將被移除。
  3. 主應用類

    在主應用類上新增@EnableGateway註解(通常,spring-boot-starter-gateway自動啟用,無需額外註解):

    package cn.juwatech.gatewaydemo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class GatewayDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(GatewayDemoApplication.class, args);
        }
    }
    

三、建立示例服務

為了測試API閘道器的路由功能,我們需要建立兩個簡單的服務應用。

  1. Service1

    package cn.juwatech.service1;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    public class Service1Application {
        public static void main(String[] args) {
            SpringApplication.run(Service1Application.class, args);
        }
    }
    
    @RestController
    class Service1Controller {
        @GetMapping("/greet")
        public String greet() {
            return "Hello from Service1!";
        }
    }
    
  2. Service2

    package cn.juwatech.service2;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    public class Service2Application {
        public static void main(String[] args) {
            SpringApplication.run(Service2Application.class, args);
        }
    }
    
    @RestController
    class Service2Controller {
        @GetMapping("/greet")
        public String greet() {
            return "Hello from Service2!";
        }
    }
    

四、定義自定義過濾器

Spring Cloud Gateway允許我們定義自定義過濾器,用於在請求和響應過程中插入自定義邏輯。以下是一個自定義過濾器的示例:

  1. 建立過濾器

    package cn.juwatech.gatewaydemo.filters;
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import org.springframework.cloud.gateway.filter.GatewayFilter;
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.web.server.WebFilter;
    import reactor.core.publisher.Mono;
    
    @Component
    public class CustomFilter implements GatewayFilter {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            System.out.println("Custom filter: Request Path - " + exchange.getRequest().getPath());
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                System.out.println("Custom filter: Response Status - " + exchange.getResponse().getStatusCode());
            }));
        }
    }
    

    註冊自定義過濾器:

    package cn.juwatech.gatewaydemo;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.cloud.gateway.filter.GatewayFilter;
    import cn.juwatech.gatewaydemo.filters.CustomFilter;
    
    @Configuration
    public class GatewayConfig {
        @Bean
        public GatewayFilter customFilter() {
            return new CustomFilter();
        }
    }
    

五、負載均衡

Spring Cloud Gateway可以與Spring Cloud LoadBalancer結合使用,以實現客戶端負載均衡。新增Spring Cloud LoadBalancer的依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

在閘道器配置中,使用服務名進行路由:

spring:
  cloud:
    gateway:
      routes:
        - id: loadBalancedService
          uri: lb://SERVICE-NAME
          predicates:
            - Path=/service/**
          filters:
            - StripPrefix=1

在這裡,lb://SERVICE-NAME表示負載均衡的服務名。

六、實現斷路器

Spring Cloud Gateway支援斷路器功能,透過Resilience4jHystrix庫實現。在pom.xml中新增Resilience4j的依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>

在配置檔案中啟用斷路器:

spring:
  cloud:
    gateway:
      routes:
        - id: serviceWithCircuitBreaker
          uri: http://localhost:8081
          predicates:
            - Path=/service/**
          filters:
            - CircuitBreaker=cb
            - StripPrefix=1
  resilience4j:
    circuitbreaker:
      instances:
        cb:
          registerHealthIndicator: true
          failureRateThreshold: 50
          waitDurationInOpenState: 10000
          slidingWindowSize: 100

七、總結

在Spring Boot中實現API閘道器與路由,可以有效地集中管理服務的請求路由、過濾、負載均衡及斷路器等功能。Spring Cloud Gateway提供了靈活的路由配置、豐富的過濾器機制,並且與Spring Cloud LoadBalancer、Resilience4j等技術無縫整合,幫助構建健壯的微服務架構。

本文著作權歸聚娃科技微賺淘客系統開發者團隊,轉載請註明出處!

相關文章