利用Spring Boot實現微服務的API閘道器統一限流與熔斷

省赚客开发者团队發表於2024-08-24

利用Spring Boot實現微服務的API閘道器統一限流與熔斷

大家好,我是微賺淘客返利系統3.0的小編,是個冬天不穿秋褲,天冷也要風度的程式猿!

微服務中的限流與熔斷

在微服務架構中,服務的穩定性和可靠性至關重要。限流用於控制服務的訪問頻率,防止過載;熔斷則在服務出現異常時介入,防止故障蔓延。

Spring Cloud Gateway與限流熔斷

Spring Cloud Gateway是一個基於Spring Boot 2.x和Spring WebFlux的API閘道器,它整合了限流和熔斷的功能,可以統一管理微服務的流量。

1. 新增Spring Cloud Gateway依賴

在專案的pom.xml檔案中新增Spring Cloud Gateway的依賴:

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

2. 配置路由規則

application.yml中配置路由規則,並啟用限流:

spring:
  cloud:
    gateway:
      routes:
      - id: user_service
        uri: lb://USER-SERVICE
        predicates:
        - Path=/users/**
        filters:
        - name: RequestRateLimiter
          args:
            key-resolver: "#{@userKeyResolver}"
            rate-limiter: "#{@userRateLimiter}"

3. 實現Key Resolver

建立一個KeyResolver來定義限流的key:

package cn.juwatech.gateway;

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class UserKeyResolver implements KeyResolver {

    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        // 可以根據IP地址或Header等資訊來定義key
        return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().toString());
    }
}

4. 配置Rate Limiter

使用RedisRateLimiter作為限流器:

package cn.juwatech.gateway;

import org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;

@Configuration
public class RateLimiterConfig {

    @Bean
    public RedisRateLimiter userRateLimiter(RedisConnectionFactory connectionFactory) {
        return new RedisRateLimiter(connectionFactory, redisRateLimiterConfig());
    }

    @Bean
    public RedisRateLimiter.Config redisRateLimiterConfig() {
        return new RedisRateLimiter.Config(10, 5); // 每5秒最多10個請求
    }
}

整合Hystrix實現熔斷

Hystrix是一個熔斷器庫,可以與Spring Cloud Gateway整合,為微服務提供熔斷保護。

1. 新增Hystrix依賴

pom.xml中新增Hystrix的依賴:

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

2. 配置Hystrix

application.yml中配置Hystrix:

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 10000

3. 使用Hystrix註解

在服務呼叫的方法上使用@HystrixCommand註解:

package cn.juwatech.service;

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;

public class UserService extends HystrixCommand<String> {

    private final String userId;

    public UserService(String userId) {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("UserService")));
        this.userId = userId;
    }

    @Override
    protected String run() throws Exception {
        // 呼叫使用者服務
        return "User " + userId;
    }

    @Override
    protected String getFallback() {
        // 熔斷時的備選方案
        return "User " + userId + " is not available";
    }
}

結合Spring Cloud Gateway使用

將Hystrix與Spring Cloud Gateway結合使用,實現API閘道器的統一熔斷。

1. 配置Gateway整合Hystrix

在路由配置中使用Hystrix:

package cn.juwatech.gateway;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("user_service_route", r -> r.path("/users/**")
                        .uri("lb://USER-SERVICE")
                        .filters(f -> f.hystrix().setName("UserService")
                                .setFallbackUri("forward:/fallback"))
                        .hystrix().configuration(c -> c.setRequestVolumeThreshold(10)))
                .build();
    }
}

2. 實現熔斷回退方法

在Controller中實現熔斷回退方法:

package cn.juwatech.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.reactive.result.view.Rendering;

@Controller
public class FallbackController {

    @GetMapping("/fallback")
    public Rendering fallback() {
        return Rendering.view("fallback").modelName("Service is temporarily unavailable");
    }
}

結論

透過Spring Cloud Gateway和Hystrix,我們可以為微服務架構中的API閘道器實現統一的限流和熔斷機制。這有助於提高系統的穩定性和可靠性,防止因服務過載或故障導致的系統崩潰。

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

相關文章