
Servidor de configuración centralizado para sistemas distribuidos con API HTTP, almacenamiento respaldado por Git, cifrado/descifrado de propiedades e integración con Vault, JDBC y sistemas de archivos locales.
NO EDITAR ESTE ARCHIVO. FUE GENERADO. Los cambios manuales a este archivo se perderán cuando se genere de nuevo. Edite los archivos en el directorio src/main/asciidoc/ en su lugar.
image::https://circleci.com/gh/spring-cloud/spring-cloud-config/tree/master.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-config/tree/master"] image::https://codecov.io/gh/spring-cloud/spring-cloud-config/branch/master/graph/badge.svg["Codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-config/branch/master"] image::https://api.codacy.com/project/badge/Grade/f064024a072c477e97dca6ed5a70fccd?branch=master["Codacy code quality", link="https://www.codacy.com/app/Spring-Cloud/spring-cloud-config?branch=master&utm_source=github.com&utm_medium=referral&utm_content=spring-cloud/spring-cloud-config&utm_campaign=Badge_Grade"]
Spring Cloud Config proporciona soporte del lado del servidor y del cliente para la configuración externalizada en un sistema distribuido. Con el Config Server, tienes un lugar central para gestionar propiedades externas para aplicaciones en todos los entornos.
Los conceptos tanto en el cliente como en el servidor se asignan idénticamente a las abstracciones Spring Environment y PropertySource, por lo que encajan muy bien con aplicaciones Spring pero pueden usarse con cualquier aplicación que se ejecute en cualquier lenguaje.
A medida que una aplicación avanza por el pipeline de despliegue desde desarrollo a pruebas y hasta producción, puedes gestionar la configuración entre esos entornos y estar seguro de que las aplicaciones tienen todo lo necesario para ejecutarse cuando migran.
La implementación predeterminada del backend de almacenamiento del servidor usa git, por lo que soporta fácilmente versiones etiquetadas de entornos de configuración, además de ser accesible para una amplia gama de herramientas para gestionar el contenido.
Es fácil añadir implementaciones alternativas y conectarlas con la configuración de Spring.
== Características
=== Spring Cloud Config Server
Spring Cloud Config Server ofrece los siguientes beneficios:
@EnableConfigServer=== Spring Cloud Config Client
Específicamente para aplicaciones Spring, Spring Cloud Config Client te permite:
Environment de Spring con fuentes de propiedades remotas.@RefreshScope para @Beans de Spring que deseen ser reinicializados cuando la configuración cambie./env para actualizar el Environment y re-vincular @ConfigurationProperties y niveles de log.
** /refresh para refrescar los beans @RefreshScope.
** /restart para reiniciar el contexto de Spring (deshabilitado por defecto).
** /pause y /resume para llamar a los métodos Lifecycle (stop() y en el ).== Inicio rápido
Este inicio rápido recorre el uso tanto del servidor como del cliente de Spring Cloud Config Server.
Primero, inicia el servidor, de la siguiente manera:
El servidor es una aplicación Spring Boot, por lo que puedes ejecutarlo desde tu IDE si lo prefieres (la clase principal es ConfigServerApplication).
A continuación prueba un cliente, de la siguiente manera:
La estrategia predeterminada para localizar fuentes de propiedades es clonar un repositorio git (en spring.cloud.config.server.git.uri) y usarlo para inicializar un mini SpringApplication.
El Environment de la mini-aplicación se usa para enumerar fuentes de propiedades y publicarlas en un endpoint JSON.
El servicio HTTP tiene recursos en la siguiente forma:
donde application se inyecta como spring.config.name en el SpringApplication (lo que normalmente es application en una aplicación Spring Boot normal), profile es un perfil activo (o lista separada por comas de propiedades), y label es una etiqueta git opcional (por defecto master).
Spring Cloud Config Server obtiene configuración para clientes remotos de varias fuentes. El siguiente ejemplo obtiene configuración de un repositorio git (que debe ser proporcionado), como se muestra en el siguiente ejemplo:
Otras fuentes son cualquier base de datos compatible con JDBC, Subversion, Hashicorp Vault, Credhub y sistemas de archivos locales.
=== Uso del lado del cliente
Para usar estas características en una aplicación, puedes construirla como una aplicación Spring Boot que dependa de spring-cloud-config-client (por ejemplo, consulta los casos de prueba para config-client o la aplicación de muestra).
La forma más conveniente de añadir la dependencia es con un starter Spring Boot org.springframework.cloud:spring-cloud-starter-config.
También hay un pom padre y BOM (spring-cloud-starter-parent) para usuarios de Maven y un archivo de propiedades de gestión de versiones de Spring IO para usuarios de Gradle y Spring CLI. El siguiente ejemplo muestra una configuración típica de Maven:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>{spring-boot-docs-version}</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>{spring-cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- repositories also needed for snapshots and milestones -->
Ahora puedes crear una aplicación Spring Boot estándar, como el siguiente servidor HTTP:
@SpringBootApplication @RestController public class Application {
@RequestMapping("/")
public String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
Cuando este servidor HTTP se ejecuta, recoge la configuración externa del config server local por defecto (si está en ejecución) en el puerto 8888.
Para modificar el comportamiento de inicio, puedes cambiar la ubicación del config server usando bootstrap.properties (similar a application.properties pero para la fase bootstrap de un contexto de aplicación), como se muestra en el siguiente ejemplo:
Por defecto, si no se establece un nombre de aplicación, se usará application. Para modificar el nombre, se puede añadir la siguiente propiedad al archivo bootstrap.properties:
NOTA: Al establecer la propiedad ${spring.application.name}, no prefijes el nombre de tu aplicación con la palabra reservada application- para evitar problemas al resolver la fuente de propiedades correcta.
Las propiedades bootstrap aparecen en el endpoint /env como una fuente de propiedades de alta prioridad, como se muestra en el siguiente ejemplo.
Una fuente de propiedades llamada ```configService:/contiene la propiedadfoocon un valor debar` y es de la prioridad más alta.
NOTA: La URL en el nombre de la fuente de propiedades es el repositorio git, no la URL del config server.
=== Aplicación de muestra
Puedes encontrar una aplicación de muestra https://github.com/spring-cloud/spring-cloud-config/tree/master/spring-cloud-config-sample[aquí].
Es una aplicación Spring Boot, por lo que puedes ejecutarla usando los mecanismos habituales (por ejemplo, mvn spring-boot:run).
Cuando se ejecuta, busca el config server en http://localhost:8888 (un valor predeterminado configurable), por lo que también puedes ejecutar el servidor para verlo todo funcionando junto.
La muestra tiene un caso de prueba donde el config server también se inicia en la misma JVM (con un puerto diferente), y la prueba afirma que una propiedad de entorno del repositorio de configuración git está presente.
Para cambiar la ubicación del config server, puedes establecer spring.cloud.config.uri en bootstrap.yml (o en propiedades del sistema y otros lugares).
El caso de prueba tiene un método main() que ejecuta el servidor de la misma manera (observa los logs para ver su puerto), por lo que puedes ejecutar todo el sistema en un solo proceso y jugar con él (por ejemplo, puedes ejecutar el método main() en tu IDE).
El método main() usa target/config como directorio de trabajo del repositorio git, por lo que puedes hacer cambios locales allí y verlos reflejados en la aplicación en ejecución. El siguiente ejemplo muestra una sesión de experimentación con el caso de prueba:
El endpoint refresh informa que la propiedad "sample" ha cambiado.
== Construcción
:jdkversion: 1.7
=== Compilación y pruebas básicas
Para construir el código fuente necesitarás instalar JDK {jdkversion}.
Spring Cloud usa Maven para la mayoría de actividades relacionadas con la construcción, y deberías poder empezar bastante rápido clonando el proyecto que te interesa y escribiendo
NOTA: También puedes instalar Maven (>=3.3.3) tú mismo y ejecutar el comando mvn en lugar de ./mvnw en los ejemplos siguientes. Si haces eso, también podrías necesitar añadir -P spring si tu configuración local de Maven no contiene declaraciones de repositorio para artefactos de prelanzamiento de Spring.
NOTA: Ten en cuenta que podrías necesitar aumentar la cantidad de memoria disponible para Maven estableciendo una variable de entorno MAVEN_OPTS con un valor como -Xmx512m -XX:MaxPermSize=128m. Intentamos cubrir esto en la configuración de .mvn, por lo que si encuentras que tienes que hacerlo para que una construcción tenga éxito, por favor abre un ticket para que se añadan las configuraciones al control de fuentes.
Para obtener pistas sobre cómo construir el proyecto, mira en .travis.yml si existe. Debería haber un comando "script" y quizás "install". También mira la sección "services" para ver si algún servicio necesita ejecutarse localmente (p. ej., mongo o rabbit). Ignora las partes relacionadas con git que puedas encontrar en "before_install" ya que están relacionadas con establecer credenciales de git y ya las tienes.
Los proyectos que requieren middleware generalmente incluyen un docker-compose.yml, por lo que considera usar https://docs.docker.com/compose/[Docker Compose] para ejecutar los servidores middleware en contenedores Docker. Consulta el README en el https://github.com/spring-cloud-samples/scripts[repositorio de demostración de scripts] para instrucciones específicas sobre los casos comunes de mongo, rabbit y redis.
NOTA: Si todo falla, construye con el comando de .travis.yml (normalmente ./mvnw install).
=== Documentación
El módulo spring-cloud-build tiene un perfil "docs", y si lo activas, intentará construir fuentes asciidoc desde src/main/asciidoc. Como parte de ese proceso, buscará un README.adoc y lo procesará cargando todos los includes, pero sin analizarlo ni renderizarlo, solo copiándolo a ${main.basedir} (por defecto ${basedir}, es decir, la raíz del proyecto). Si hay cambios en el README, aparecerán después de una construcción de Maven como un archivo modificado en el lugar correcto. Solo haz commit y push del cambio.
=== Trabajar con el código Si no tienes preferencia de IDE, te recomendamos que uses https://www.springsource.com/developer/sts[Spring Tools Suite] o https://eclipse.org[Eclipse] al trabajar con el código. Usamos el plugin de eclipse https://eclipse.org/m2e/[m2eclipse] para soporte de Maven. Otros IDEs y herramientas también deberían funcionar sin problemas siempre que usen Maven 3.3.3 o superior.
==== Importar en eclipse con m2eclipse Recomendamos el plugin de eclipse https://eclipse.org/m2e/[m2eclipse] al trabajar con eclipse. Si aún no tienes m2eclipse instalado, está disponible desde el "eclipse marketplace".
NOTA: Las versiones antiguas de m2e no soportan Maven 3.3, por lo que una vez que los proyectos se importen en Eclipse, también necesitarás indicar a m2eclipse que use el perfil correcto para los proyectos. Si ves muchos errores relacionados con los POMs en los proyectos, verifica que tienes una instalación actualizada. Si no puedes actualizar m2e, añade el perfil "spring" a tu settings.xml. Alternativamente, puedes copiar la configuración del repositorio del perfil "spring" del pom padre en tu settings.xml.
==== Importar en eclipse sin m2eclipse Si prefieres no usar m2eclipse, puedes generar metadatos de proyecto eclipse usando el siguiente comando:
$ ./mvnw eclipse:eclipse
Los proyectos eclipse generados se pueden importar seleccionando import existing projects desde el menú file.
=== JCE
Si obtienes una excepción debido a "Illegal key size" y estás usando el JDK de Sun, necesitas instalar los archivos de política de jurisdicción de fuerza ilimitada de Java Cryptography Extension (JCE). Consulta los siguientes enlaces para más información:
https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html[Java 6 JCE]
https://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html[Java 7 JCE]
https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html[Java 8 JCE]
Extrae los archivos JCE en la carpeta JDK/jre/lib/security para la versión de JRE/JDK x64/x86 que uses.
== Contribuir
:spring-cloud-build-branch: master
Spring Cloud se publica bajo la licencia Apache 2.0 no restrictiva, y sigue un proceso de desarrollo de Github muy estándar, usando el rastreador de Github para incidencias y fusionando pull requests en master. Si deseas contribuir incluso con algo trivial, no dudes en hacerlo, pero sigue las pautas a continuación.
=== Firmar el Acuerdo de Licencia del Colaborador Antes de aceptar un parche o pull request no trivial, necesitaremos que firmes el https://cla.pivotal.io/sign/spring[Acuerdo de Licencia del Colaborador]. Firmar el acuerdo del colaborador no otorga derechos de commit al repositorio principal, pero significa que podemos aceptar tus contribuciones, y recibirás crédito como autor si lo hacemos. Los contribuyentes activos podrían ser invitados a unirse al equipo central, y se les dará la capacidad de fusionar pull requests.
=== Código de Conducta Este proyecto se adhiere al https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc[código de conducta] de Contributor Covenant. Al participar, se espera que cumplas con este código. Por favor, reporta comportamientos inaceptables a [email protected].
=== Convenciones de Código y Mantenimiento Ninguno de estos es esencial para un pull request, pero todos ayudan. También se pueden añadir después del pull request original pero antes de una fusión.
eclipse-code-formatter.xml del proyecto https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml[Spring Cloud Build]. Si usas IntelliJ, puedes usar el https://plugins.jetbrains.com/plugin/6546[Plugin Eclipse Code Formatter] para importar el mismo archivo..java nuevos tengan un comentario de clase Javadoc simple con al menos una etiqueta @author que te identifique, y preferiblemente al menos un párrafo sobre para qué sirve la clase..java nuevos (copia de archivos existentes en el proyecto)@author a los archivos .java que modifiques sustancialmente (más que cambios cosméticos).Fixes gh-XXXX al final del mensaje de commit (donde XXXX es el número de incidencia).=== Checkstyle
Spring Cloud Build viene con un conjunto de reglas checkstyle. Puedes encontrarlas en el módulo spring-cloud-build-tools. Los archivos más notables bajo el módulo son:
<1> Reglas Checkstyle predeterminadas <2> Configuración de cabecera de archivo <3> Reglas de supresión predeterminadas
==== Configuración de Checkstyle
Las reglas de Checkstyle están deshabilitadas por defecto. Para añadir checkstyle a tu proyecto, simplemente define las siguientes propiedades y plugins.
<reporting>
<plugins>
<plugin> <5>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
</plugin>
</plugins>
</reporting>
${project.root}/src/checkstyle/checkstyle-suppressions.xml con tus supresiones. Ejemplo:.projectRoot/src/checkstyle/checkstyle-suppresions.xmlEs recomendable copiar ${spring-cloud-build.rootFolder}/.editorconfig y ${spring-cloud-build.rootFolder}/.springformat a tu proyecto. De esa manera, se aplicarán algunas reglas de formato predeterminadas. Puedes hacerlo ejecutando este script:```bash
$ curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/.editorconfig -o .editorconfig
$ touch .springformat
=== Configuración del IDE
==== Intellij IDEA
Para configurar Intellij, debes importar nuestras convenciones de codificación, perfiles de inspección y configurar el plugin checkstyle.
Los siguientes archivos se pueden encontrar en el proyecto https://github.com/spring-cloud/spring-cloud-build/tree/master/spring-cloud-build-tools[Spring Cloud Build].
.spring-cloud-build-tools/
----
└── src
├── checkstyle
│ └── checkstyle-suppressions.xml <3>
└── main
└── resources
├── checkstyle-header.txt <2>
├── checkstyle.xml <1>
└── intellij
├── Intellij_Project_Defaults.xml <4>
└── Intellij_Spring_Boot_Java_Conventions.xml <5>
----
<1> Reglas predeterminadas de Checkstyle
<2> Configuración del encabezado del archivo
<3> Reglas de supresión predeterminadas
<4> Valores predeterminados del proyecto para Intellij que aplican la mayoría de las reglas de Checkstyle
<5> Convenciones de estilo del proyecto para Intellij que aplican la mayoría de las reglas de Checkstyle
.Estilo de código
image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-code-style.png[Estilo de código]
Ve a `File` -> `Settings` -> `Editor` -> `Code style`. Allí haz clic en el icono junto a la sección `Scheme`. Luego, haz clic en el valor `Import Scheme` y elige la opción `Intellij IDEA code style XML`. Importa el archivo `spring-cloud-build-tools/src/main/resources/intellij/Intellij_Spring_Boot_Java_Conventions.xml`.
.Perfiles de inspección
image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-inspections.png[Estilo de código]
Ve a `File` -> `Settings` -> `Editor` -> `Inspections`. Allí haz clic en el icono junto a la sección `Profile`. Luego, haz clic en `Import Profile` e importa el archivo `spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml`.
.Checkstyle
Para que Intellij funcione con Checkstyle, debes instalar el plugin `Checkstyle`. También es recomendable instalar `Assertions2Assertj` para convertir automáticamente las aserciones de JUnit
image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-checkstyle.png[Checkstyle]
Ve a `File` -> `Settings` -> `Other settings` -> `Checkstyle`. Allí haz clic en el icono `+` en la sección `Configuration file`. Allí, tendrás que definir de dónde se tomarán las reglas de checkstyle. En la imagen de arriba, hemos seleccionado las reglas del repositorio clonado de Spring Cloud Build. Sin embargo, puedes apuntar al repositorio de GitHub de Spring Cloud Build (por ejemplo, para `checkstyle.xml`: `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml`). Necesitamos proporcionar las siguientes variables:
- `checkstyle.header.file` - apunta al archivo `spring-cloud-build-tools/src/main/resources/checkstyle-header.txt` de Spring Cloud Build, ya sea en tu repositorio clonado o mediante la URL `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle-header.txt`.
- `checkstyle.suppressions.file` - supresiones predeterminadas. Apunta al archivo `spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml` de Spring Cloud Build, ya sea en tu repositorio clonado o mediante la URL `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml`.
- `checkstyle.additional.suppressions.file` - esta variable corresponde a supresiones en tu proyecto local. Por ejemplo, si estás trabajando en `spring-cloud-contract`. Luego apunta a la carpeta `project-root/src/checkstyle/checkstyle-suppressions.xml`. Un ejemplo para `spring-cloud-contract` sería: `/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml`.
IMPORTANTE: Recuerda establecer el `Scan Scope` como `All sources` ya que aplicamos las reglas de checkstyle tanto para los fuentes de producción como de prueba.
start()ApplicationContext