В этой статье рассказывается, как представить шлюз Gateway в проекте SpringCloud и выполнить вызов службы шлюза. Шлюз Шлюз — это ключевой компонент, который управляет входом и маршрутизацией в микросервисной архитектуре. Он отвечает за обработку клиентских запросов, принятие решений о маршрутизации и пересылку запросов соответствующим микросервисам. Шлюз также может реализовывать балансировку нагрузки, аутентификацию безопасности, ведение журнала и другие функции, централизованно управлять связью между службами и повышать удобство обслуживания и безопасность всей системы. С помощью шлюза можно создать унифицированную точку доступа, упрощая взаимодействие между клиентом и серверными микросервисами и обеспечивая более гибкое управление и мониторинг трафика.
Gateway — это служба шлюза API на основе Spring Cloud. Он обеспечивает маршрутизацию, фильтрацию, мониторинг, ведение журнала и другие функции и используется для единообразного управления и пересылки трафика запросов микросервисов. В качестве точки входа в микросервисную архитектуру шлюз может реализовывать такие функции, как балансировка нагрузки, безопасная аутентификация и пересылка запросов, что повышает безопасность, доступность и удобство обслуживания системы.
Роль шлюза:
Схематическая диаграмма структуры проекта, включая шлюз:
Создание шлюза требует следующих шагов:
Нам нужно создать новый Spring в среде разработки. Загрузочный проект. не будет созданиз Вы можете обратиться к моему предыдущемуизстатья:SpringCloud-Создать многомодульный проект
В проекте SpringCloud мы создаем модуль Gateway, который я назвал Springcloud-gateway.
Добавьте зависимость Spring Cloud Gateway в файл pom.xml проекта Springcloud-gateway.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
Отредактируйте файл applicatin.yml, чтобы настроить правила маршрутизации шлюза, включая определение путей маршрутизации, целевых служб и другой информации.
server:
port: 8090
spring:
application:
name: springcloud-gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true # Включить автоматическую маршрутизацию
routes: # Конфигурация маршрутизации шлюза
- id: gateway-service # Идентификатор маршрута, пользовательский, уникальный
uri: lb://target # Маршрут из адреса назначения, фунт представляет собой балансировку нагрузки.
predicates: # Утверждение маршрутизации, позволяющее определить, соответствует ли запрос правилам маршрутизации.
- Path=/gateway/** # Путь запроса должен начинаться с /user/, иначе 404.
filters:
- StripPrefix=1 # URI отфильтровывает /шлюз при пересылке запросов.
Мы добавили динамическую маршрутизацию. Атрибуты динамической маршрутизации могут автоматически балансировать нагрузку на запросы на пересылку шлюза.
Здесь мы используем утверждение пути, которое требует, чтобы путь запроса начинался с /user/, в противном случае запрос вернет 404 (служба не найдена). Здесь мы также используем фильтр, позволяющий шлюзу удалять префикс /gateway при пересылке запросов. Концепции фабрик утверждений и фильтров подробно объясняются ниже.
В Spring Cloud Gateway утверждения (Predicate) используются для определения условий сопоставления запросов, чтобы определить, следует ли применять определенную цепочку фильтров. Ниже приведены некоторые распространенные типы утверждений шлюза и соответствующие примеры:
тип утверждения | Правила сопоставления | Пример |
---|---|---|
Path | Соответствует на основе запрошенного пути. | – Path=/api/** соответствует запросам с путем «/api/**». |
Method | Соответствует на основе метода HTTP запроса. | – Method=GET соответствует запросам GET. |
Header | Сопоставление на основе информации заголовка запроса. | – Header=Authorization, \d+соответствует запросам, содержащим заголовок «Authorization». |
Host | Соответствует запрошенному имени хоста. | – Host=example.com сопоставляет запросы с именем хоста «example.com». |
Query | Соответствует на основе параметров запроса. | – Query=category, \w+ соответствует запросам, содержащим параметр «category». |
Cookie | Сопоставление на основе запрошенного файла cookie. | – Cookie=sessionId, \d+ соответствует запросам, содержащим файл cookie с именем «sessionId». |
Combining | Объедините несколько утверждений в логическое условие для более сложного сопоставления. | – Path=/api/** AND Method=GET также соответствует запросам, путь которых — «/api/**», и является запросом GET. |
Вот пример:
server:
port: 8090
spring:
application:
name: springcloud-gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true # Включить автоматическую маршрутизацию
routes:
- id: gateway-service
uri: lb://target
predicates:
- Header=Authorization, Bearer 831B175-D251501-31A3F301-711636-9CAE
Здесь используются наиболее часто используемые Header Утверждение аутентификации в утверждении требует, чтобы запросы на доступ к шлюзу <Authorization, Bearer 831B175-D251501-31A3F301-711636-9CAE> Код аутентификации, если кода аутентификации нет или код аутентификации не совпадает, верните 404。
Spring Cloud Gateway предоставляет широкий выбор фильтров, которые используются для выполнения различных операций, когда запрос поступает в шлюз или ответ покидает шлюз. Ниже приведены некоторые распространенные типы фильтров шлюза:
Тип фильтра | эффект фильтра |
---|---|
Предварительные фильтры | AddRequestHeader: добавить заголовок запроса. |
AddRequestParameter: добавьте параметры запроса. | |
ModifyRequestBody: Измените тело запроса. | |
Фильтры маршрутов | AddResponseHeader: добавить заголовок ответа. |
AddResponseParameter: добавьте параметры ответа. | |
Hystrix: встроенный автоматический выключатель Hystrix для обеспечения отказоустойчивости при обслуживании. | |
Пост-фильтры | SetStatus: установите код состояния ответа. |
ModifyResponseBody: Измените тело ответа. | |
Фильтры ошибок | SendError: Операция при возникновении ошибки при обработке запроса. |
ExceptionHandler: пользовательская обработка исключений. | |
Глобальные фильтры | GlobalFilter: глобальный фильтр, применимый ко всем маршрутам. |
Ordered: установите порядок фильтра. | |
Пользовательские фильтры | Пользовательская реализация интерфейса GatewayFilter. Разработчики могут создавать собственные фильтры, реализуя этот интерфейс. |
Эти фильтры можно комбинировать и настраивать по мере необходимости, что позволяет разработчикам реализовывать в Gateway различную сложную логику обработки запросов и ответов. Путем правильной настройки фильтров можно реализовать такие функции, как ведение журнала, аутентификация и авторизация, повтор запроса и автоматические выключатели, чтобы повысить гибкость и масштабируемость шлюза.
Приведем пример:
server:
port: 8090
spring:
application:
name: springcloud-gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true # Включить автоматическую маршрутизацию
routes:
- id: gateway-service
uri: lb://target
predicates:
- Path=/gateway/**
filters:
- StripPrefix=1
- AddRequestHeader=test_header, damon0806
Как вы можете видеть здесь, мы настроили фильтры по маршрутам (маршрутизация шлюза).
Напишите класс запуска Springcloud-gateway, чтобы запустить службу шлюза, чтобы она могла начать прослушивать и пересылать запросы.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringcloudGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudGatewayApplication.class, args);
}
}
Вы можете использовать инструменты тестирования интерфейса, такие как Postman, для отправки запросов, чтобы проверить, может ли шлюз правильно перенаправить запрос в соответствующую микрослужбу и реализована ли фабрика утверждений или фильтр.
Шлюз Шлюз играет ключевую роль в качестве точки входа в микросервисную архитектуру.
Его роль в основном выражается в следующих аспектах:
точка действия | Подробное описание |
---|---|
Маршрутизация | Шлюз может направить запрос к соответствующему экземпляру микросервиса в соответствии с путем запроса. Процесс вызова службы упрощен, поэтому клиенту не нужно напрямую обращать внимание на расположение и детали каждого микросервиса. |
Балансировка нагрузки | Шлюз поддерживает балансировку нагрузки, которая позволяет равномерно распределять запросы к нескольким экземплярам микросервиса для повышения доступности и производительности системы. Это эффективно позволяет избежать перегрузки одного экземпляра службы и повышает стабильность всей системы. |
Фильтрация | Шлюз может обрабатывать запросы и ответы с помощью фильтров, таких как добавление и изменение заголовков запросов, ведение журнала, аутентификация, аутентификация и другие операции. Унифицированная обработка логики, связанной с безопасностью, журналами, производительностью и т. д., упрощает обслуживание и управление системой. |
Автоматический выключатель | Шлюз поддерживает механизм автоматического выключателя. В случае сбоя или истечения времени ожидания микросервиса он может автоматически переключиться на резервную службу, чтобы предотвратить передачу сбоев в нисходящий поток. Это повышает отказоустойчивость системы и снижает риск нестабильности всей системы из-за сбоя одного сервиса. |
Унифицированная обработка исключений (Exception Handling) | Шлюз может единообразно обрабатывать исключения в микросервисах и предоставлять удобные подсказки об ошибках, чтобы предотвратить утечку сведений клиенту. Улучшена безопасность системы и удобство работы пользователей, а также снижено негативное влияние отклонений. |
Трансформация протокола | Шлюз поддерживает преобразование протоколов и может преобразовывать внешние запросы в протоколы, необходимые внутренним микрослужбам. Уменьшает связь между микросервисами и обеспечивает связь с использованием разных протоколов. |
Gateway берет на себя ответственность за централизованную обработку, управление и защиту сервисов в микросервисной архитектуре. Предоставляя унифицированный механизм входа и обработки, микросервисная система становится более стабильной, гибкой и простой в обслуживании.
Ниже приведен пример внешнего Ajax, вызывающего службу шлюза:
Внешний код JavaScript:
$.ajax({
type: "POST",
url: "http://localhost:8090/gateway/getUserList",
data: {},
dataType: 'json'
});
Конфигурация шлюза следующая:
server:
port: 8090
spring:
application:
name: springcloud-gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true # Включить автоматическую маршрутизацию
routes:
- id: gateway-service
uri: lb://target
predicates:
- Path=/gateway/**
filters:
- StripPrefix=1
- AddRequestHeader=test_header, damon0806
Когда мы выполняем вышеуказанный запрос Ajax, запрос будет перенаправлен шлюзом на lb://target/getUserList.
Являясь ключевым компонентом микросервисной архитектуры, шлюз берет на себя множество важных задач и обеспечивает эффективный и надежный доступ к сервисам для всей системы. Ниже приводится краткое описание шлюза:
Основные моменты | Основные моменты Подробнее |
---|---|
единый вход | Шлюз шлюза обеспечивает единый вход для микрослужб. Взаимодействуя со шлюзом, клиенту не требуется прямой доступ к каждому микросервису, что упрощает вызов службы. |
Маршрутизация и балансировка нагрузки | Шлюз может динамически пересылать запросы к различным экземплярам микросервисов на основе правил маршрутизации и поддерживает балансировку нагрузки, повышая доступность и производительность системы. |
Фильтры и перехваты | С помощью фильтров шлюз может выполнять ряд операций, таких как аутентификация, аутентификация, ведение журнала и т. д., когда запрос поступает на шлюз или ответ покидает шлюз, что повышает безопасность и удобство обслуживания системы. |
Автоматический выключатель и обработка исключений | Шлюз поддерживает механизм автоматического выключателя, который может обрабатывать нештатные ситуации микросервисов и избегать распространения ошибок. Унифицированный механизм обработки исключений повышает стабильность системы и удобство работы с пользователем. |
Преобразование протоколов и прозрачность | Шлюз позволяет преобразовывать протоколы и обеспечивает прозрачный механизм связи для микросервисов. Это позволяет использовать разные протоколы связи между микросервисами, повышая гибкость системы. |
Централизованное управление | Шлюз предоставляет возможность централизованного управления микросервисами. Он может настраивать и управлять правилами маршрутизации и фильтрами для всех микросервисов в одном месте, что снижает затраты на обслуживание системы. |
Мониторинг производительности и протоколирование | Gateway может помочь разработчикам лучше понять рабочее состояние системы за счет интеграции инструментов мониторинга производительности и записи подробных журналов, что облегчает оптимизацию производительности и устранение неполадок. |
Подводя итог, можно сказать, что шлюз играет незаменимую роль в архитектуре микросервисов. Благодаря централизованному управлению, интеллектуальной маршрутизации и мощному механизму фильтрации он обеспечивает надежную поддержку для создания эффективной и масштабируемой системы микросервисов. Его преимущество заключается в том, что он упрощает разработку, улучшает удобство обслуживания системы и предоставляет элегантное решение при работе со сложной микросервисной архитектурой.