SpringCloud Gateway — оптимизация производительности с несколькими маршрутизациями
SpringCloud Gateway — оптимизация производительности с несколькими маршрутизациями
Обзор
Поскольку шлюзы являются общедоступными услугами и должны справляться с последующим непрерывным ростом, влияние количества маршрутов на производительность нельзя игнорировать.
Тестирование производительности
Процесс тестирования
Параметры измерения давления
запросы 20 Вт
1000 потоков
сопоставление маршрутов
Элемент конфигурации одного маршрута: настройте только 5 полностью совпадающих маршрутов.
Несколько элементов конфигурации маршрутизации: прежде чем сопоставление будет успешным, существует 1000 несовпадающих маршрутов.
Результаты испытаний
1. Количество запросов в секунду
Совпало 5 маршрутов:
5 маршрутов совпадают
1000 совпадений маршрута:
1000 матчей по маршруту
2. Использование ресурсов
1. CPU
2. GC
2. STW
в заключение
Количество совпадений маршрутов сильно влияет на QPS.
Влияние на ЦП, сборщик мусора и STW также велико.
Место проблемы
1. Сравнение производительности
5 маршрутов (хорошая производительность)
Как видно из рисунка ниже, общее распределение времени ЦП относительно нормальное, три части времени относительно равномерны, и все они потребляются такими компонентами, как сеть и React, поэтому общая нагрузка ЦП находится в относительно здоровое состояние.
1000 маршрутов (плохая производительность)
Как видно из рисунка ниже, очевидно, что загрузка ЦП в Части 1 ненормально пропорциональна всей пропорции, поэтому основная проблема с производительностью связана с Частью 1.
два、Место проблемы
Из рисунка видно, что место с высокой загрузкой ЦП происходит из org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory$1.test.
HostRoutePredicateFactory используется для проверки соответствия имени домена
Построенные 1000 тестовых маршрутов и URL-адреса запросов не совпадают из-за несогласованных доменных имен. Здесь показатели производительности соответствуют построенной тестовой модели.
Оптимизация производительности
Причина проблемы
Каждый запрос будет проходить через цепочку маршрутов, а временная сложность равна O(n). Поскольку шлюз продолжает использоваться, маршрут будет продолжать увеличиваться. Таким образом, производительность будет продолжать снижаться.
решение
Идея: Самая интуитивная идея — кэшировать маршрут, и доменное имя оказывается наиболее подходящим измерением.
Причины, по которым доменные имена подходят для кэширования измерений:
Прежде всего, доменное имя стабильно и не изменится при изменении пути запроса.
Во-вторых, Маршруты под доменным именем не будут расти бесконечно, а обычно их количество ограничено.
Решите результат
Модификация кода
Расширьте функциональность шлюза за счет следующих двух аспектов
Загрузка маршрута
В процессе загрузки анализируется элемент конфигурации Host Маршрута.
При использовании хоста в качестве ключа связанный список маршрутов является наиболее ценным, а маршрут кэшируется на основе измерения доменного имени.
Маршрутизация
Измените селектор маршрута SpringCloudGateway.
Запрошенный хост точно соответствует цепочке маршрутов, и операция маршрутизации выполняется.
Оптимизированный стресс-тест HTTP на 1000 маршрутах.
Видно, что для тех же 1000 маршрутов QPS и время ответа пришли в норму.
Использование org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory$1.test здесь уже очень мало, и программа возвращается в нормальное состояние.
Если вы решили свою проблему, вы можете нажать звездочку на Github. В Github есть и другие платформы с открытым исходным кодом. Заинтересованные студенты могут использовать их и задавать вопросы.