#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, вы можете хранить свойства базы данных в секрете.