Приложения Spring и Angular в Azure (серия из 7 частей)
Это сообщение в блоге является частью серии “развертывание приложения Spring Boot и Angular в Azure”, вот полный список сообщений:
- Создание приложения Spring Boot и Angular для Azure (1/7)
- Создание и настройка веб-приложения Azure и MySQL для размещения приложения Spring Boot (2/7)
- Использование конвейеров Azure для создания, тестирования и развертывания приложений Spring Boot и Angular (3/7)
- Использование Azure Application Insights с Spring Boot (4/7)
- Использование Azure Application Insights с Angular (5/7)
- Настройка Azure CDN для повышения производительности Angular (6/7)
- Настройка кэша Azure Redis для повышения производительности быстрой загрузки (7/7)
Ссылки будут обновляться после каждой публикации поста.
Проблемы с производительностью нашего приложения Angular
Наше текущее приложение Angular работает очень хорошо, фактически его производственная сборка даже получает идеальную оценку “100” при тестировании с помощью инструментов аудита Chrome. Команда Hipster усердно работала над тем, чтобы предоставить вам наилучшее приложение, но мы все еще можем сделать его лучше!
Поскольку мы сгенерировали все в одном проекте, весь код на стороне клиента обслуживается Spring Boot. Это одна из критических замечаний, которые мы часто слышим о проектах “полного стека”, обычно создаваемых JHipster, людьми, которые не присматривались к тому, как это должно быть размещено.
Прежде всего, это прекрасно работает для небольших проектов, а также является более экономичным, поскольку нет других сопутствующих затрат.
Во-вторых, это можно улучшить, добавив поддержку HTTP/2: по умолчанию в JHipster она отключена, но есть свойство jhipster.http.version
, которое можно настроить на использование HTTP/2. Это решение только для JHipster, поэтому, если вы используете Spring Boot напрямую, вам придется выполнить небольшую ручную настройку.
И последнее, но не менее важное: лучшим решением здесь является использование сети доставки контента (CDN), поскольку:
- Он обеспечит поддержку HTTP/2 “из коробки”
- Это позволит локализовать ресурсы ближе к вашим пользователям, что приведет к повышению их производительности
Лазурный CDN
Мы собираемся использовать Azure CDN в этом посте, так как он полностью интегрирован с веб-приложением Azure и очень прост в использовании.
С точки зрения цен, это один из самых дешевых на рынке, и он стоит менее 30 долларов в месяц. Еще раз, если вы экономите на бюджете, не используйте CDN с самого начала: “обычное” приложение Spring Boot + Angular (например, созданное JHipster) действительно хорошо работает из коробки. Что важно, так это возможность масштабирования позже и добавления CDN при необходимости.
Условия для правильного использования CDN
CDN будет кэшировать все ресурсы: это означает, что после нескольких запросов к вашим серверам все запросы будут обслуживаться непосредственно из CDN и получат от этого выгоду. Это означает, что ваше приложение должно быть специально закодировано, чтобы хорошо работать с кэшем:
- Статические ресурсы должны иметь хэш в своем названии, поэтому при выпуске новой версии клиентские браузеры будут получать новый контент.
- Правильные HTTP-заголовки должны быть отправлены с сервера, поэтому кэшируется только нужное содержимое.
- При выполнении HTTP-вызовов в наш сервер Spring Boot запросы не должны проходить через CDN.
Эти три условия обычно выполняются в приложениях Angular, поскольку эти лучшие практики теперь хорошо известны в сообществе. Конечно, Хипстер внимательно следил за ними, поэтому, когда вы делаете “производственную” сборку с помощью JHipster:
- Все активы будут минимизированы и будут иметь определенный хэш в своем названии.
- Spring Boot отправит правильные HTTP-заголовки.
- В сборке Webpack есть параметр
SERVER_API_URL
, указывающий на конкретный сервер API.
Соображения CORS
Поскольку наш контент не будет обслуживаться тем же сервером, что и наши данные, у него должна быть проблема CORS (совместное использование ресурсов разных источников). Это означает, что по умолчанию ваш сервер API не будет отвечать на запросы, поступающие из другого домена: это хорошо для вашего сервера API (в противном случае им могли бы воспользоваться другие люди), но самое главное для ваших пользователей (так как это открывает двери для многих атак).
С Spring Boot у вас есть эта защита по умолчанию. Hipster предоставляет простой в использовании механизм настройки поверх него, но это просто упрощает то, что предоставляет Spring Boot.
В производстве вы должны разрешить только свое приложение Angular в параметре разрешено-происхождение
ниже – мы используем *
, и, таким образом, принимать запросы из любого места, здесь, так как это проще для тестов:
jhipster: cors: allowed-origins: '*' allowed-methods: '*' allowed-headers: '*' exposed-headers: 'Authorization,Link,X-Total-Count' allow-credentials: true max-age: 1800
Настройка CDN Azure
В своем веб-приложении Azure выберите “Сеть”, а затем “Azure CDN”.
Затем вы можете создать новую конечную точку CDN, которая будет работать поверх существующего веб-приложения Azure. Конечно, вы также должны настроить свой DNS-сервер так, чтобы он указывал на этот CDN, чтобы ваши пользователи использовали здесь ваше собственное доменное имя.
Это все, что нужно сделать, теперь вы можете проверить, что все работает нормально:
- Используя свой браузер, вы можете проверить, что теперь вы используете HTTP/2 для доступа к своему веб-приложению. Проведение аудита Chrome также должно показать, что теперь вы уважаете эту передовую практику.
- Если вы используете JHipster, вы можете получить доступ к экрану “Показатели”, который позволяет отслеживать количество HTTP-запросов, отправленных на ваш сервер. Вы можете выполнить некоторую “принудительную перезагрузку” приложения, используя как CDN, так и веб-приложение напрямую: при использовании CDN в ваше приложение должно поступать меньше HTTP-запросов.
Изменения, внесенные в наше приложение для этого поста в блоге, все доступны в этом коммите .
Приложения Spring и Angular в Azure (серия из 7 частей)
Оригинал: “https://dev.to/azure/configuring-azure-cdn-to-boost-angular-performance-6-7-5ebe”