GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Config Server com back end em Banco de dados

Olá,

Estou implementando um Config server usando o Spring Cloud Config. Foi exigido que o backend do desse Config Server fosse com um banco de dados em vez do git. Estou tendo muita dificuldade para entender como o config server funciona nesse caso. E não tem muitos artigos com exemplos bons (na verdade não encontrei um bom). Os exemplos que encontrei são bem confusos. Alguém já fez uma implementação desse tipo?

Vc já deu uma olhada nesse link da documentação: 2.1.7 JDBC Backend?

Bom dia Lucas,

Vi sim. Inclusive até implementei o config server. A minha maior dúvida dentro disso é como ele vai disponibilizar essas configurações para o client. Preciso escrever um controller para isso?

Eu gravei no banco as configurações da aplicação cliente mas ela não está conseguindo ler essas configurações.

Então eu gostaria de entender como o config server disponibiliza as configuracoes quando tem como back end um banco e como vou receber as configurações na aplicação client?

Já fez algo assim?

De acordo com essa documentação, vc precisa criar um schema de banco, e ter nesse schema uma tabela chamada PROPERTIES, com as colunas: APPLICATION, PROFILE, LABEL, KEY e VALUE.

Crie seu projeto spring boot assim:

@SpringBootApplication
@EnableConfigServer
@Import({JdbcEnvironmentRepository.class})
public class ConfigServer {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource dataSource() {
       return DataSourceBuilder.create().build();
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource());
    }

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

E deixe seu application assim:

spring:
  datasource:
    driver-class-name: driver.do.seu.banco
    url: 'jdbc:url-de-conexao'
  cloud:
    config:
      server:
        jdbc:
          order: 2
          sql: 'SELECT key, value FROM Properties WHERE application = ? AND profile = ? AND label = ?'
  username: root
  password: suaSenha

Não esqueça de colocar a dependência do spring-jdbc no projeto

Entendi. A tabela eu já tinha. Mas não tinha colocado o @import e criado esses Beans.
Mais uma pergunta, na aplicação cliente só preciso colocar a dependencia do Spring Cloud Config client e colocar no bootstrap.yml o nome da aplicação, uri do config server, o profile ativo e o label? ou tem mais alguma coisa que preciso configurar?

No momento o bootstrap da minha aplicação cliente está assim:

 spring:
    application:
        name: app-products
    cloud:
        config:
            uri: http://localhost:8888
            label: dev
            profile: dev

Se não me engano, só isso mesmo. Apenas o profile que eu uso de outra forma:

spring:
  profiles:
    active: dev

Beleza. Obrigada Lucas.

Só mais uma pergunta, eu também tava tentando usar a anotação @RefreshScope para uma atualização automática das configurações em casos de alterações. Nos exemplos que vi, essa anotação estava sendo usanda no controller, estava mais ou menos assim

@RestController
@RefreshScope
public class ProductController{

    @Value("${propertie.messagem}")
    private String menssagem;
}

Teria uma forma de centralizar isso em uma classe de configuração por exemplo? Tipo em vez de colocar o @RefreshScope em cada componente da aplicação que vai pegar um valor que está nas configurações, usar uma classe que vai atualizar tudo.

Olá Lucas, consegui desenrolar as coisas por aqui.

Muito Obrigada!

1 curtida

Desculpe não ter respondido (tb nunca precisei usar esse refresh scope). Mas bom que vc conseguiu.

Boa tarde amigos!
Vocês me ajudaram muito pra configurar o server do spring cloud config para acessar o banco. Só fiquei com uma dúvida de como consultar o valor salvo na tabela através do cliente.
Como deve ficar o aplication.yml do config client pra conseguir pegar o value da key do banco?

Agradeço!

Consegui. Basta colocar no nome da Key dentro do application client

//