Конфигурация Spring Cloud — Хранилище и серверная часть JDBC с кредитами JDBC в хранилище

#spring-boot #spring-cloud #spring-cloud-config

#пружинный ботинок #весеннее облако #spring-облако-конфигурация

Вопрос:

Я пытаюсь изменить наш текущий сервер конфигурации Spring Cloud, на котором есть только серверная часть JDBC, чтобы включить серверную часть хранилища, чтобы сохранить в секрете учетные данные для подключения к JDBC.

свод:

 Listener 1: tcp (addr: "127.0.0.1:8400", cluster address: "127.0.0.1:8401", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")  C:appsHashiCorpgt;vault kv get secret/my-secrets =============== Data =============== Key Value --- ----- spring.datasource.password yadayadayada spring.datasource.username cobar  

загрузочный файл.yml

 server:  port: 8888 spring:  application:  name: config-server  cloud:  config:  allowOverride: true  server:  jdbc:  sql: SELECT prop_key, prop_value from CloudProperties where application=? and profile=? and label=?  order: 2   #https://cloud.spring.io/spring-cloud-config/reference/html/#vault-backend  vault:  scheme: http  host: localhost  port: 8400  defaultKey: my-secrets  order: 1  

приложение.yml

 spring:  main:  banner-mode: off  allow-bean-definition-overriding: true  datasource:  url: jdbc:mysql://localhost/bootdb?createDatabaseIfNotExist=trueamp;autoReconnect=trueamp;useSSL=false  #username: cobar  #password: yadayadayada  driverClassName: com.mysql.jdbc.Driver  hikari:  connection-timeout: 60000  maximum-pool-size: 5  cloud:  vault:  scheme: http  host: localhost  port: 8400  defaultKey: my-secrets  token: root.RIJQjZ4jRZUS8mskzfCON88K  

Имя пользователя и пароль spring.datasource не извлекаются из хранилища.

 2021-12-01 12:43:39.927 INFO 5992 --- [ restartedMain]: The following profiles are active: jdbc,vault 2021-12-01 12:43:46.123 ERROR 5992 --- [ restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. Login failed for user ''. ClientConnectionId:a32  

Ответ №1:

Переместите свойства из начальной загрузки в контекст приложения.

Вызовите конечную точку хранилища, чтобы получить секреты, и используйте их для настройки источника данных для серверной части JDBC.

 @Slf4j @SpringBootApplication @EnableConfigServer public class ConfigServerApplication {   public static final String VAULT_URL_FRMT = "%s://%s:%s/v1/secret/%s";   @Autowired  private Environment env;   public static void main(String[] args) {  SpringApplication app = new SpringApplication(ConfigServerApplication.class);  app.addListeners(new ApplicationPidFileWriter());  app.addListeners(new WebServerPortFileWriter());  app.run(args);  }      @Order(1)  @Bean("restTemplate")  public RestTemplate restTemplate() {  return new RestTemplate();  }   @Configuration  public class JdbcConfig {   @Autowired  private RestTemplate restTemplate;   @Bean  public DataSource getDataSource() {  Secrets secrets = findSecrets();  DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();  dataSourceBuilder.url(secrets.getData().get("spring.datasource.url"));  dataSourceBuilder.username(secrets.getData().get("spring.datasource.username"));  dataSourceBuilder.password(secrets.getData().get("spring.datasource.password"));  return dataSourceBuilder.build();  }   private Secrets findSecrets() {  HttpHeaders httpHeaders = new HttpHeaders();  httpHeaders.set("X-Vault-Token", env.getProperty("spring.cloud.vault.token"));  HttpEntity request = new HttpEntity(httpHeaders);  String url = String.format(VAULT_URL_FRMT,  env.getProperty("spring.cloud.vault.scheme"),  env.getProperty("spring.cloud.vault.host"),  env.getProperty("spring.cloud.vault.port"),  env.getProperty("spring.cloud.vault.defaultKey")  );  return restTemplate.exchange(url, HttpMethod.GET, request, Secrets.class, 1).getBody();  }  } }  
 @Getter @Setter public class Secrets implements Serializable {   private String request_id;  private String lease_id;  private boolean renewable;  private Duration lease_duration;  private Maplt;String, Stringgt; data;  }   

Теперь у вас есть облачная конфигурация с серверной частью JDBC, вы можете хранить свойства базы данных в секрете.