Эта статья относится к сайтам, созданным с помощью среды Spring Boot, с использованием Apache Maven в качестве инструмента сборки. Чтобы продемонстрировать, как работают профили, мы рассмотрим пример использования Google Analytics и Диспетчера тегов Google для отслеживания показателей сайта. Я использую этот метод для своего веб-сайта Initial Commit , который построен с использованием Spring Boot, механизма шаблонов Thymeleaf и размещен на AWS Elastic Beanstalk.
Что такое профили загрузки Spring?
Один из основных принципов дизайна Spring Boot заключается в том, что он поощряет соглашение, а не конфигурацию. Это означает, что в подавляющем большинстве конфигураций приложений используются разумные значения по умолчанию, которые при необходимости можно переопределить, но в целом приложение Spring Boot будет работать из коробки без необходимости настраивать конфигурацию.
Однако обычно требуется некоторая настройка, и часто нам нужна настройка для конкретной среды. Вот здесь и пригодятся профили. Профиль в Spring Boot можно рассматривать как контекст, который определяет определенный набор настроек, переменных и поведения приложения. Каждый раз при создании приложения разработчик может указать, какой профиль использовать. Если профиль не указан, будет использоваться значение по умолчанию.
В этой статье мы создадим профиль DEV и профиль PROD, чтобы активировать свойства конфигурации, зависящие от среды.
Мы можем легко определить профили, добавив следующий XML- pom.xml
файл
проекта pom.xml:
<profiles>
<profile>
<id>dev</id>
<properties>
<activatedProperties>dev</activatedProperties>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<activatedProperties>prod</activatedProperties>
</properties>
</profile>
</profiles>
Обратите внимание на <activeByDefault>true</activeByDefault>
, который
означает, что профиль разработки будет использоваться по умолчанию, если
во время сборки профиль не указан.
Профили работают вместе с файлами свойств Spring Boot. По умолчанию
Spring Boot анализирует файл с именем application.properties
расположенный в src/main/resources
для определения информации о
конфигурации.
Наша первая задача будет заключаться в добавлении параметра в этот файл,
который сообщит Spring использовать другой файл свойств, зависящий от
среды, соответствующий активному профилю (то есть профилю, с которым в
настоящее время выполняется приложение). Мы можем сделать это, добавив в
файл application.properties
[email protected] @
Теперь нам нужно создать два новых файла свойств для конкретной среды
(по тому же пути, что и существующий application.properties
), один
для использования профилем DEV, а другой - профилем PROD. Эти файлы
должны быть названы следующим образом:
application-dev.properties
application-prod.properties
В каждом из этих файлов можно определить свойства, которые будут применяться только тогда, когда соответствующий профиль активен.
Чтобы прояснить эту концепцию, давайте рассмотрим реальный пример, включающий конфигурацию Google Analytics и Google Tag Manager на сайте Spring Boot, который я подробно рассмотрю в следующих нескольких разделах.
Обзор Google Analytics и Google Tag Manager
Если вы веб-разработчик с активным сайтом, неплохо было бы использовать платформу Google для своей аналитики, отслеживания событий, отслеживания переходов и статистики ранжирования в поисковых системах.
Эти услуги предоставляют следующие бесплатные инструменты Google:
- Гугл Аналитика
- Диспетчер тегов Google
- Консоль поиска Google
Google Analytics подключается к вашему домену и отслеживает широкий спектр статистических данных, включая просмотры страниц, информацию о сеансах, местоположение аудитории и триггеры событий в историческом контексте и в реальном времени.
Диспетчер тегов Google интегрируется с Google Analytics и позволяет разработчикам определять события, отслеживаемые Google Analytics. Это делается путем определения слушателей Диспетчера тегов, которые связываются с определенными элементами HTML на вашем веб-сайте, которые ждут определенных событий (например, щелчка или прокрутки). Когда пользователь сайта выполняет событие, происходит вызов Google Analytics, который регистрирует событие.
Консоль поиска Google предоставляет информацию о том, как Google сканирует ваш сайт, сколько сайтов ссылается на ваш сайт и где ваш сайт занимает место на основе поисковых ключевых слов.
Если вы использовали эти инструменты раньше, вы знаете, что для привязки вашего веб-сайта к вашей учетной записи Google Analytics Google предоставляет идентификатор отслеживания в следующем формате:
UA-123456789-1
Этот идентификатор отслеживания внедряется на ваш сайт с помощью фрагмента кода HTML, предоставленного Google:
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-123456789-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', ‘UA-123456789-1');
</script>
Аналогичным образом Диспетчер тегов Google предоставляет идентификатор GTM в следующем формате:
GTM-ABCDEF1
Это также необходимо встроить в ваш сайт с помощью фрагмента кода HTML:
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-ABCDEF1');</script>
<!-- End Google Tag Manager -->
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-ABCDEF1"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
Настройка идентификаторов отслеживания с профилями
Теперь это все хорошо - пользователи, которые взаимодействуют с сайтом, будут запускать данные для входа в связанную учетную запись Google Analytics. Однако, поскольку идентификаторы отслеживания жестко запрограммированы в HTML-страницы, данные будут отслеживаться, даже когда разработчики и тестировщики загружают эти страницы в разрабатываемые и тестовые версии сайта. Это исказит данные и приведет к завышению фактической статистики сайта.
Чтобы решить эту проблему, мы можем установить фиктивные значения для идентификаторов отслеживания в профиле разработки, чтобы никакие данные не регистрировались в Google при доступе к страницам сайта в более низких средах.
Профиль DEV будет определять фиктивные значения для идентификаторов отслеживания Google Analytics и Диспетчера тегов, а профиль PROD будет использовать реальные значения. Затем мы заменим жестко заданные значения в шаблонах HTML на динамическое значение свойства.
В файле свойств DEV, application-dev.properties
, мы можем добавить
фиктивные значения для идентификаторов отслеживания Google Analytics и
Диспетчера тегов следующим образом:
googleanalyticsid=UA-XXXXXXXXXX-1
googletagmanagerid=GTM-XXXXXX1
В файле свойств PROD, application-prod.properties
, мы можем добавить
фактические значения для идентификаторов отслеживания Google Analytics и
Диспетчера тегов:
googleanalyticsid=UA-123456789-1
googletagmanagerid=GTM-ABCDEF1
Последний шаг - заменить жестко закодированную ссылку на идентификаторы отслеживания в шаблонах HTML. Используя механизм шаблонов Thymeleaf, это можно сделать, заменив жестко заданный идентификатор отслеживания Google Analytics на:
${@environment.getProperty('googleanalyticsid')}
и идентификатор отслеживания Диспетчера тегов Google с:
${@environment.getProperty('googletagmanagerid')}
Конечным результатом является то, что фрагменты кода, предоставленные Google, теперь выглядят следующим образом (обратите внимание, что из-за вложенных кавычек двойные квадратные скобки добавлены вокруг переменной):
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async th:src="'https://www.googletagmanager.com/gtag/js?id=' + ${@environment.getProperty('googleanalyticsid')}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', "[[${@environment.getProperty('googleanalyticsid')}]]");
</script>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer',"[[${@environment.getProperty('googletagmanagerid')}]]");</script>
<!-- End Google Tag Manager -->
<!-- Google Tag Manager (noscript) -->
<noscript><iframe th:src="'https://www.googletagmanager.com/ns.html?id=' + ${@environment.getProperty('googletagmanagerid')}"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
Это оно! Теперь всякий раз, когда приложение создается и запускается без указания профиля - например, из среды IDE, такой как Spring Tool Suite, Eclipse или IntelliJ, - профиль DEV будет выбран по умолчанию, а фиктивные значения будут заменены на Google идентификаторы отслеживания. Это предотвратит загрузку страниц и инициированные событиями запись данных в платформу Google.
Указание профиля во время сборки
При создании приложения для производства нам необходимо указать профиль PROD, который будет использоваться, чтобы использовались реальные значения идентификатора отслеживания. Вот как это делается с помощью Maven в качестве инструмента сборки:
$ mvn -Pprod clean install
Ключом к этой команде является -P
, который используется для указания
профиля, который будет использоваться для сборки.
Если мы хотим установить профиль после создания кода, мы можем использовать аргумент Java VM при запуске приложения. Это делается следующим образом:
$ java –jar -Dspring.profiles.active=prod app.jar
В качестве альтернативы профиль можно напрямую указать в
application.properties
, добавив строку:
spring.profiles.active=prod
В каждом случае мы указываем prod
в качестве активного профиля, что
приводит application-prod.properties
для целей конфигурации. Поскольку
этот файл содержит реальные значения идентификаторов отслеживания, они
будут вставлены в шаблоны в производственной сборке, и пользовательские
события будут успешно отслеживаться на платформе Google.
об авторе
Эта статья была написана Якобом Стопаком, консультантом по программному обеспечению и разработчиком, стремящимся помочь другим улучшить свою жизнь с помощью кода. Джейкоб является создателем Initial Commit - сайта, посвященного тому, чтобы помочь любознательным разработчикам узнать, как написаны их любимые программы. Его избранный проект помогает людям изучать Git на уровне кода.