предисловие
Недавно компания использовала корзину семейства 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, чтобы пообщаться с непосредственно автор.