Compartir a través de


Tutorial: Conexión a un servidor de configuración administrado para Spring en Azure Container Apps

Config Server para Spring proporciona una ubicación centralizada para que los datos de configuración estén disponibles para varias aplicaciones. En este artículo, aprenderá a conectar una aplicación hospedada en Azure Container Apps a una instancia de Java Config Server para Spring.

El componente Config Server para Spring Java usa un repositorio de GitHub como origen para las opciones de configuración. Los valores de configuración están disponibles para la aplicación contenedora a través de un enlace entre el componente y la aplicación contenedora. A medida que cambian los valores en el servidor de configuración, fluyen automáticamente a la aplicación, todo ello sin necesidad de volver a compilar o volver a implementar la aplicación.

En este tutorial, aprenderá a:

  • Crear un componente de Config Server para Spring
  • Vincular Config Server para Spring a su aplicación contenedora
  • Observe los valores de configuración antes y después de conectar el servidor de configuración a la aplicación
  • Cifrado y descifrado de valores de configuración con una clave simétrica

Importante

En este tutorial se usan servicios que pueden afectar a la factura de Azure. Si decide seguir paso a paso, asegúrese de eliminar los recursos destacados en este artículo para evitar una facturación inesperada.

Requisitos previos

Consideraciones

Cuando se ejecute en Config Server para Spring en Azure Container Apps, tenga en cuenta los detalles siguientes:

Elemento Explicación
Ámbito Config Server para Spring se ejecuta en el mismo entorno que la aplicación contenedora conectada.
Escalado Para mantener un único origen de verdad, Config Server para Spring no se escala. Las propiedades de escalado minReplicas y maxReplicas se establecen en 1.
Recursos La asignación de recursos de contenedor para Config Server para Spring es fija, el número de núcleos de CPU es 0,5 y el tamaño de memoria es 1Gi.
Precios La facturación de Config Server para Spring se encuentra en precios basados en el consumo. Los recursos consumidos por los componentes de Java administrados se facturan a las tarifas activas o inactivas. Puede eliminar componentes que ya no estén en uso para detener la facturación.
Binding La aplicación contenedora se conecta a un Config Server para Spring a través de un enlace. El enlace inserta configuraciones en variables de entorno de aplicaciones contenedoras. Una vez establecido un enlace, la aplicación contenedora puede leer los valores de configuración de las variables de entorno.

Configurar

Antes de empezar a trabajar con Config Server para Spring, primero debe crear los recursos necesarios.

Ejecute los siguientes comandos para crear el grupo de recursos y el entorno de Container Apps.

  1. Cree variables para admitir la configuración de la aplicación. Estos valores se proporcionan para usted con fines de esta lección.

    export LOCATION=eastus
    export RESOURCE_GROUP=my-services-resource-group
    export ENVIRONMENT=my-environment
    export JAVA_COMPONENT_NAME=configserver
    export APP_NAME=my-config-client
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-service-config-client:latest"
    export URI="https://github.com/Azure-Samples/azure-spring-cloud-config-java-aca.git"
    
    Variable Descripción
    LOCATION Ubicación de la región de Azure donde se crea la aplicación de contenedor y el componente de Java.
    ENVIRONMENT El nombre del entorno de Azure Container Apps para la aplicación de demostración.
    RESOURCE_GROUP Nombre del grupo de recursos de Azure para la aplicación de demostración.
    JAVA_COMPONENT_NAME Nombre del componente de Java creado para la aplicación contenedora. En este caso, creará un componente Config Server para Spring Java.
    IMAGE Imagen de contenedor usada en la aplicación contenedora.
    URI Puede reemplazar el URI por la dirección URL del repositorio de Git, si es privada, agregar las configuraciones de autenticación relacionadas, como spring.cloud.config.server.git.username y spring.cloud.config.server.git.password.
  2. Inicio de sesión en Azure con la CLI de Azure.

    az login
    
  3. Cree un grupo de recursos.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Cree el entorno de aplicaciones de contenedor.

    az containerapp env create \
        --name $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION
    

Este entorno se usa para hospedar tanto el componente Config Server para Spring Java como la aplicación contenedora.

Crear el componente Config Server para Spring Java

Ahora que tiene un entorno de Container Apps, puede crear la aplicación de contenedor y enlazarla a un componente de Config Server para Spring Java. Al enlazar la aplicación contenedora, los valores de configuración se sincronizan automáticamente desde el componente Config Server a la aplicación.

  1. Crear el componente Config Server para Spring Java.

    az containerapp env java-component config-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
        --min-replicas 1 \
        --max-replicas 1 \
        --configuration spring.cloud.config.server.git.uri=$URI
    
  2. Actualizar el componente Config Server para Spring Java.

    az containerapp env java-component config-server-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
        --min-replicas 2 \
        --max-replicas 2 \
        --configuration spring.cloud.config.server.git.uri=$URI spring.cloud.config.server.git.refresh-rate=60
    

    Aquí, le indica al componente dónde encontrar el repositorio que contiene la información de configuración a través de la propiedad uri. La propiedad refresh-rate indica a Container Apps con qué frecuencia buscar cambios en el repositorio de Git.

Enlace de la aplicación contenedora al componente Config Server para Spring Java

  1. Cree la aplicación contenedora que consume datos de configuración.

    az containerapp create \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT \
        --image $IMAGE \
        --min-replicas 1 \
        --max-replicas 1 \
        --ingress external \
        --target-port 8080 \
        --query properties.configuration.ingress.fqdn
    

    Este comando devuelve la dirección URL de la aplicación contenedora que consume datos de configuración. Copie la dirección URL en un editor de texto para poder usarla en un paso siguiente.

    Si visita la aplicación en un explorador, el valor connectTimeout devuelto es el valor predeterminado de 0.

  2. Enlace a Config Server para Spring.

    Ahora que se han creado la aplicación contenedora y Config Server, las enlaza junto con el comando update a la aplicación contenedora.

    az containerapp update \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --bind $JAVA_COMPONENT_NAME
    

    El parámetro --bind $JAVA_COMPONENT_NAME crea el vínculo entre la aplicación contenedora y el componente de configuración.

Una vez enlazada la aplicación contenedora y el componente Config Server, los cambios de configuración se sincronizan automáticamente con la aplicación contenedora.

Cuando vuelva a visitar la dirección URL de la aplicación, el valor de connectTimeout es ahora 10000. Este valor procede del repositorio de Git establecido en la variable $URI establecida originalmente como origen del componente de configuración. En concreto, este valor se extrae de la propiedad connectionTimeout del archivo application.yml del repositorio.

La solicitud de enlace inserta el valor de configuración en la aplicación como variables de entorno. Estos valores ahora están disponibles para el código de la aplicación que se usará al capturar las opciones de configuración del servidor de configuración.

En este caso, las siguientes variables de entorno están disponibles en la aplicación:

SPRING_CLOUD_CONFIG_URI=http://[JAVA_COMPONENT_INTERNAL_FQDN]:80
SPRING_CLOUD_CONFIG_COMPONENT_URI=http://[JAVA_COMPONENT_INTERNAL_FQDN]:80
SPRING_CONFIG_IMPORT=optional:configserver:$SPRING_CLOUD_CONFIG_URI

Si desea personalizar su propio SPRING_CONFIG_IMPORT, puede hacer referencia a la variable de entorno SPRING_CLOUD_CONFIG_COMPONENT_URI, por ejemplo, puede invalidar mediante argumentos de línea de comandos, como Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=true.

También puede quitar un enlace de la aplicación.

(Opcional) Desenlace la aplicación contenedora del componente Config Server for Spring Java

Para quitar un enlace de una aplicación de contenedor, recurra a la opción --unbind.

az containerapp update \
    --name $APP_NAME \
    --unbind $JAVA_COMPONENT_NAME \
    --resource-group $RESOURCE_GROUP

Cuando vuelva a visitar la dirección URL de la aplicación, el valor de connectTimeout cambia a 0.

Limpieza de recursos

Los recursos creados en este tutorial tienen un efecto en la factura de Azure. Si no va a usar estos servicios a largo plazo, ejecute el siguiente comando para quitar todo lo creado en este tutorial.

az group delete --resource-group $RESOURCE_GROUP

Opciones de configuración

El comando az containerapp update usa el parámetro --configuration para controlar cómo se configura Config Server para Spring. Puede usar varios parámetros a la vez siempre que estén separados por un espacio. Para obtener más información, consulte Spring Cloud Config Server.

En la tabla siguiente se describen los distintos valores de configuración de back-end de Git disponibles:

Nombre Descripción
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
URI del repositorio remoto.
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
Nombre de usuario para la autenticación con repositorio remoto.
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
Contraseña para la autenticación con repositorio remoto.
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
Rutas de acceso de búsqueda que se usarán en la copia de trabajo local. De forma predeterminada, solo busca en la raíz.
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
Marca para indicar que el repositorio debe forzar la extracción. Si true, descarte los cambios locales y tome del repositorio remoto.
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
La etiqueta predeterminada que se usa para Git es main. Si no establece spring.cloud.config.server.git.default-label y una rama llamada main no existe, el servidor de configuración predeterminada también intenta obtener una rama llamada master. Si desea deshabilitar el comportamiento de la rama de reserva, puede establecer spring.cloud.config.server.git.tryMasterBranch en false.
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
De forma predeterminada, el servidor de configuración intenta desproteger una rama denominada master.
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
Puede deshabilitar la validación del servidor de configuración del certificado TLS/SSL del servidor git estableciendo la propiedad git.skipSslValidation en true.
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
Marca para indicar que el repositorio se debe clonar al iniciarse, no a petición. Por lo general, conduce a un inicio más lento, pero a una primera consulta más rápida.
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
Tiempo de espera (en segundos) para obtener conexión HTTP o SSH (si procede). El valor predeterminado de es 5 segundos.
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
Con qué frecuencia el servidor de configuración captura los datos de configuración actualizados del back-end de Git.
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
Clave privada SSH válida. Debe establecerse si ignore-local-ssh-settings es true y el URI de Git está en formato SSH.
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
Clave de host SSH válida. Debe establecerse si también se establece host-key-algorithm.
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
Uno de estos valores ssh-dss, ssh-rsa, ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, o ecdsa-sha2-nistp521. Debe establecerse si también se establece host-key.
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true o false. Si false, omita los errores con la clave de host.
spring.cloud.config.server.git.repos.{repoName} URI del repositorio remoto.
spring.cloud.config.server.git.repos.{repoName}.pattern El formato de patrón es una lista separada por comas de nombres {application}/{profile} con caracteres comodín. Si {application}/{profile} no coincide con ninguno de los patrones, usa el URI predeterminado definido en.

En la lista siguiente se describen las configuraciones comunes:

  • Registro de configuraciones relacionadas:

    • logging.level.*
    • logging.group.*
    • Se debe prohibir cualquier otra configuración en el espacio de nombres logging.*, por ejemplo, escribir archivos de registro mediante logging.file debe estar prohibido.
  • spring.cloud.config.server.overrides

    • Asignación adicional de un origen de propiedad que se enviará a todos los clientes incondicionalmente.
  • spring.cloud.config.override-none

    • Puede cambiar la prioridad de todas las invalidaciones del cliente para que sean más similares a los valores predeterminados, lo que permite que las aplicaciones proporcionen sus propios valores en variables de entorno o propiedades del sistema estableciendo la marca de spring.cloud.config.override-none=true, el valor predeterminado es false en el repositorio remoto.
  • spring.cloud.config.allow-override

    • Si habilita el primer arranque de configuración, puede permitir que las aplicaciones cliente invaliden la configuración del servidor de configuración colocando dos propiedades dentro de la configuración de aplicaciones procedente del servidor de configuración.
  • spring.cloud.config.server.health.*

    • Puede configurar el indicador de mantenimiento para comprobar más aplicaciones junto con perfiles personalizados y etiquetas personalizadas.
  • spring.cloud.config.server.accept-empty

    • Puede establecer spring.cloud.config.server.accept-empty en false para que el servidor devuelva un estado HTTP 404, si no se encuentra la aplicación. De manera predeterminada, esta marca se establece en true.
  • Cifrado y descifrado (simétrico)

    • encrypt.key
      • Conveniente cuando se usa una clave simétrica porque es un valor de propiedad único que se va a configurar.
    • spring.cloud.config.server.encrypt.enabled
      • Establezca esta propiedad en false para deshabilitar el descifrado del lado servidor.

Actualizar

Los servicios que consumen propiedades deben conocer el cambio antes de que se produzca. El método de notificación predeterminado para Config Server para Spring implica desencadenar manualmente el evento de actualización, como actualizar por llamada a https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh, lo que puede no ser factible si hay muchas instancias de aplicación.

Como alternativa, puede actualizar automáticamente los valores de Config Server al dejar que el cliente de configuración examine los cambios en función de una actualización interna. Siga estos pasos para actualizar automáticamente los valores de Config Server:

  1. Registre una tarea programada para actualizar el contexto en un intervalo determinado, como se muestra en el ejemplo siguiente:

    @Configuration
    @AutoConfigureAfter({RefreshAutoConfiguration.class, RefreshEndpointAutoConfiguration.class})
    @EnableScheduling
    public class ConfigClientAutoRefreshConfiguration implements SchedulingConfigurer {
        @Value("${spring.cloud.config.refresh-interval:60}")
        private long refreshInterval;
        @Value("${spring.cloud.config.auto-refresh:false}")
        private boolean autoRefresh;
        private final RefreshEndpoint refreshEndpoint;
        public ConfigClientAutoRefreshConfiguration(RefreshEndpoint refreshEndpoint) {
            this.refreshEndpoint = refreshEndpoint;
        }
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            if (autoRefresh) {
                // set minimal refresh interval to 5 seconds
                refreshInterval = Math.max(refreshInterval, 5);
                scheduledTaskRegistrar.addFixedRateTask(refreshEndpoint::refresh,  Duration.ofSeconds(refreshInterval));
            }
        }
    }
    
  2. Habilite autorefresh y establezca el intervalo de actualización adecuado en el archivo application.yml. En el ejemplo siguiente, el cliente sondea un cambio de configuración cada 60 segundos, que es el valor mínimo que puede establecer para un intervalo de actualización.

    De forma predeterminada, autorefresh se establece en false y refresh-interval se establece en 60 segundos.

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. Agregue @RefreshScope en el código. En el ejemplo siguiente, la variable connectTimeout se actualiza automáticamente cada 60 segundos:

    @RestController
    @RefreshScope
    public class HelloController {
        @Value("${timeout:4000}")
        private String connectTimeout;
    }
    

Cifrado y descifrado con una clave simétrica

Descifrado del lado servidor

De forma predeterminada, el cifrado del lado servidor está habilitado. Siga estos pasos para habilitar el descifrado en la aplicación:

  1. Agregue la propiedad cifrada en el archivo .properties en el repositorio Git.

    El archivo debería ser similar al ejemplo siguiente:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. Actualice el componente Config Server para Spring Java para usar el repositorio Git que tiene la propiedad cifrada y establezca la clave de cifrado.

    Antes de ejecutar el comando siguiente, reemplace los marcadores de posición rodeados por <> por los valores.

    az containerapp env java-component config-server-for-spring update \
        --environment <ENVIRONMENT_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --name <JAVA_COMPONENT_NAME> \
        --configuration spring.cloud.config.server.git.uri=<URI> encrypt.key=randomKey
    

Descifrado del lado cliente

Puede usar el descifrado del lado cliente de las propiedades siguiendo los pasos siguientes:

  1. Agregue la propiedad cifrada en el archivo .properties en el repositorio Git.

  2. Actualice el componente Config Server para Spring Java para usar el repositorio Git que tiene la propiedad cifrada y deshabilite el descifrado del lado servidor.

    Antes de ejecutar el comando siguiente, reemplace los marcadores de posición rodeados por <> por los valores.

    az containerapp env java-component config-server-for-spring update \
        --environment <ENVIRONMENT_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --name <JAVA_COMPONENT_NAME> \
        --configuration spring.cloud.config.server.git.uri=<URI> spring.cloud.config.server.encrypt.enabled=false
    
  3. En la aplicación cliente, agregue la clave de descifrado ENCRYPT_KEY=randomKey como una variable de entorno.

    Como alternativa, si incluye spring-cloud-starter-bootstrap en el classpath, o establece spring.cloud.bootstrap.enabled=true como una propiedad del sistema, establezca encrypt.key en bootstrap.properties.

    Antes de ejecutar el comando siguiente, reemplace los marcadores de posición rodeados por <> por los valores.

    az containerapp update \
        --name <APP_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --set-env-vars "ENCRYPT_KEY=randomKey"
    
    encrypt:
      key: somerandomkey