Введение в функцию
1. Маршрутизация
— Zuul может пересылать полученные HTTP-запросы соответствующему экземпляру микросервиса в соответствии с предопределенными правилами маршрутизации. Например, он может маршрутизировать запросы `/api/users` к микросервису с именем `users-service`.
2. Фильтры
- Zuul имеет мощный механизм цепочки фильтров, который может выполнять некоторую логику предварительной или постобработки до или после того, как запрос достигает службы, например аутентификацию личности, проверку безопасности, ведение журнала, ограничение тока, автоматический выключатель, добавление или изменение заголовков запроса. и сжатие ответов и т. д.
3. Балансировка нагрузки
- В сочетании с компонентами обнаружения служб, такими как Eureka или Consul, Zuul может прозрачно распределять запросы к исправному экземпляру службы во внутреннем кластере служб для достижения балансировки нагрузки.
4. Периферийные сервисы
- В среде облачного развертывания Zuul может выступать в качестве пограничной службы системы, предоставляя такие функции, как отслеживание запросов, обработка исключений, ограничение скорости API и кэширование, чтобы обеспечить надежность и безопасность системы.
Принцип работы
— Когда клиент инициирует запрос к Zuul, запрос сначала перехватывается ZuulServlet.
- ZuulServlet создаст ZuulRunner и в процессе инициализирует RequestContext, который представляет собой глобальный контейнер данных области запроса, используемый для передачи контекстной информации в течение жизненного цикла запроса.
- Запросы попадают в цепочку фильтров, и в настроенном порядке выполняется ряд предварительных фильтров, фильтров маршрутизации и постфильтров.
— Фильтр маршрутизации отвечает за поиск целевого микросервиса и пересылку запроса соответствующему целевому сервису.
- Последующие фильтры могут продолжать обрабатывать запросы или ответы, такие как аутентификация, статистика, ведение журнала и т. д.
- В конечном итоге ответ возвращается клиенту через цепочку фильтров.
Архитектурный дизайн
- Zuul сам по себе является приложением веб-сервлетов, которое можно развернуть в любом совместимом контейнере сервлетов.
- Он использует преимущества Spring Boot и Spring Cloud, что позволяет легко интегрироваться в общую архитектуру Spring Cloud и беспрепятственно работать с другими компонентами, такими как Eureka, Ribbon, Hystrix и т. д.
Пример сценария
- Использование Zuul может скрыть конкретные сетевые детали внутренних микросервисов. Внешним клиентам необходимо взаимодействовать только со шлюзом Zuul, что упрощает взаимодействие между клиентом и сервером.
— Фильтр безопасности может единообразно обрабатывать проверку безопасности всех служб, избегая повторной реализации одной и той же логики проверки в каждой микрослужбе.
- Zuul может агрегировать ответы от нескольких сервисов, тем самым сокращая количество сетевых обращений от клиента к каждому сервису и улучшая взаимодействие с пользователем.
Пример кода Spring Cloud Zuul
Ниже приведена простая базовая конфигурация Spring Cloud Zuul и пример кода фильтра, показывающий, как настроить маршрутизацию и реализовать простой фильтр:
1. Добавьте зависимости
Добавьте зависимость Spring Cloud Zuul в pom.xml проекта Maven:
<dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>номер версии</version> <!-- По словам Весны Обновление облачной версии -->
</dependency>
2. Настройте прокси Zuul
Настройте правила маршрутизации Zuul в файле application.yml или application.properties:
zuul:
routes:
userservice:
path: /api/users/**
url: http://localhost:8081 # Предположим, что это реальный адрес userservice
3. Создайте класс конфигурации Zuul.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy // Включить функцию прокси Zuul
public class ZuulGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulGatewayApplication.class, args);
}
}
4. Реализуйте простой фильтр
Создайте собственный класс фильтра, унаследованный от ZuulFilter:
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyPreFilter extends ZuulFilter {
private static final Logger log = LoggerFactory.getLogger(MyPreFilter.class);
@Override
public String filterType() {
return "pre" // Возвращаем тип фильтра, вот предварительный фильтр
}
@Override
public int filterOrder() {
return 1; //Установим порядок выполнения фильтра. Чем меньше значение, тем выше приоритет.
}
@Override
public boolean shouldFilter() {
return true; // Выполнять ли этот фильтр?
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info("MyPreFilter is running, URI: {}", request.getRequestURI());
// Здесь вы можете добавить свою логику предварительной обработки, такую как ведение журнала, запросы на проверку и т. д.
return null;
}
}
5. Регистрация фильтров
Чтобы Zuul распознавал и использовал пользовательский фильтр, его необходимо добавить в контейнер Spring:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public MyPreFilter myPreFilter() {
return new MyPreFilter();
}
}
Теперь, когда вы запускаете приложение Zuul Gateway, все запросы с путем `/api/users/**` будут направляться к указанному экземпляру службы, и прежде чем запрос достигнет целевой службы, фильтр `MyPreFilter` сначала выполнит свою задачу. `Логика в методе run()`.
Spring Cloud Zuul повышает гибкость, безопасность и общую управляемость микросервисной архитектуры, выступая в качестве шлюза API.
Spring Cloud Gateway
Spring Cloud Gateway — это высокопроизводительный сервис API-шлюза в экосистеме Spring Cloud. Это решение для микросервисного шлюза нового поколения, разработанное командой Spring Cloud на основе Spring 5.0, Project Reactor и Spring Boot 2.0. По сравнению с предыдущим Spring Cloud Zuul, Spring Cloud Gateway обеспечивает более мощные и гибкие функции маршрутизации и фильтрации, а также в полной мере использует высокопроизводительную неблокирующую модель ввода-вывода Reactor Netty для улучшения возможностей одновременной обработки системы и скорости ответа.
Введение в функцию
1. Маршрутизация:
Spring Cloud Gateway поддерживает расширенные правила сопоставления маршрутизации. Он может принимать решения о маршрутизации на основе пути, метода, имени хоста, заголовка, параметров запроса и других атрибутов HTTP-запроса и пересылать запрос соответствующему микросервису.
2. Фильтр:
Фабрика GatewayFilter предназначена для облегчения предварительной и постобработки запросов и ответов. Фильтры делятся на два типа: глобальные фильтры и фильтры уровня маршрута, которые можно использовать для реализации таких функций, как аутентификация, ограничение тока, автоматический выключатель, ведение журнала и преобразование запросов.
3. Плагин-дизайн:
Позволяет пользователям настраивать фабрики фильтров, легко расширять функции шлюза и реализовывать индивидуальную логику обработки.
4. Обнаружение сервисов и балансировка нагрузки:
Его можно легко интегрировать с компонентами обнаружения сервисов, такими как Eureka и Consul, для автоматического обнаружения серверных сервисов и выполнения балансировки нагрузки.
5. Автоматические выключатели и отказоустойчивость:
Сотрудничая с такими компонентами, как Spring Cloud Hystrix или Spring Cloud LoadBalancer, можно обеспечить отказоустойчивую обработку, такую как ухудшение качества обслуживания и автоматический выключатель.
Принцип анализа
Основной рабочий процесс Spring Cloud Gateway в основном включает в себя следующие ссылки:
1. Получите запрос:
Клиент инициирует HTTP-запрос к Spring Cloud Gateway.
2. Сопоставление маршрутов:
Шлюз сопоставляет запросы на основе предопределенных правил маршрутизации. Правила маршрутизации описываются RouteDefinition, включая уникальный идентификатор, целевой URI, серию утверждений, предикат и набор фильтров.
3. Построение и исполнение цепочки фильтров:
Если запрос соответствует правилу маршрутизации, шлюз создает для запроса цепочку фильтров, и фильтры в цепочке выполняются в определенном порядке. Фильтры могут изменять запросы, ответы или другую контекстную информацию, например аутентификацию, добавление или удаление заголовков запросов, изменение путей запросов и т. д.
4. Отправьте запрос:
Запросы, обрабатываемые цепочкой фильтров, перенаправляются в определенные серверные микрослужбы через встроенный механизм обнаружения служб в соответствии с целевым URI, определенным маршрутом.
5. Обработка и возврат ответа:
После того как микросервис обработает запрос и сгенерирует ответ, ответ выполняет логику постобработки в обратном порядке по цепочке фильтров и, наконец, возвращается клиенту.
Техническая реализация
Spring Cloud Gateway основан на платформе Spring WebFlux и использует неблокирующий ввод-вывод, позволяя обрабатывать несколько запросов в одном потоке, повышая пропускную способность системы и скорость ответа. В то же время его высокая производительность выигрывает от управляемых событиями характеристик Reactor Netty, которые могут лучше справляться со сценариями с высоким уровнем параллелизма.
Spring Cloud Gateway играет жизненно важную роль в архитектуре микросервисов. Он не только служит входом трафика, но также берет на себя ряд важных обязанностей, таких как защита безопасности, контроль трафика, оркестровка API и агрегация сервисов, что значительно упрощает взаимодействие между ними. сложность микросервисов и повышает стабильность и масштабируемость всей архитектуры.
Использование Spring Cloud Gateway
Настройка и использование Spring Cloud Gateway обычно включает в себя две основные части: настройку маршрутизации (Маршруты) и настройку фильтров (Фильтры). Ниже приведены несколько основных примеров кода, иллюстрирующих, как настроить и использовать Spring Cloud Gateway.
Пример конфигурации маршрутизации
В приложениях Spring Boot правила маршрутизации можно настроить через файлы application.yml или application.properties, например:
yaml
spring:
cloud:
gateway:
routes:
- id: user-service-route # Идентификатор маршрута, используемый для идентификации
uri: lb://user-service #LB (обнаружение службы) адрес целевой службы
predicates: # Предикаты, используемые для определения того, какие запросы будут направлены к этой цели.
- Path=/users/**
фильтры: # Список фильтров, применяемых к запросам или ответам.
- StripPrefix=1 # Удалите префикс «/users», чтобы путь запроса правильно сопоставлялся с серверной службой.
Пример настройки фильтра
Определите собственный фильтр в классе конфигурации Java, например простой фильтр журнала:
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.rewrite.AbstractRewriteResponseHeaderGatewayFilterFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
@Component
public class LoggingFilter implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("Request incoming: {}", exchange.getRequest().getPath());
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("Request completed: {}", exchange.getRequest().getPath());
}));
}
}
//Применяем пользовательский фильтр к маршруту
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("logging_route", r -> r.path("/api/**")
.filters(f -> f.filter(new LoggingFilter()))
.uri("lb://backend-service"))
.build();
}
}
В этом примере мы создаем собственный фильтр под названием LoggingFilter, который регистрирует запросы по мере их поступления и завершения. Затем в классе конфигурации GatewayConfig мы применяем этот фильтр ко всем маршрутам, начинающимся с /api/**, и перенаправляем запрос в службу с именем backend-service.
Обратите внимание, что в реальных приложениях может потребоваться дополнительная настройка компонентов обнаружения служб, глобальных фильтров и других функций. В этих примерах показана базовая конфигурация Spring Cloud Gateway, которую можно расширять и корректировать в соответствии с потребностями во время фактического использования.
Сравните два
Выбери весну Cloud Шлюз или Zuul как шлюз API в микросервисной архитектуре в основном зависит от следующих факторов: Производительность и технологический стек
- Spring Cloud Gateway На основе весны Платформы Reactor и WebFlux 5 используют Netty для реализации асинхронного неблокирующего ввода-вывода с более высокой производительностью и меньшей задержкой. Для сценариев с высоким уровнем параллелизма и приложений с высокими требованиями к работе в реальном времени лучше выбрать Gateway. - Zuul 1.x На основе традиционного сервлета API, режим синхронной блокировки, производительность немного уступает Gateway. - Zuul 2.x При использовании асинхронной неблокирующей модели производительность улучшилась, но благодаря Spring Облако не интегрировано с Zuul 2.x, поэтому поддержка и стабильность сообщества не так хороши, как у Spring. Cloud Gateway。 Функции
- Spring Cloud Gateway предоставляет более широкие и гибкие правила сопоставления маршрутов, а также мощный механизм фильтрации с более мощными возможностями обработки запросов и ответов. - Zuul предоставляет базовые функции маршрутизации и фильтрации, но для сравнения в Gateway реализовано больше функций расширения и оптимизации.
Поддержка сообщества и будущее развитие
- Spring Cloud Gateway — это решение API-шлюза, официально продвигаемое Spring Cloud. Оно активно поддерживается и поддерживается, имеет активное сообщество и имеет четкое направление дальнейшего развития. - Хотя Zuul 1.x когда-то был частью семейства Spring Cloud, с запуском Gateway Zuul 1.x больше не является официально рекомендуемым выбором. — Разработка Zuul 2.x не полностью интегрирована в экосистему Spring Cloud, а это значит, что если вы выберете Zuul 2.x, вам, возможно, придется решать вопросы интеграции с другими компонентами Spring Cloud самостоятельно.
Стоимость совместимости и миграции
- Если ваш проект уже использует Spring Облако и хотите плавно обновить Spring Cloud Gateway будет естественным выбором для перехода. - Если вы ищете новое решение для шлюза API, и проект не зависит строго от Spring Облачная экология, вы можете исследовать Зуул Сможет ли версия 2.x удовлетворить потребности, необходимо также учитывать риски, связанные с долгосрочным обслуживанием и технической поддержкой. в заключение Все вместе для самой новой весны Проект облачного микросервиса или обновление существующего проекта, Spring Cloud Gateway обычно является лучшим выбором, поскольку он имеет более высокую производительность, более богатые функции и более стабильную поддержку сообщества. Если нет особых потребностей, указывающих на Зуула 2.x, в противном случае рекомендуется сначала использовать Spring. Cloud Gateway。