Spring Cloud 2.x Version Gateway Fusing and Current Limiting Tutorial

Spring Cloud

предисловие

В этой статье используется облако Spring. Это статья 2.1.8RELEASE, version=Greenwich.SR3.

Эта статья основана на реализации двух предыдущих статей: eureka-server, eureka-client, eureka-ribbon, eureka-feign и spring-gataway. Ссылаться на

обобщение

В приложениях с высокой степенью параллелизма кэширование, ограничение тока и переход на более раннюю версию являются тремя основными инструментами защиты системных приложений. При разработке некоторых API-интерфейсов управление ограничением потока обычно выполняется на уровне шлюза, с одной стороны, чтобы предотвратить перегрузку сервера большим количеством запросов, что делает сервер недоступным, а с другой стороны, это также для предотвращения плохих сетевых атак других людей.

Распространенные методы ограничения тока, такие как использование Hystrix изоляции пула потоков, превышают нагрузку пула потоков и используют логику предохранителя; также существуют скользящие временные окна для управления трафиком.

Обычно используемые алгоритмы ограничения тока включают алгоритм счетчика, алгоритм дырявого ведра и алгоритм ведра маркера. Связанные алгоритмы здесь не описываются.

предохранитель

Предохранитель Spring Cloud Gateway может быть реализован на базе Hystrix. может относиться кРуководство по автоматическому выключателю Hystrix Dashboard версии Spring Cloud 2.x.

1.1 Добавить зависимости, связанные с pom

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

1.2 Изменить application.yml

server:
  port: 8100
spring:
  redis:
    host: localhost
    port: 6379
  application:
    name: spring-gateway
  cloud:
      gateway:
        discovery:
          locator:
            enabled: true # 开启通过服务中心的自动根据 serviceId 创建路由的功能
        default-filters:
          - My=true
        routes:
          - id: ribbon-route
            uri: lb://EUREKA-RIBBON
            order: 0
            predicates:
              - Path=/ribbon/**
            filters:
              - name: Hystrix
                args:
                  name: fallback
                  fallbackUri: forward:/fallback
              - StripPrefix=1 #去掉前缀,具体实现参考StripPrefixGatewayFilterFactory
              - AddResponseHeader=X-Response-Default-Foo, Default-Bar
          - id: feign-route
            uri: lb://EUREKA-FEIGN
            order: 0
            predicates:
              - Path=/feign/**
            filters:
              - StripPrefix=1
              - AddResponseHeader=X-Response-Default-Foo, Default-Bar

eureka:
  instance:
    hostname: eureka1.server.com
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 10
  client:
    service-url:
      defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

Установите только маршрут ленты для плавления, а настройка имитации такая же, как у ленты.

  • Hystrix поддерживает два параметра:
  • name: имя HystrixCommand
  • fallbackUri: uri, соответствующий резервному варианту, uri здесь поддерживает только forward:schemed

1.3 Создание FallBackController

package spring.cloud.demo.spring.gateway.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FallBackController {

    @GetMapping("/fallback")
    public String fallback() {
        return "Error:fallback";
    }
    
}

1.4 Начать связанные услуги

Запустите службы, связанные с eureka-server, eureka-client, eureka-ribbon, spring-gateway, посетите адрес http://localhost:8100/ribbon/sayHello, на странице отобразятся следующие результаты:

Затем мы останавливаем службу eureka-ribbon, обновляем страницу и возвращаем результат следующим образом:

На данный момент: простая настройка и реализация предохранителя завершена.Если вам нужно настроить стратегию предохранителя, вы можете обратиться к содержимому HystrixGatewayFilter.

Ограничение

Spring Cloud Gateway официально предоставляет класс RequestRateLimiterGatewayFilterFactory, который использует сценарии redis и lua для реализации метода ведра маркеров. Мы также можем реализовать на основе RateLimiter, Bucket4j, RateLimitJ в Google Guava. В этой статье будет использован официальный способ достижения.

1.1 Добавить зависимости, связанные с pom

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

1.2 Изменить приложение конфигурации .yml

server:
  port: 8100
spring:
  redis:
    host: localhost
    port: 6379
  application:
    name: spring-gateway
  cloud:
      gateway:
        discovery:
          locator:
            enabled: true # 开启通过服务中心的自动根据 serviceId 创建路由的功能
        default-filters:
          - My=true
        routes:
          - id: ribbon-route
            uri: lb://EUREKA-RIBBON
            order: 0
            predicates:
              - Path=/ribbon/**
            filters:
              - name: RequestRateLimiter
                args:
                  key-resolver: '#{@ipKeyResolver}'
                  redis-rate-limiter.replenishRate: 200
                  redis-rate-limiter.burstCapacity: 400
              - name: Hystrix
                args:
                  name: fallback
                  fallbackUri: forward:/fallback
              - StripPrefix=1 #去掉前缀,具体实现参考StripPrefixGatewayFilterFactory
              - AddResponseHeader=X-Response-Default-Foo, Default-Bar
          - id: feign-route
            uri: lb://EUREKA-FEIGN
            order: 0
            predicates:
              - Path=/feign/**
            filters:
              - StripPrefix=1
              - AddResponseHeader=X-Response-Default-Foo, Default-Bar

eureka:
  instance:
    hostname: eureka1.server.com
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 10
  client:
    service-url:
      defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

инструкция:

  • 1 Добавить конфигурацию, связанную с Redis
  • 2.1 -name: RequestRateLimiter, имя фильтра, должно быть RequestRateLimiter
  • 2.2 redis-rate-limiter.replenishRate: количество запросов, которые пользователи могут обрабатывать в секунду.
  • 2.3 redis-rate-limiter.burstCapacity: емкость корзины токенов, максимальное количество запросов, разрешенных для выполнения за одну секунду.
  • 2.4 key-resolver: используемое имя компонента, правило состоит в том, чтобы обращаться к компоненту по имени.

1.3 Добавить ток ограничивающих бобов

package spring.cloud.demo.spring.gateway.config;

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;

@Configuration
public class BeanConfig {

    @Bean
    public KeyResolver ipKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
    }
}

То, что установлено здесь, является текущим ограничением ip.

1.4 Запуск связанных служб

Сначала запустите службу Redis, затем последовательно запустите службы, связанные с eureka-server, eureka-client, eureka-ribbon, spring-gateway, и посетите http://localhost:8100/ribbon/sayHello. Для удобства демонстрации вы можете установить параметры redis-rate-limiter.replenishRate и redis-rate-limiter.burstCapacity на 1 и 3, а затем лихорадочно обновить страницу, чтобы увидеть отказ запроса (лучше всего использовать инструмент стресс-теста показывать). В то же время нам также нужно открыть мониторинг redis (команда монитора), вы можете увидеть мониторинг redis, как показано ниже:

Описание: в Redis будет 2 ключа: request_rate_limiter.{xxx}.timestamp и request_rate_limiter.{xxx}.tokens.

Суммировать

В этой статье просто реализуется плавкий предохранитель и ограничение тока шлюза. В целом шлюзы маршрутизации, фильтры, объединение и ограничение тока, предоставляемые Spring Cloud Gateway, относительно просты и гибки и могут быть настроены в соответствии с вашими потребностями.

кодовый адрес

адрес github


Каталог «Spring Cloud 2.X Xiaobai Tutorial»
  • Писать не просто, пожалуйста, указывайте источник при перепечатке.Если вам это нравится, вы можете подписаться на официальный аккаунт, чтобы увидеть больше понравившихся вам статей.Каждый раз, когда вы проверяете, это самая большая поддержка для меня, а ваши лайки - самое большое поощрение меня.
  • Контакт: 4272231@163.com
  • QQ:95472323
  • wx:ffj2000