Переключение между локальной базой данных и Google Cloud SQL программным путем - PullRequest
1 голос
/ 01 февраля 2020

Я работаю над проектом в Spring Boot, который до сих пор использовал только локальную Postgres базу данных. Однако сейчас мы работаем над развертыванием приложения на облачной платформе Google, которое включает использование Cloud SQL. Я нашел несколько руководств о том, как подключиться к облаку SQL и решил следовать этому .

Однако мы не можем позволить себе иметь отдельные базы данных для разработки, работающие также в облаке SQL, поэтому хотели бы продолжить использование локальных Postgres баз данных для разработки. Для этого я написал следующий код:

@Configuration
@EnableTransactionManagement
public class PersistenceContext {
    @Bean
    public DriverManagerDataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl(System.getenv("DB_URL"));
        dataSource.setUsername(System.getenv("DB_USER"));
        dataSource.setPassword(System.getenv("DB_PASS"));

        String dbInstance = System.getenv("DB_INSTANCE");

        if (dbInstance != null && !dbInstance.isEmpty()) {
            Properties connectionProperties = new Properties();
            connectionProperties
                .setProperty("socketFactory", "com.google.cloud.sql.postgres.SocketFactory");
            connectionProperties.setProperty("cloudSqlInstance", dbInstance);

            dataSource.setConnectionProperties(connectionProperties);
        }

        return dataSource;
    }
}

С этим я надеялся, что простое отсутствие указания фабрики сокетов SQL и dbInstance позволит мне использовать локальную базу данных. Однако при попытке запустить приложение только с установленной переменной БД: URL, пользователь и пароль, я сталкиваюсь со следующим исключением:

java .lang.IllegalArgumentException: имя соединения экземпляра должно быть предоставлены в формате <PROJECT_ID>:<REGION>:<INSTANCE_ID>.

Полная трассировка стека может быть найдена здесь

URL БД настроен следующим образом:

DB_URL: jdbc:postgresql://localhost:5432/soundshare

Что можно сделать для программного переключения между базами данных? (Я бы предпочел не хранить детали базы данных в конфигурационных файлах, если этого можно избежать)

Спасибо!

1 Ответ

2 голосов
/ 01 февраля 2020

Делать это самостоятельно в коде не очень хорошая идея, как упомянул @Thomas Andolf, заново изобретая колесо. Есть несколько способов «экстернализации» ваших конфигураций.

https://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/html/boot-features-external-config.html

Лично мне нравится использовать переменные среды os, когда я могу, потому что я могу легко переносить их, когда Я также развертываю как контейнеры.

Это поперечное сечение файла application.properties проекта, над которым я работаю:

spring.datasource.url = $ { ospec_db_url} spring.datasource.username = $ {ospec_db_user: somedefault} spring.datasource.password = $ {ospec_db_password}

В моей системе разработки я просто установил переменную среды, и она поднялась. В моем случае у меня есть текстовый файл с моими переменными, подобный этому:

export ospec_db_url = jdb c: postgresql: // localhost: 5432 / ospec_db export ospec_db_password = somebadasspassword

Я просто отправил текстовый файл, и он был применен. Я могу легко переключаться между проектами, делающими это. Когда вы упаковываете, скажем, K8s, вы можете читать из файла секретов переменную env, а когда вы go - в облако, вы можете передавать значения как переменные в ваших сценариях запуска.

...