Servicio de configuración para microservicios con Spring Cloud Config

Escrito por picodotdev el , actualizado el .
java planeta-codigo programacion
Comentarios

Spring
Java

Al igual que un servicio de registro y descubrimiento es esencial para los microservicios un servicio de obtención de configuración de donde puedan obtener su configuración es también básico. Dado el gran número de microservicios de los que puede estar compuesta una aplicación, su carácter efímero, los varios entornos de ejecución (desarrollo, pruebas, producción, …) mantener centralizada la configuración en un único sitio hace las cosas mucho más sencillas cuando hay que cambiar el valor de alguna propiedad, en vez de la alternativa aún externalizada del artefacto del microservicio en el sistema de archivos del entorno de ejecución.

Dado que este servicio de configuración es esencial para que los microservicios puedan obtener su configuración sin la cual no podrían proporcionar su funcionalidad hay que configurarlo de tal manera que sea tolerante a fallos. Una de las medidas para hacerlo tolerante a fallos es iniciar varias instancias de servidores de configuración, estas instancias se autoregistran en el servicio de descubrimiento para que los microservicios puedan descubrirlos y obtener su configuración al iniciarse.

Con el comando ./gradlew configserver:run –args=“–port=8090” se inicia una instancia de servicio de configuración en el puerto 8090, cambiando el número de puerto se puede iniciar otra instancia en el puerto especificado. Una vez iniciadas varias instancias en el dashboard del servicio de descubrimiento se observa como se autoregistran y su estado.

Servicios y su estado registrados en el servicio de registro y descubrimiento

Dado que los servicios de configuración no pueden confiar en obtener su configuración de una instancia de su servicio de configuración ha de establecerse en el propio microservicio los nombres de host de las instancias de registro y descubrimiento en las que registrarse, en la propiedad eureka.client.serviceUrl.defaultZone.

Los archivos de configuración para los microservicios en este ejemplo están en el directorio misc/config donde siguiendo algunas convenciones para asignar el nombre a los archivos se pueden personalizar las configuraciones de los microservicios según el entorno y perfil con el que se active. En este caso se utiliza lo que Spring Cloud Config denomina un filesystem backend, sin embargo, hay otras disponibles como un repositorio de git el cual ofrece varias ventajas propias de un repositorio de código como historial, ramas de trabajo y hacer cambios con un commit.

Un microservicio o aplicación de Spring que use un servidor de Spring Cloud Config una de las primeras acciones que realiza al iniciarse es obtener su configuración en función del nombre del microservicio y perfil con el que se inicie. Dado que la configuración se obtiene en el inicio en base a su nombre y perfil tanto el nombre del microservicio y su perfil de configuración se ha de configurar en el archivo bootstrap.yml.

El proceso de configuración de un microservicio está formado por dos pasos, en el primero el servicio se conecta al servicio de registro y descubrimiento obtiene los servicios registrados de configuración y en el segundo paso solicita a uno de ellos su configuración.

El servicio de configuración es accesible mediante una interfaz REST. Para obtener la configuración del servicio service y del servicio client de este ejemplo las URLs para obtenerlas son las siguientes. Estos endpoints devuelven en formato json un documento con los valores de las propiedades principalmente están en el mapa source entre otros datos que Spring al iniciar la aplicación con ellos configura la aplicación.

En otro artículo relacionado con la configuración de los microservicios comentaré como recargar la configuración de los microservicios sin necesidad de reiniciarlos y como almacenar datos sensibles de forma cifrada para mayor seguridad.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew run:configserver --args="port=8090".