- Чтобы узнать систему по лямбда-выражению, правильно - Денвер (juejin.cn)
- Давайте вместе изучим Stream в Java 8 — Самородки (juejin.cn)
- Первый опыт WebFlux — самородки (juejin.cn)
После изучения предыдущих предварительных знаний сегодня, наконец, пришло время учиться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-адрес доменного имени машины.При наличии множества экземпляров микросервисов это очень сложно для запоминания Для клиента Также слишком сложно поддерживать. В этот момент есть шлюз, и клиентские запросы отправляются напрямую на шлюз, шлюз разрешает и определяет конкретный адрес микросервиса по идентификатору запроса, а затем перенаправляет запрос экземпляру микросервиса. Все функции памяти выполняются шлюзом.
процесс работы
Клиент делает запрос к Spring Cloud Gateway. Если маршрут, соответствующий запросу, найден в сопоставлении обработчика шлюза, он отправляется веб-обработчику шлюза. Затем обработчик отправляет запрос нашей фактической службе для выполнения бизнес-логики через указанную цепочку фильтров (шаблон проектирования цепочки ответственности), а затем возвращается.
характерная черта
Характеристики SpringCloud Gateway следующие:
- На основе Spring Framework 5, Project Reactor и Spring Boot 2.0.
- Встроенный автоматический выключатель Hystrix
- Интеграция Spring Cloud DiscoveryClient
- Предикаты и фильтры действуют по определенным маршрутам, легко писать предикаты и фильтры
- Имеет некоторые расширенные функции шлюза: динамическая маршрутизация, ограничение тока, перезапись пути
- Переписать путь
- Ограничение
- динамическая маршрутизация
Основная идея
-
路由(Route)
: Маршрут — это самая основная часть шлюза, он определяется идентификатором, целевым URI, набором утверждений и набором фильтров. Если утверждение истинно, маршрут совпадает. -
断言(Predicate)
: функция утверждения в Java8. Тип ввода функции утверждения в Spring Cloud Gateway — это ServerWebExchange в среде Spring 5.0. Функция утверждения в Spring Cloud Gateway позволяет разработчикам определять и сопоставлять любую информацию из запроса Http, такую как заголовки и параметры запроса. -
过滤器(Filter)
: стандартный веб-фильтр Spring. Фильтры в Spring Cloud Gateway делятся на два типа: фильтр шлюза и глобальный фильтр. Фильтры будут обрабатывать запросы и ответы.
Начать
Создайте Spring Boot прямо в IDEA:
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
Адрес, на который переадресован один из моихтестовый адресВозврат следующим образом:
Кроме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"
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