Perfiles Spring Boot para entornos DEV y PROD

Este artículo se aplica a los sitios creados con el marco Spring Boot, utilizando Apache Maven como herramienta de compilación. Para demostrar cómo funcionan los perfiles, vis...

Este artículo se aplica a los sitios creados con el marco Spring Boot, utilizando Apache Maven como herramienta de compilación. Para demostrar cómo funcionan los perfiles, visitaremos un ejemplo usando Google Analytics y Google Tag Manager para rastrear las métricas del sitio. Utilizo este método para mi sitio web, Compromiso inicial, que está construido con Spring Boot, el motor de plantillas de Thymeleaf, y está alojado en AWS Elastic Beanstalk.

¿Qué son los perfiles Spring Boot? {#lo que son perfiles de arranque de primavera}

Uno de los principios básicos de diseño detrás de Spring Boot es que fomenta la convención sobre la configuración. Esto significa que la gran mayoría de las configuraciones de la aplicación utilizan valores predeterminados sensibles que se pueden anular cuando sea necesario, pero en general, una aplicación Spring Boot funcionará sin necesidad de una configuración personalizada.

Sin embargo, por lo general es necesaria cierta personalización y, a menudo, necesitamos una personalización específica del entorno. Aquí es donde los perfiles son útiles. Un perfil en Spring Boot se puede considerar como un contexto que define un conjunto específico de configuraciones, variables y comportamientos de la aplicación. Cada vez que se crea la aplicación, el desarrollador puede especificar qué perfil usar. Si no se especifica ningún perfil, se utilizará el predeterminado.

En este artículo, crearemos un perfil DEV y un perfil PROD para habilitar las propiedades de configuración específicas del entorno.

Podemos definir fácilmente los perfiles agregando el siguiente XML al archivo pom.xml del proyecto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
    <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>

Tenga en cuenta la etiqueta <activeByDefault>true</activeByDefault>, lo que significa que el perfil de desarrollo se utilizará de forma predeterminada, suponiendo que no se especifique ningún perfil en el momento de la compilación.

Los perfiles funcionan junto con los archivos de propiedades de Spring Boot. De forma predeterminada, Spring Boot analiza un archivo llamado application.properties, ubicado en el directorio src/main/resources, para identificar la información de configuración.

Nuestra primera tarea será agregar un parámetro en ese archivo que le indicará a Spring que use un archivo de propiedades específico del entorno diferente correspondiente al perfil activo (es decir, el perfil con el que se ejecuta actualmente la aplicación). Podemos hacer esto agregando lo siguiente al archivo application.properties:

1
[correo electrónico protegido]@

Ahora necesitamos crear los dos nuevos archivos de propiedades específicas del entorno (en la misma ruta que el archivo application.properties existente), uno para el perfil DEV y otro para el perfil PROD. Estos archivos deben tener el siguiente nombre:

  • aplicación-dev.properties
  • aplicación-producto.propiedades

Dentro de cada uno de estos archivos, se pueden definir propiedades que solo se aplicarán cuando el perfil correspondiente esté activo.

Para aclarar este concepto, consideremos un ejemplo del mundo real que involucre la configuración de Google Analytics y Google Tag Manager en un sitio de Spring Boot, que analizaré en detalle en las próximas secciones.

Descripción general de Google Analytics y Google Tag Manager

Si es un desarrollador web con un sitio activo, es una buena apuesta que utilice la plataforma de Google para sus análisis, seguimiento de eventos, seguimiento de conversiones y estadísticas de clasificación de motores de búsqueda.

Las siguientes herramientas gratuitas de Google brindan estos servicios:

  1. Google Analytics
  2. Administrador de etiquetas de Google
  3. Consola de búsqueda de Google

Google Analytics se vincula a su dominio y realiza un seguimiento de una amplia variedad de estadísticas, incluidas las visitas a la página, la información de la sesión, la ubicación de la audiencia y los activadores de eventos en contextos históricos y en tiempo real.

Google Tag Manager se integra con Google Analytics y permite a los desarrolladores definir los eventos que Google Analytics rastrea. Esto se hace definiendo oyentes de Tag Manager que se vinculan a elementos HTML específicos en su sitio web, que esperan que ocurran los eventos especificados (como un clic o un desplazamiento). Cuando un usuario del sitio ejecuta el evento, se realiza una llamada a Google Analytics, que registra el evento.

Google Search Console proporciona información sobre cómo Google rastrea su sitio, cuántos sitios enlazan con el suyo y dónde se clasifica su sitio según las palabras clave de búsqueda.

Si ha utilizado estas herramientas anteriormente, sabrá que para vincular su sitio web a su cuenta de Google Analytics, Google proporciona una ID de seguimiento en el siguiente formato:

1
UA-123456789-1

Este ID de seguimiento se incrusta en su sitio a través de un fragmento de código HTML proporcionado por Google:

1
2
3
4
5
6
7
8
9
<!-- 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>

De manera similar, Google Tag Manager proporciona una ID de GTM en el siguiente formato:

1
GTM-ABCDEF1

Esto también debe integrarse en su sitio a través de un fragmento de código HTML:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<!-- 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) -->

Configuración de ID de seguimiento con perfiles

Ahora, todo esto está muy bien: los usuarios que interactúan con el sitio activarán los datos para iniciar sesión en la cuenta de Google Analytics vinculada. Sin embargo, dado que los ID de seguimiento están codificados en las páginas HTML, los datos se rastrearán incluso cuando los desarrolladores y evaluadores carguen estas páginas en las versiones de desarrollo y prueba del sitio. Esto sesgará los datos e inflará las estadísticas reales del sitio.

Para resolver este problema, podemos configurar valores ficticios para los ID de seguimiento en el perfil de desarrollo para que no se registren datos en Google cuando se acceda a las páginas del sitio en los entornos inferiores.

El perfil DEV definirá valores ficticios para los ID de seguimiento de Google Analytics y Tag Manager, y el perfil PROD utilizará los valores reales. Luego reemplazaremos los valores codificados en las plantillas HTML con el valor de la propiedad dinámica.

En el archivo de propiedades DEV, application-dev.properties, podemos agregar los valores ficticios para los ID de seguimiento de Google Analytics y Tag Manager como este:

1
2
googleanalyticsid=UA-XXXXXXXXXX-1
googletagmanagerid=GTM-XXXXXX1

En el archivo de propiedades de PROD, application-prod.properties, podemos agregar los valores reales para los ID de seguimiento de Google Analytics y Tag Manager:

1
2
googleanalyticsid=UA-123456789-1
googletagmanagerid=GTM-ABCDEF1

El paso final es reemplazar la referencia codificada a los ID de seguimiento en las plantillas HTML. Usando el motor de plantilla hoja de tomillo, esto se puede hacer reemplazando el ID de seguimiento de Google Analytics codificado con:

1
${@environment.getProperty('googleanalyticsid')}

y el ID de seguimiento de Google Tag Manager con:

1
${@environment.getProperty('googletagmanagerid')}

El resultado final es que los fragmentos de código provistos por Google ahora se ven así (tenga en cuenta que debido a las comillas anidadas, se agregan corchetes dobles alrededor de la variable):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
    <!-- 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) -->

¡Eso es todo! Ahora, siempre que la aplicación se cree y ejecute sin especificar el perfil, por ejemplo, desde un IDE como Spring Tool Suite, Eclipse o IntelliJ, el perfil DEV se elegirá de forma predeterminada y los valores ficticios se sustituirán por los ID de seguimiento de Google. . Esto evitará que cualquier carga de página y eventos activados registren datos en la plataforma de Google.

Especificación del perfil en el momento de la compilación {#especificación del perfil en el momento de la compilación}

Al crear la aplicación para producción, debemos especificar el perfil PROD que se utilizará para que se utilicen los valores reales de ID de seguimiento. Así es como se hace esto usando Maven como herramienta de compilación:

1
$ mvn -Pprod clean install

La clave de este comando es el indicador -P, que se usa para especificar el perfil que se usará para la compilación.

Si queremos establecer el perfil después de compilar el código, podemos usar un argumento de Java VM en el inicio de la aplicación. Esto se hace de la siguiente manera:

1
$ java jar -Dspring.profiles.active=prod app.jar

Alternativamente, el perfil se puede especificar directamente en el archivo application.properties agregando la línea:

1
spring.profiles.active=prod

En cada caso, especificamos prod como el perfil activo, lo que hace que se elija el archivo application-prod.properties para fines de configuración. Dado que este archivo contiene los valores reales de los ID de seguimiento, estos se insertarán en las plantillas en la compilación de producción y los eventos de los usuarios se rastrearán correctamente en la plataforma de Google.

Sobre el autor

Este artículo fue escrito por Jacob Stopak, un consultor y desarrollador de software apasionado por ayudar a otros a mejorar sus vidas a través del código. Jacob es el creador de Compromiso inicial, un sitio dedicado a ayudar a los desarrolladores curiosos a aprender cómo se codifican sus programas favoritos. Su proyecto destacado ayuda a las personas a aprender git a nivel de código. go.