Обмен технологиями

SpringCloudGateway

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

эффект

  • Единое управление, легко контролировать
  • Безопасность, ограничение тока: фильтрация нелегальной информации на уровне шлюза.
  • внешний шлюз nginx, шлюз интрасети
  • nginx можно улучшить с помощью Lua или Kong

концепция

  • идентификатор: любое имя
  • uri: адрес прокси-службы. id и uri являются обязательными, предикат и фильтр не являются обязательными.
  • Предикат: может использоваться для сопоставления URI для доступа к шлюзу. При совпадении текущий маршрут вступит в силу.
  • Фильтр: экземпляр GatewayFilter, добавляющий логику до или после прокси-сервера, с высочайшей гибкостью.

Процесс обработки

  • Сначала сопоставление обработчиков обрабатывает URL-адрес, а затем передает его веб-обработчику. Он вызывает первую половину фильтра для обработки. После завершения обработки он вызывает фактическую прокси-службу. После ответа прокси-службы он выполняет логику. второй половины фильтра Верните результат в WebHandler, затем в HandlerMapping и, наконец, клиенту.

использовать

gateway:
      discovery:
        locator:
          enabled: true # 启用自动根据服务ID生成路由
          lower-case-service-id: true # 设置路由的路径为小写的服务ID
  • 1
  • 2
  • 3
  • 4
  • 5

конфигурация YML

  • Если элементы в списке имеют несколько полей, вам нужно указать «-» и двоеточие для указания каждого поля и значения соответственно. Если поле только одно, вы можете использовать запятые для его разделения;
  • Конфигурация типа объекта, каждое поле можно настроить с помощью «-» и двоеточия.
  • Тип карты: ключ, значение, разделенное двоеточием.
predicates:
  - Path=/sendOrder
  - Query=name,ma.
  - name: Query
    args:
      param: id
      regexp: d+
 #predicates是List, 它的元素是
 public class PredicateDefinition {

	@NotNull
	private String name;

	private Map<String, String> args = new LinkedHashMap<>();
  }
  等号分割转成对象的写法不是yml内置支持的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

предикат

  • Конфигурация предиката представляет собой список, элементами которого могут быть строки определенного формата или объекты. Метод записи строки: разбивается по знаку равенства, первая часть — это имя имени предиката, вторая часть — args, разделяется запятыми, значение сохраняется в значении карты, автоматически генерируется ключ карты. Метод записи объекта: PredicateDefinition
  • Если в самих аргументах есть запятые и двоеточия, строковый формат использовать нельзя.
  • Метод ShortType определяет метод синтаксического анализа параметров args для ConfigClass. DEFAULT: ShortFieldOrder удаляет префикс ShortFieldPrefix и соответствует имени поля ConfigClass. Значение параметра args соответствует значению поля ConfigClass; GATHER_LIST: список, разделенный запятыми; : список, разделенный запятыми, но последний. Значение представляет собой логическое значение, которое в конечном итоге преобразуется в карту из двух ключей. Значение первого ключа — это список перед логическим значением, а второй ключ — это значение. Логическое значение.
  • Используется для сопоставления запросов на доступ к шлюзу (таких как uri, параметры запроса, заголовки запроса). При совпадении текущий маршрут вступит в силу.
  • В соответствии с реализацией GatewayPredicate класс реализации создается фабрикой. Фабрика является классом реализации RoutePredicateFactory. Спецификация именования класса реализации: имя предиката+RoutePredicateFactory. Например, Path соответствует PathRoutePredicateFactory.
  • Имя предиката соответствует префиксу имени класса фабричного класса реализации, а параметр предиката args соответствует фабричному ConfigClass.
  • Множественные предикатыиОтношение
  • Если предикат не проходит, шлюз возвращает 404.

Путь

  • Сопоставление путей, поддержка сопоставления ant и извлечение uriVariables через {}

Запрос

  • Существует ли соответствующее имя параметра HTTP-запроса. Значение может быть обычным.
  • имя фиксировано. Запрос, args имеет два значения: param и regexp, соответствующие именам и значениям параметров запроса.
  • Если настроено только имя, это означает, что пока существует параметр запроса, он будет передан.

Заголовок

  • ЗаголовокRoutePredicateFactory
  • Сопоставить имя и значение заголовка запроса. Можно сопоставить только имя. Фактическое значение заголовка запроса может быть множественным. Если имеется одно совпадение, значение конфигурации поддерживает регулярные выражения.

Метод

  • Соответствует методу HTTP-запроса. Конфигурация должна быть указана заглавными буквами и разделена запятыми.

RemoteAddr

  • IP-адрес клиента, соответствующий запросу, а точнее IP-адрес последнего сетевого прокси, может быть множественным, разделенным запятыми.

Хозяин

  • Соответствует значению части хоста в заголовке запроса хоста (за исключением порта). Его может быть несколько, разделенных запятыми, и он может сопоставляться с помощью ant.
  • Используйте AntPathMatcher для сопоставления, а разделителем путей является «.»

Печенье

  • Сопоставление имени и значения файла cookie. Значение может регулярно сопоставляться.

Масса

  • Используется для балансировки нагрузки разных маршрутов. Маршруты в одной группе загружаются по весу.
  • Вы можете настроить два значения, разделенных запятыми: группировка и вес.
  • WeightCalculatorWebFilter: при запуске создается двухслойная карта на основе конфигурации веса. Первый уровень — это имя группы, а второй уровень — идентификатор маршрутизации. При поступлении запроса генерируется случайное число от 0 до 1. для каждой группы выбирается идентификатор маршрутизации.
  • WeightRoutePredicateFactory: при фильтрации по предикатам фильтрация на основе идентификатора группы и маршрута.

фильтр

  • Способ записи конфигурации такой же, как и предикат. Способ записи строки: разделить по знаку равенства. Первая часть соответствует префиксу имени класса фабрики фильтров GatewayFilterFactory, а вторая часть является параметром.
  • Фильтры используются для изменения запросов и ответов.

ДобавитьЗаголовокЗапроса

  • Добавьте заголовки запросов, которые может получить бэкэнд.
  • Значение заголовка запроса поддерживает динамическое получение из uriVariables.

StripPrefix

  • Существует только одно целочисленное значение n. После разделения запрошенного пути на «/» удалите префикс n.

Ограничение

Междоменный домен

spring.cloud.gateway.globalcors:
  cors-configurations:
    '[/**]': #跨域的uriPattern
      allowedHeaders: "*"
      allowedOrigins: "*"
      allowedMethods:
        - POST
        - OPTIONS
        - GET
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • Сервер определяет, является ли это междоменный запрос, по тому, совпадают ли заголовок запроса Origin и схема, хост и порт URL-адреса запроса. Если есть одно различие, это междоменный запрос.
  • Должна быть междоменная конфигурация, и запрошенный uri соответствует uriPattern междоменной конфигурации. Шлюз определит, является ли она междоменной, он разрешит междоменные заголовки запросов. источники, методы запроса и фактические запросы в междоменной конфигурации. Совпадают ли заголовок запроса, источник и метод запроса. Если они все совпадают, запустите междоменный доступ, в противном случае верните 403Forbiden.
  • org.springframework.web.reactive.handler.AbstractHandlerMapping#getHandler
  • org.springframework.web.cors.reactive.DefaultCorsProcessor#process

Автоматически генерировать маршруты

  • Поддерживает получение идентификатора службы посредством обнаружения службы и автоматически генерирует конфигурацию маршрутизации на основе идентификатора службы.URI конфигурации маршрута по умолчанию — lb://serviceId, предикат — /serviceId/**, а фильтр — Rewritepath для удаления serviceId.

глобальный фильтр

ReactiveLoadBalancerClientFilter

  • Чтобы обработать URI маршрутизации с помощью схемы lb, сначала получите экземпляр службы в соответствии с именем службы через ServiceInstanceListSupplier, а затем выполните балансировку нагрузки через экземпляр ReactorLoadBalancer.

RouteToRequestUrlFilter

  • Сделайте 2 вещи: 1. Поддержите двухуровневые схемы, сохраните внешнюю схему в GATEWAY_SCHEME_PREFIX_ATTR, а затем удалите ее. 2. Используйте внутреннюю схему, хост и порт, чтобы заменить фактически запрошенный URI для достижения пересылки.