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
- Una cuenta de Azure con una suscripción activa. Si aún no tiene ninguno, puede crear uno gratis.
- Azure CLI.
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.
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
yspring.cloud.config.server.git.password
.Inicio de sesión en Azure con la CLI de Azure.
az login
Cree un grupo de recursos.
az group create --name $RESOURCE_GROUP --location $LOCATION
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.
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
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 propiedadrefresh-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
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 de0
.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 mediantelogging.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.
- 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.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
enfalse
para que el servidor devuelva un estado HTTP404
, si no se encuentra la aplicación. De manera predeterminada, esta marca se establece entrue
.
- Puede establecer
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.
- Establezca esta propiedad en
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:
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)); } } }
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 enfalse
yrefresh-interval
se establece en 60 segundos.spring: cloud: config: auto-refresh: true refresh-interval: 60 management: endpoints: web: exposure: include: - refresh
Agregue
@RefreshScope
en el código. En el ejemplo siguiente, la variableconnectTimeout
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:
Agregue la propiedad cifrada en el archivo .properties en el repositorio Git.
El archivo debería ser similar al ejemplo siguiente:
message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
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:
Agregue la propiedad cifrada en el archivo .properties en el repositorio Git.
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
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 elclasspath
, o establecespring.cloud.bootstrap.enabled=true
como una propiedad del sistema, establezcaencrypt.key
enbootstrap.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