Программное использование Spring Cloud

В прошлой статье я показал вам, как использовать опцию Spring Cloud Java конфигурации для декларативного получения соединений с сервисом(если необходимо, имеется поддержка пространства имен XML). В этой статье мы остановимся более подробно на использовании Spring Cloud программно. Это поможет вам в ситуациях, когда вы не можете использовать Java или XML конфигурацию. Этим мы проясним, как работает Spring Cloud и подготовимся к следующей статье в этой серии, где мы обсудим расширение Spring Cloud.

Для работы с Spring Cloud нам необходимо получить доступ к объекту класса Cloud. Кроме того, вы не можете создать Cloud объект напрямую(его конструктор закрыт). Вместо этого, вы получите его через CloudFactory.

CloudFactory cloudFactory = new CloudFactory();
Cloud cloud = cloudFactory.getCloud();

Объект облака создан конкретно для той среды, в которой будет работать приложение. К примеру, если приложение запускается в CloudFoundry, то будет настроено так, чтобы понять, какие сервисы доступны приложению. Обратите внимание, что создание CloudFoundry объекта немного дорогая операция, поэтому вы должны стараться избегать создания нескольких экземпляров. Если вы используете фреймворк с внедрением зависимостей, такой как Spring, то он позаботится об этом, иначе вам придется самим решать эту задачу.

Однажды создав объект облака, мы можем получить информацию об экземпляре приложения, объектах сервиса с использованием различных критериев, а также о соединениях. Допустим, мы хотим получить ServiceInfo объекты для всех сервисов, связанных с приложением, и напечатать JDBC URL для каждого из них, для этого можно использовать следующий шаблон:

List<ServiceInfo> serviceInfos = cloud.getServiceInfos();
for (ServiceInfo serviceInfo : serviceInfos) {
    if (serviceInfo instanceof RelationalServiceInfo) {
        System.out.println(((RelationalServiceInfo) serviceInfo).getJdbcUrl());
    }
}

Этот код напечатает примерно следующее:

jdbc:postgresql://babar.elephantsql.com:5432/tbsonrjm?user=***&password=***

Объекты, полученные из getServiceInfos() и их вариации содержат достаточно информации, такой как URL и учетные данные для соединения с сервисом. В некоторых случаях, полученный ServiceInfo объект может иметь все, что вам нужно для создания необходимого подключения(такого как DataSource). Но в большинстве случаев, вы разрешаете Spring Cloud создавать соответствующее подключение к сервису. К примеру, если вы хотите получить DataSource для «inventory-db» сервиса напрямую, то вы можете использовать следующий шаблон:

DataSource inventoryDataSource = cloud.getServiceConnector("inventory-db", DataSource.class, null);

Это является вариантом использования метода getSingletonServiceConnector(), который вы можете использовать таким образом:

DataSource inventoryDataSource = cloud.getSingletonServiceConnector(DataSource.class, null);

Здесь он вернет DataSource для уникального сервиса реляционной БД, связанного с приложением; если такого сервиса нет или имеется более одного такого сервиса, то он вернёт исключение. Мы подставили null в качестве последнего аргумента в обоих методах, чтобы использовать конфигурацию по умолчанию для создания подключения. Кроме того, вы можете подставить свою конфигурацию, какую захотите. К примеру, определим пул конфигурации, а также параметр подключения к хранилищу, которое должно быть создано.

PoolConfig poolConfig = new PoolConfig(20, 200);
ConnectionConfig connectionConfig = new ConnectionConfig("characterEncoding=UTF-8");
DataSourceConfig serviceConfig = new DataSourceConfig(poolConfig, connectionConfig);
DataSource invetoryDataSource = cloud.getSingletonServiceConnector(DataSource.class, serviceConfig);

И напоследок, метод, который получает информацию о приложении, которое содержит id (зависит от облака, но обычно имя приложения), id экземпляра приложения и др. Давайте же напечатаем эту информацию:

ApplicationInstanceInfo appInstanceInfo = cloud.getApplicationInstanceInfo();
System.out.println("Application id: " + appInstanceInfo.getAppId());
System.out.println("Application instance id: " + appInstanceInfo.getInstanceId());
for (Map.Entry<String, Object> entry: appInstanceInfo.getProperties().entrySet()) {
    System.out.println("Application property: " + entry.getKey() + "=" + entry.getValue());
}

Когда вы выполните этот код в приложении в CloudFoundry, вы получите что-то похожее на текст, приведенный ниже. Если то же приложение запустить в Heroku, то отобразится подобная информация, но немного с другими ключами:

Application id: hello-spring-cloud
Application instance id: 8b523252a9d3478b92750ef27ad4e5b0
Application property: limits={mem=800, disk=1024, fds=16384}
Application property: application_version=b1257c57-2a5c-47aa-8ca7-5e8b6d9a7b9c
Application property: application_name=hello-spring-cloud
Application property: application_uris=[hello-spring-cloud.cfapps.io]
Application property: version=b1257c57-2a5c-47aa-8ca7-5e8b6d9a7b9c
Application property: name=hello-spring-cloud
Application property: space_name=development
Application property: space_id=5f629937-1821-4f48-9eb4-8c67c70c0df0
Application property: application_id=a345f90f-e075-4005-b003-f4ab86ad716a
Application property: instance_id=8b523252a9d3478b92750ef27ad4e5b0
Application property: instance_index=0
Application property: host=0.0.0.0
Application property: port=61023
Application property: start=2014-07-15 21:27:34 +0000
Application property: state_timestamp=1405459654

Это в основном все, что вам нужно знать для программного использования Spring Cloud. В следующей статье мы переключим наше внимание на аспекте расширяемости Spring Cloud. Оставайтесь с нами.

comments powered by Disqus