Серия Microservice: Начало работы с сервисным шлюзом Spring Cloud Gateway

Микросервисы Spring Cloud
Серия Microservice: Начало работы с сервисным шлюзом Spring Cloud Gateway

После изучения предыдущих предварительных знаний сегодня, наконец, пришло время учитьсяSpring Cloud GatewayПора.

Spring Cloud Gatewayосновывается наSpring 5.0、Spring Boot 2.0 和 Project ReactorШлюзы, разработанные по другим технологиям. Так что есть предварительное знаниеWebFluxобучение, а изучение WebFlux требуетStreamпоток иLambdaВыражения и другие приемы как предзнание.

С этой статьи официально начнетсяСерия микросервисовсвязанное с этим обучение технологиям.

Без лишних слов, давайте начнем сегодняшнее исследование.

представлять

Spring Cloud Gateway

Spring Cloud Gatewayосновывается наSpringпостроенный на вершине экосистемыAPIШлюз, в том числе:Spring 5.x,Spring Boot 2.xа такжеProject Reactor. Он призван предоставить простой и эффективный унифицированный метод управления маршрутизацией API для микросервисной архитектуры. .

Что такое сервисный шлюз

API Gateway(APIGW / API 网关), как следует из названия, является единственным внешним входом в систему.APIШлюз инкапсулирует внутреннюю архитектуру системы и предоставляет настраиваемый API для каждого клиента. В последние годы возрос спрос на взаимосвязь между мобильными приложениями и предприятиями. Из одного веб-приложения в прошлом оно расширилось до нескольких сценариев использования, и каждый сценарий использования имеет разные требования к фоновым службам. Это не только увеличивает скорость отклика фоновой службы, но и увеличивает сложность фоновой службы. С введением концепции микросервисной архитектуры API-шлюз стал стандартным компонентом микросервисной архитектуры.

Зачем использовать шлюз

Приложения микрослужбы могут быть развернуты в разных компьютерных залах, в разных регионах и под разными доменными именами. В настоящее время, если клиент (браузер/мобильный телефон/программный инструмент) хочет запросить соответствующую услугу, ему необходимо знать конкретный IP-адрес или URL-адрес доменного имени машины.При наличии множества экземпляров микросервисов это очень сложно для запоминания Для клиента Также слишком сложно поддерживать. В этот момент есть шлюз, и клиентские запросы отправляются напрямую на шлюз, шлюз разрешает и определяет конкретный адрес микросервиса по идентификатору запроса, а затем перенаправляет запрос экземпляру микросервиса. Все функции памяти выполняются шлюзом.

процесс работы

image.png

Клиент делает запрос к Spring Cloud Gateway. Если маршрут, соответствующий запросу, найден в сопоставлении обработчика шлюза, он отправляется веб-обработчику шлюза. Затем обработчик отправляет запрос нашей фактической службе для выполнения бизнес-логики через указанную цепочку фильтров (шаблон проектирования цепочки ответственности), а затем возвращается.

характерная черта

Характеристики SpringCloud Gateway следующие:

  1. На основе Spring Framework 5, Project Reactor и Spring Boot 2.0.
  2. Встроенный автоматический выключатель Hystrix
  3. Интеграция Spring Cloud DiscoveryClient
  4. Предикаты и фильтры действуют по определенным маршрутам, легко писать предикаты и фильтры
  5. Имеет некоторые расширенные функции шлюза: динамическая маршрутизация, ограничение тока, перезапись пути
  6. Переписать путь
  7. Ограничение
  8. динамическая маршрутизация

Основная идея

  • 路由(Route): Маршрут — это самая основная часть шлюза, он определяется идентификатором, целевым URI, набором утверждений и набором фильтров. Если утверждение истинно, маршрут совпадает.
  • 断言(Predicate): функция утверждения в Java8. Тип ввода функции утверждения в Spring Cloud Gateway — это ServerWebExchange в среде Spring 5.0. Функция утверждения в Spring Cloud Gateway позволяет разработчикам определять и сопоставлять любую информацию из запроса Http, такую ​​как заголовки и параметры запроса.
  • 过滤器(Filter): стандартный веб-фильтр Spring. Фильтры в Spring Cloud Gateway делятся на два типа: фильтр шлюза и глобальный фильтр. Фильтры будут обрабатывать запросы и ответы.

Начать

Создайте Spring Boot прямо в IDEA:

image.png

pom.xmlЗависимости Spring Cloud Gateway автоматически вносятся в файл:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

application.ymlКонфигурационный файл:

server:
  port: 8080
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: cloud-gateway
          uri: http://192.168.1.211:8088/
          predicates:
            - Path=/ytb/**

Значение каждого поля следующее:

  • id: пользовательский идентификатор маршрутизации, оставьте его уникальным
  • uri: целевой адрес службы
  • predicates: условия маршрутизации, Predicate принимает входной параметр и возвращает логический результат. Этот интерфейс содержит несколько методов по умолчанию для объединения предикатов в другую сложную логику (например: И, ИЛИ, НЕ).
  • фильтры: правила фильтрации, здесь не используются.

Приведенная выше конфигурация означает, что идентификатор настроен какcloud-gatewayПрокси-правила URI для правил маршрутизации:

При доступе к адресуhttp://localhost:8080/ytb/fileType/getFileTypeListавтоматически пересылается на адресhttp://192.168.1.211:8088/ytb/fileType/getFileTypeList

Адрес, на который переадресован один из моихтестовый адресВозврат следующим образом:

image.png

Кромеapplication.ymlФункцию переадресации можно реализовать не только через конфигурацию, но и через код: мы можем добавить методы в стартовый класс GateWayApplication.customRouteLocator()для настройки правил переадресации.

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

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder){
        return builder.routes()
                .route("path_route", r -> r.path("/ytb/**").uri("http://192.168.1.211:8088/")).build();
    }
}

Здесь используется функциональное программирование из наших предварительных знаний. Начать доступ к проектуhttp://localhost:8080/ytb/fileType/getFileTypeListадрес, мы получим тот же результат возврата, что и выше.

правила маршрутизации

Spring Cloud GatewayчерезSpring WebFluxиз HandlerMappingВ качестве базовой поддержки для соответствия маршруту пересылки,Spring Cloud Gatewayмного встроенногоPredicatesзавод, этиPredicatesФабрика соответствует различным параметрам HTTP-запроса, множественнымPredicatesЗавод может быть использован в комбинации.

PredicateИз Java 8 это функция, представленная в Java 8,PredicateПринимает один входной параметр и возвращает логический результат. Интерфейс содержит несколько методов по умолчанию дляPredicateОбъединены в другую сложную логику (например: И, ИЛИ, НЕ). Его можно использовать для проверки параметров запроса интерфейса и для определения того, изменились ли новые и старые данные и нуждаются ли они в обновлении.

Рассмотрим конкретные правила маршрутизации.

Datetime

Соответствует запросам, которые произошли после даты и времени

spring: 
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: cloud-ytb
          uri: http://localhost:9201/
          predicates:
            - After=2021-02-23T14:20:00.000+08:00[Asia/Shanghai]

Cookie

соответствует указанному имени и значение которого соответствует регулярному выражениюcookie

spring: 
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: cloud-ytb
          uri: http://localhost:9201/
          predicates:
            - Cookie=username, ezhang

Header

Соответствует заголовку запроса с указанным именем,\d+значение соответствует регулярному выражению

spring: 
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: cloud-ytb
          uri: http://localhost:9201/
          predicates:
            - Header=X-Request-Id, \d+

Host

список совпадающих имен хостов

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: cloud-gateway
          uri: https://www.baidu.com
          predicates:
            - Host=**.baidu.com

Используйте curl для проверки, ввод командной строки:

curl http://localhost:8080 -H "Host: www.baidu.com"

image.png

Method

Параметры, соответствующие методам запроса, которые являются одним или несколькими параметрами

spring: 
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: cloud-ytb
          uri: http://localhost:9201/
          predicates:
            - Method=GET,POST

Path

путь запроса сопоставления

spring: 
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: cloud-ytb
          uri: http://localhost:9201/
          predicates:
            - Path=/system/**

То же самое используется для использования пути соответствия запроса.

Query

сопоставить параметры запроса

spring: 
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: cloud-ytb
          uri: http://localhost:9201/
          predicates:
            - Query=username, ezhang.

RemoteAddr

Совпадение IP-адреса и маски подсети

spring: 
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: cloud-ytb
          uri: http://localhost:9201/
          predicates:
            - RemoteAddr=192.168.0.1

Weight

вес матча

spring: 
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: cloud-ytb-v1
          uri: http://localhost:9201/
          predicates:
            - Weight=group1, 8
        - id: cloud-ytb-v2
          uri: http://localhost:9201/
          predicates:
            - Weight=group1, 2

При разработке, тестировании или публикации в Интернете, когда онлайн-сервисы контролируются несколькими версиями, необходимо обеспечить весовую маршрутизацию для сервисов.Наиболее распространенное использование заключается в том, что сервис имеет две версии: старую версию V1 и новую версию V2. . При онлайн-оттенках серого необходимо динамически передавать и направлять информацию о весе через шлюз в режиме реального времени. Например, 80% трафика приходится на версию сервиса v1, а 20% трафика — на версию сервиса v2.

конфигурация маршрутизации

существуетspring cloud gatewayСредняя конфигурацияuriЕсть три способа, в том числе

  • конфигурация веб-сокета
spring:
  cloud:
    gateway:
      routes:
        - id: cloud-ytb
          uri: ws://localhost:9213/
          predicates:
            - Path=/ytb/**
  • конфигурация http-адреса
spring:
  cloud:
    gateway:
      routes:
        - id: cloud-ytb
          uri: http://localhost:9213/
          predicates:
            - Path=/ytb/**
  • Как настроить реестр

Пользовательский в части протокола схемы urilb:тип, представляющийNacos), чтобы подписаться на услугу и маршрутизировать услугу.

spring:
  cloud:
    gateway:
      routes:
        - id: cloud-ytb
          uri: lb://cloud-ytb
          predicates:
            - Path=/ytb/**

Spring Cloud Gateway и Zuul

spring-cloud-Gatewayдаspring-cloudподпроект . а такжеzuulявляетсяnetflixПроект компании, как раз весной будетzuulИнтеграция используется только в spring-cloud.

потому чтоzuul2.0последовательные отскоки иzuul1Производительность не очень идеальна, поэтому весенняя команда была рождена для разработкиGatewayпроект.

Сравнение Spring Cloud Gateway и Zuul:

  • Оба являются веб-шлюзами и обрабатывают http-запросы.
  • По сравнению с zuul, gateway больше полагается на spring-webflux.С поддержкой spring функция мощнее, и внутренняя реализация ограничения тока, балансировки нагрузки и т.д., и масштабируемость тоже сильнее, но в то же время , он ограничен комплектом Spring Cloud, тогда как zuul может быть расширен на другие микросервисные фреймворки, которые не реализуют ограничение тока, балансировку нагрузки и т.д.
  • Шлюз очень хорошо поддерживает асинхронность, в то время как zuul поддерживает только синхронизацию. Теоретически шлюз больше подходит для повышения пропускной способности системы (но не обязательно для повышения производительности). Окончательная производительность должна быть определена с помощью тщательного стресс-тестирования.
  • С точки зрения дизайна фреймворка шлюз имеет лучшую расширяемость, и он выпустил RELESE версии 2.0.0, и его стабильность также очень хороша.

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

Zuul также является хорошим выбором для небольших микросервисных архитектур или сложных архитектур (включая не только микросервисные приложения, но и другие сервисные узлы, не относящиеся к Spring Cloud).

Уведомление:

Spring Cloud GatewayнужноSpringBootа такжеSpringWebFluxкоторый предоставилNettyзапустить, не может быть набраноwarпакет наTomcatОн запускается в проекте, поэтому его не нужно добавлять в проект.spring-boot-starter-webполагаться.

Официальный сайт:Spring Cloud Gateway