Некоторые подводные камни, с которыми я столкнулся при использовании Spring Gateway

Spring Cloud

предисловие

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

текст

Я не буду рассказывать о введении и базовой конструкции Gateway, вы можете следить за официальной документацией. Разница между Spring Cloud Gateway и zuul не упоминается, а статей в интернете много. Просто используйте шлюз, чтобы вводить зависимости напрямую, без добавления аннотаций в класс запуска.

1. Переадресация запроса

Я здесь, чтобы выдвинуть запрос, вероятно, упадет на две категории:

а. Неинтегрированный реестр

На самом деле, это использование относительно редко.Вообще говоря, мы интегрируем центр регистрации, чтобы использовать его, чтобы можно было добиться автоматической настройки и автоматической переадресации. Конечно, этот конкретный метод также может быть использован в некоторых случаях.

В этом случае вам нужно указать, на какой сервер вам нужно переадресовать, который можно разделить на два типа, файл конфигурации и форму кода.

а.1 Файл конфигурации

взять образец

spring:
  application:
    name: spring-cloud-gateway-sample
  cloud:
    gateway:
      routes:
        - id: blog
          uri: https://juejin.cn
          predicates:
            # 匹配路径转发
            - Path=/api-boot-datasource-switch.html
# 端口号
server:
  port: 9090

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

uri — это адрес, на который вам нужно перенаправить. Поскольку интегрированного реестра нет, его нужно писать полностью.

Давайте объясним предикаты здесь. Вы можете понять использование каждого предиката как: когда это условие выполнено, оно будет переадресовано.Если их более одного, оно будет перенаправлено, когда все будут выполнены. Например, приведенный выше пример автоматически перенаправляется на http://juejin.im/api-boot-datasource-switch.html при посещении http://localhost:9090/api-boot-datasource-switch.html, здесь должно Обратите внимание, что переадресация маршрута будет выполняться только в том случае, если значение Path полностью совпадает.

Таким образом, приведенный выше пример является примером предиката Path, предикатов много, таких как Before, After, Cookie, Header, Host и т. д., их также можно комбинировать. Для получения полной информации вы можете обратиться к официальной документации или этой статье, которая также является более полной:woo woo Краткое описание.com/afraid/ из 2 из 3 не 6851…

a.2 RouteLocator

Форма кода может быть достигнута с помощью класса RouteLocator:

@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
  return builder.routes()
    .route("blog", r -> 
           r.path("/api-boot-datasource-switch.html").uri("https://juejin.cn"))
    .build();
}

Это вариант кода с использованием предиката Path выше, достаточно внедрить этот класс в Spring в виде @Bean. Другие предикаты аналогичны и не будут упоминаться.

б. Интегрировать реестр

На самом деле, это чаще используется в повседневной работе, где я использовал Eureka, другие реестры должны быть похожими.

Здесь я использую файл конфигурации для реализации глобальной конфигурации,

spring:
  application:
    name: spring-cloud-gateway-sample
  cloud:
    gateway:
      routes:
        - id: blog
          uri: lb://blog-service
          predicates:
            # 匹配路径转发
            - Path=/blog/**
# 端口号
server:
  port: 9090

Приведенный выше пример похож на yml, когда конфигурация не интегрирована, единственное отличие состоит в конфигурации uri и условии Path, которые используются здесь.lb://В виде , это означает, что служба получена из реестра, за которым следует имя службы, на которую нужно выполнить переадресацию.Это имя службы должно соответствовать названию в eureka, иначе служба не будет найдена. Таким образом, приведенный выше файл конфигурации заключается в том, что, когда номер порта вашего пути запроса начинается с /blog, он будет перенаправлен в blog-service, а параметры останутся неизменными.

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

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true

После завершения настройки мы можем получить к ней доступ через имя службы в нижнем регистре, напримерhttps://gatewayIp:gatewayPort/blog/article/allбудут автоматически перенаправлены наhttp://blogserviceIp:blogservicePort/article/all

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

Для этой проблемы вы можете почти увидеть такое же решение на других платформах, попрактиковаться и обнаружить, что оно не работает (возможно, эти решения не поддерживались с момента обновления шлюза, по крайней мере, оно не работало после того, как я сам практиковал). Тем не менее, я все же столкнулся с лучшим способом написания, который может разумно решать междоменные проблемы и эффективен для личного тестирования. Если у вас есть лучшее решение, пожалуйста, поделитесь.

Вставьте исходную ссылку:blog.CSDN.net/Нравится слушать 555/Ariti…

Кроме того, есть еще один, который не сработал после практики, он также выложен для ознакомления:woo woo Краткое описание.com/afraid/ah 46 oh 62 отправить 9 ah...

3. докер-контейнер

Наша компания использует docker container как linux контейнер для микросервисов.При совмещении контейнера с spring cloud eureka будет яма, с чем я столкнулся когда использовал zuul gateway для запроса.

Когда Zuul пересылает запрос, он будет искать адрес в соответствии с ip+port каждого микросервиса в реестре eureka, но хитрость заключается в том, что когда ваш микросервис находится в контейнере докеров, зарегистрированной формой является идентификатор контейнера докеров + порт, аналогичный тому, что вы видите в панели мониторинга eurekaR3FDS4G:8080, так что ваш шлюз будет сообщать о неизвестной ошибке сервера при пересылке запросов, и эта проблема не существует локально, потому что ваш локальный сервер всегда является локальным.

Решение состоит в том, чтобы зарегистрировать свой сервер в виде ip+port в файле конфигурации вашего клиента eureka.

eureka:
  instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${server.port}:${spring.application.name}

Ну а когда вы успешно прописываете свой контейнер в еврике в виде ip+port, то в это время еще есть проблема.Хотя шлюз может успешно перенаправить запрос, но его нельзя пинговать в это время.Нажимаете на еврику.Он может можно обнаружить, что IP-адрес микросервиса в настоящее время не является адресом хоста. На самом деле речь идет о проблеме связи с докером, режим докера по умолчанию — режим моста, контейнер будет открывать пространство внутри, а внешнее подключение работать не будет. Итак, когда докер запускается, вам нужно добавить его в командную строку.-net=host, чтобы контейнер был смонтирован на хосте. По вопросам связи с докером вы можете ознакомиться с информацией самостоятельно. В это время шлюз может успешно переслать запрос (со ссылкой на весь реестр). Если вы указали путь к серверу микрослужбы при использовании переадресации шлюза, вышеуказанная проблема не возникнет, но вам, возможно, придется настраивать ее заново каждый раз, когда вы добавляете другую микрослужбу.

Суммировать

Выше приведены некоторые из проблем, с которыми я столкнулся на работе, и я буду обновлять, если в будущем возникнут новые проблемы.

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