Spring Cloud Config Server – O que é, e como criar o seu

O Spring Cloud Config Server em tradução livre seria algo como: “Servidor de configuração da nuvem Spring”, e é basicamente isso que ele faz. Ele prove uma forma de você ter um “repositório” de configuração para as suas aplicações baseada em Spring Boot.

Só para aplicações que rodem Spring Boot? não, da pra você usar ele para outras aplicações, mas é um caso mais “avançado”. Então, por enquanto, vamos nos limitar as aplicações que usem Spring Boot.

Criando nosso projeto do server

Devemos começar criando nosso projeto pelo site: https://start.spring.io/

No Start Spring IO, você deve escolher que é um Config Server, o Actuator e o Spring Security. Esses são os itens “essenciais”.

Se quiser, pode usar a url abaixo que monta o mesmo projeto.

https://start.spring.io/#!type=gradle-project&language=java&platformVersion=2.4.5.RELEASE&packaging=jar&jvmVersion=11&groupId=br.com.escovabit&artifactId=spring-cloud-config-server&name=spring-cloud-config-server&description=Servidor%20de%20Configura%C3%A7%C3%B5es%20de%20Cloud%20do%20Spring&packageName=br.com.escovabit.spring-cloud-config-server&dependencies=actuator,cloud-config-server,security

Projeto criado, download feito. Vamos colocar para rodar.

Configurando o nosso “Config Server

Nos vamos seguir este manual de configuração: https://cloud.spring.io/spring-cloud-config/reference/html/#_spring_cloud_config_server

Você pode importar o projeto na sua IDE de preferencial. Dá até pra usar o bloco de notas, porque temos muitas poucas configurações.

Devemos começar editando o arquivo:

 spring-cloud-config-server/src/main/java/br/com/escovabit/springcloudconfigserver/SpringCloudConfigServerApplication.java

incluindo a anotação @EnableConfigServer e seu import org.springframework.cloud.config.server.EnableConfigServer;;

package br.com.escovabit.springcloudconfigserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@EnableConfigServer
@SpringBootApplication
public class SpringCloudConfigServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringCloudConfigServerApplication.class, args);
	}

}

Depois, eu gosto de apagar o arquivo:

spring-cloud-config-server/src/main/resources/application.properties

E no lugar criar o arquivo:

 spring-cloud-config-server/src/main/resources/application.yml

Com o conteúdo:

spring:
  security:
    user:
      name: ${config_username}
      password: ${config_password}
  cloud:
    config:
      server:
        git:
          timeout: 10
          uri: ${config_git_url}
          default-label: main
          ignoreLocalSshSettings: true
          search-paths:
            - commons # Permite ter um diretorio chamando commons para ler aquivos de configurações
            - '{application}' # Permite ler arquivos separados em direotiros para cada aplicação
          # gerar com o comando: ssh-keygen -m PEM -t rsa -b 4096
          privateKey: ${config_private_key}

No Spring Boot, nos arquivos de configuração, tudo o que estiver com ${…} é considerado como variável externa da aplicação. Eu gosto bastante desse modelo de trabalho porque permite configurar a aplicação de acordo com o “ambiente” que ela estiver rodando. Sem precisar recompilar em caso de alteração.

“Build_ando” – Construindo o artefato

Agora, já da pra rodar a aplicação, o que você precisa fazer é compilar ela com o comando:

./gradlew build

Exportando as variáveis de execução

Agora, exporta as variáveis de “ambiente” que definimos no application.yml.

Começando com usuário e senha que será utilizado para as aplicações se conectar ao Spring Cloud Config Server.

export config_username=usuariocliente
export config_password=senhadoscliente

Depois, a variável que indica a url do nosso repositório de configurações:

export config_git_url=git@github.com:escovabit-tec-br/spring-cloud-config-files.git

e por ultimo, a chave RSA que utilizamos para autenticar no repositório:

export config_private_key=$(cat ~/.ssh/id_rsa)

Essa parte da chave, é a que gera mais dor de cabeça.

A chave precisa ser gerada pelo comando:

ssh-keygen -m PEM -t rsa -b 4096

Se não, o Spring recusa a chave, mesmo que o Git aceite ela. Também tem a questão de como colocar ela com variável.

Não se preocupe se não der certo logo de cara. O próprio Spring coloca dentro do arquivo YML a configuração da chave em sua documentação. De tão “chato” que é fazer isso.

Ref: https://cloud.spring.io/spring-cloud-config/reference/html/#_git_ssh_configuration_using_properties

Rodando a aplicação

para rodar, executar o comando:

java -jar build/libs/spring-cloud-config-server-0.0.1-SNAPSHOT.jar

Com ela no ar, você “testa” fazendo a chamada da url no seu navegador simulando a chamada que uma aplicação faria:

http://localhost:8080/sample-app,shared-config/dev

PS: explicando a url, depois do 8080, o conteúdo separado por vírgula são os nomes dos arquivos existentes (sample-app e shared-config) no repositório e o conteúdo após a barra final (dev) representa qual é o profile de configuração.

Vai aparece a tela de login padrão do Spring Security, basta coloca o usuário e senha que você fez no export.

Após o login, você deve receber a configuração da aplicação que você solicitou na url:

Aqui acaba a parte básica de configuração. Se você quiser, pode olhar no repositório a baixo com a tag basic-config:

https://github.com/escovabit-tec-br/spring-cloud-config-server/tree/basic-config

Vou ir evoluindo esse projeto colocando as outras configurações que são recomendadas para ele. Acompanhe isso nos outros posts.