Spring cloud config, gestionando y versionando nuestras propiedades en la nube

Hace relativamente poco tiempo, me encontré con la necesidad de dockerizar una api y ponerla en el cloud de amazon.

Después de la “dockerización”, llego la generación de diferentes entornos y stacks de propiedades repetidas en las diferentes api y módulos que teníamos en ese momento. Y entonces.. aquí estamos, explicando como poner nuestras propiedades en un repositorio y consumirlas para tenerlas centralizadas y versionadas.

Realmente, en el caso que comenté., al final se utilizó “parameter store“, pero yo hice un pequeño MVP, que os voy a mostrar ahora mismo.

Versionando nuestra configuración

Lo primero que hice para montar este MVP, es subir unas propiedades a un repositorio, publico. Bien se puede reproducir en uno privado, especificando las credenciales o usando claves de acceso seguras. En este caso, sólo quería validar hipótesis, partiendo desde una configuración básica.

GITHUB properties: https://github.com/apascualco/spring-cloud-properties

Levantando nuestro propio servidor de configuraciones

GITHUB servidor: https://github.com/apascualco/spring-cloud-config-server

Las dependencias pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.apascualco</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>Config Server</name>
    <description>Spring cloud configuration server</description>

    <properties>
        <java-version>1.8</java-version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring-cloud.version>2.2.2.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
            <version>${spring-cloud.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-cloud.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.2.RELEASE</version>
            </plugin>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>1.1.2</version>
                <configuration>
                    <to>
                        <image>${project.artifactId}</image>
                    </to>
                    <from>
                        <image>openjdk:8-jdk-alpine</image>
                    </from>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Cómo podéis ver necesitamos publicar el endpoint que consumiremos o consumira nuestro cliente y spring-cloud-config-server.

Normalmente, este tipo de ejemplo, estan cubiertos por la librería de securidad y configurados de tras de unas credenciales, pero esto lo dejo al gusto del consumidor.

El objetivo principal de esta “practica”, es mostrar como funciona de la forma más básica posible y de allí, puede crecer hasta que vosotros queráis.

El plugin de google JIB, tan sólo nos facilita la parte de meter nuestro server en docker, hice un pequeño post aquí: https://www.apascualco.com/cloud/docker/generando-imagen-docker-con-maven-spring/

Las propiedades

server.port=8888
spring.cloud.config.server.git.uri=https://github.com/apascualco/spring-cloud-properties
spring.cloud.config.server.git.clone-on-start=true

Poco que decir, aquí se pondrían las credenciales de seguridad si las necesitáramos.

Qué veremos ? http://localhost:8888/hhjh/development

Cuando terminemos y sepamos más veremos dónde o que path buscar para que salga esto, ojo spoiler! http://localhost:8888/client/development

Configurando nuestro cliente

GITHUB cliente: https://github.com/apascualco/spring-cloud-config-client

Las dependencias pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.apascualco</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>Config Client</name>
    <description>Spring cloud configuration client</description>

    <properties>
        <java-version>1.8</java-version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring-cloud.version>2.2.2.RELEASE</spring-cloud.version>
        <jackson-databind.version>2.10.3</jackson-databind.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>${spring-cloud.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-cloud.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>${spring-cloud.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson-databind.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.2.RELEASE</version>
            </plugin>
        </plugins>
    </build>
</project>

Seguimos con el jib, para el cliente y obviamente el web para publicar unos rest y el startet de spring cloud config.

También he añadido la dependencia del actuator y una mandatoria en la versión de spring cloud que utilizo.

Los enpoints

package com.apascualco.client;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PropertiesController {

    @Value("${client.environment}")
    private String environment;

    @Value("${client.extra.name}")
    private String extraProperty;

    @GetMapping(value = "/env", produces = MediaType.TEXT_PLAIN_VALUE)
    public String properties() {
        return environment;
    }

    @GetMapping(value = "/extra", produces = MediaType.TEXT_PLAIN_VALUE)
    public String extra() {
        return extraProperty;
    }

}

Para lanzar nuestro servidor, deberemos de especificar los profiles activos o bien como variable de entorno o pasando los profiles a la aplicación: spring.active.profile=development,extra.

Yo utilizaré el IDE

El resultado del cliente

http://localhost:8080/extra

http://localhost:8080/env

Dependiendo de los profiles activo pillará una configuración u otra. Si vemos el nombre de las propiedades en nuestro repo, podemos observar:

client-development.properties

  • La primera parte “client” -> spring.application.name=client (nuestra config)
  • La segunda parte development -> nombre del profile

el resultado es el de arriba. Y aquí la información que nos devuelve el actuator/env http://localhost:8080/actuator/env

Deja una respuesta

A %d blogueros les gusta esto: