Использование шлюза SpringCloud-Gateway
Использование шлюза SpringCloud-Gateway

В этой статье рассказывается, как представить шлюз Gateway в проекте SpringCloud и выполнить вызов службы шлюза. Шлюз Шлюз — это ключевой компонент, который управляет входом и маршрутизацией в микросервисной архитектуре. Он отвечает за обработку клиентских запросов, принятие решений о маршрутизации и пересылку запросов соответствующим микросервисам. Шлюз также может реализовывать балансировку нагрузки, аутентификацию безопасности, ведение журнала и другие функции, централизованно управлять связью между службами и повышать удобство обслуживания и безопасность всей системы. С помощью шлюза можно создать унифицированную точку доступа, упрощая взаимодействие между клиентом и серверными микросервисами и обеспечивая более гибкое управление и мониторинг трафика.


один、Знакомство со шлюзом

Gateway — это служба шлюза API на основе Spring Cloud. Он обеспечивает маршрутизацию, фильтрацию, мониторинг, ведение журнала и другие функции и используется для единообразного управления и пересылки трафика запросов микросервисов. В качестве точки входа в микросервисную архитектуру шлюз может реализовывать такие функции, как балансировка нагрузки, безопасная аутентификация и пересылка запросов, что повышает безопасность, доступность и удобство обслуживания системы.

Роль шлюза:

  • Выполнять аутентификацию личности и проверку полномочий по запросам пользователей.
  • Направляйте запросы пользователей к микросервисам и обеспечивайте балансировку нагрузки
  • Ограничьте запросы пользователей

Схематическая диаграмма структуры проекта, включая шлюз:

001 10 - Использование шлюза SpringCloud-Gateway
001 10 - Использование шлюза SpringCloud-Gateway

2. Создайте шлюзовой шлюз

Создание шлюза требует следующих шагов:

1. Создайте модуль шлюза.

Нам нужно создать новый Spring в среде разработки. Загрузочный проект. не будет созданиз Вы можете обратиться к моему предыдущемуизстатья:SpringCloud-Создать многомодульный проект

В проекте SpringCloud мы создаем модуль Gateway, который я назвал Springcloud-gateway.


2. Введение зависимости SpringCloud-Gateway

Добавьте зависимость Spring Cloud Gateway в файл pom.xml проекта Springcloud-gateway. ​

Язык кода:xml
копировать
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

3. Настройте правила маршрутизации.

Отредактируйте файл applicatin.yml, чтобы настроить правила маршрутизации шлюза, включая определение путей маршрутизации, целевых служб и другой информации.

Язык кода:yaml
копировать
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 при пересылке запросов. Концепции фабрик утверждений и фильтров подробно объясняются ниже.


4. Добавьте утверждения

В 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.

Вот пример:

Язык кода:yaml
копировать
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。


5. Добавьте фильтры

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

Тип фильтра

эффект фильтра

Предварительные фильтры

AddRequestHeader: добавить заголовок запроса.

AddRequestParameter: добавьте параметры запроса.

ModifyRequestBody: Измените тело запроса.

Фильтры маршрутов

AddResponseHeader: добавить заголовок ответа.

AddResponseParameter: добавьте параметры ответа.

Hystrix: встроенный автоматический выключатель Hystrix для обеспечения отказоустойчивости при обслуживании.

Пост-фильтры

SetStatus: установите код состояния ответа.

ModifyResponseBody: Измените тело ответа.

Фильтры ошибок

SendError: Операция при возникновении ошибки при обработке запроса.

ExceptionHandler: пользовательская обработка исключений.

Глобальные фильтры

GlobalFilter: глобальный фильтр, применимый ко всем маршрутам.

Ordered: установите порядок фильтра.

Пользовательские фильтры

Пользовательская реализация интерфейса GatewayFilter. Разработчики могут создавать собственные фильтры, реализуя этот интерфейс.

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

Приведем пример:

Язык кода:yaml
копировать
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

Как вы можете видеть здесь, мы настроили фильтры по маршрутам (маршрутизация шлюза).

  • StripPrefix=1: указывает количество префиксов, которые необходимо удалить из запрошенного URI. Здесь 1 означает удаление префикса двухуровневого пути. Например, если исходный запрос — /path1/rest-of-the-uri, при такой конфигурации URI запроса, пересылаемый на серверную часть, будет /rest-of-the-uri.
  • AddRequestHeader=test_header, damon0806: указывает на добавление пользовательского заголовка в заголовок запроса. В частности, он добавляет заголовок test_header со значением damon0806. Это можно использовать для передачи дополнительной информации или идентификации при отправке запроса во внутреннюю службу.

6. Запустите службу шлюза.

Напишите класс запуска Springcloud-gateway, чтобы запустить службу шлюза, чтобы она могла начать прослушивать и пересылать запросы.

Язык кода:java
копировать
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);
	}
}

7. Тестовая маршрутизация

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


3. Роль шлюза

Шлюз Шлюз играет ключевую роль в качестве точки входа в микросервисную архитектуру.

Его роль в основном выражается в следующих аспектах:

точка действия

Подробное описание

Маршрутизация

Шлюз может направить запрос к соответствующему экземпляру микросервиса в соответствии с путем запроса. Процесс вызова службы упрощен, поэтому клиенту не нужно напрямую обращать внимание на расположение и детали каждого микросервиса.

Балансировка нагрузки

Шлюз поддерживает балансировку нагрузки, которая позволяет равномерно распределять запросы к нескольким экземплярам микросервиса для повышения доступности и производительности системы. Это эффективно позволяет избежать перегрузки одного экземпляра службы и повышает стабильность всей системы.

Фильтрация

Шлюз может обрабатывать запросы и ответы с помощью фильтров, таких как добавление и изменение заголовков запросов, ведение журнала, аутентификация, аутентификация и другие операции. Унифицированная обработка логики, связанной с безопасностью, журналами, производительностью и т. д., упрощает обслуживание и управление системой.

Автоматический выключатель

Шлюз поддерживает механизм автоматического выключателя. В случае сбоя или истечения времени ожидания микросервиса он может автоматически переключиться на резервную службу, чтобы предотвратить передачу сбоев в нисходящий поток. Это повышает отказоустойчивость системы и снижает риск нестабильности всей системы из-за сбоя одного сервиса.

Унифицированная обработка исключений (Exception Handling)

Шлюз может единообразно обрабатывать исключения в микросервисах и предоставлять удобные подсказки об ошибках, чтобы предотвратить утечку сведений клиенту. Улучшена безопасность системы и удобство работы пользователей, а также снижено негативное влияние отклонений.

Трансформация протокола

Шлюз поддерживает преобразование протоколов и может преобразовывать внешние запросы в протоколы, необходимые внутренним микрослужбам. Уменьшает связь между микросервисами и обеспечивает связь с использованием разных протоколов.

Gateway берет на себя ответственность за централизованную обработку, управление и защиту сервисов в микросервисной архитектуре. Предоставляя унифицированный механизм входа и обработки, микросервисная система становится более стабильной, гибкой и простой в обслуживании.


4. Вызов службы шлюза

Ниже приведен пример внешнего Ajax, вызывающего службу шлюза:

Внешний код JavaScript:

Язык кода:javascript
копировать
$.ajax({
    type: "POST",
    url: "http://localhost:8090/gateway/getUserList",
    data: {},
    dataType: 'json'
});

Конфигурация шлюза следующая:

Язык кода:yaml
копировать
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.


5. Краткое описание шлюза

Являясь ключевым компонентом микросервисной архитектуры, шлюз берет на себя множество важных задач и обеспечивает эффективный и надежный доступ к сервисам для всей системы. Ниже приводится краткое описание шлюза:

Основные моменты

Основные моменты Подробнее

единый вход

Шлюз шлюза обеспечивает единый вход для микрослужб. Взаимодействуя со шлюзом, клиенту не требуется прямой доступ к каждому микросервису, что упрощает вызов службы.

Маршрутизация и балансировка нагрузки

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

Фильтры и перехваты

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

Автоматический выключатель и обработка исключений

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

Преобразование протоколов и прозрачность

Шлюз позволяет преобразовывать протоколы и обеспечивает прозрачный механизм связи для микросервисов. Это позволяет использовать разные протоколы связи между микросервисами, повышая гибкость системы.

Централизованное управление

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

Мониторинг производительности и протоколирование

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

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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose