В моей предыдущей статье Spring и Amazon Web Services я кратко представил модуль Spring Cloud AWS и то, что вы, как разработчик, можете ожидать от него в данный момент. Одна вещь, которая не очевидна из официальной документации, — это как использовать этот модуль, когда ваше интернет-соединение ограничено прокси-сервером. В этой статье я расскажу, как подходить к передаче конфигурации прокси для конфигурации на основе Java и XML. Этот аспект конфигурации, вероятно, будет рассмотрен в будущих выпусках, однако он может помочь вам сейчас, если вы работаете с этим модулем и вам нужно, чтобы ваше приложение работало с прокси-сервером компании.
Настройка прокси Spring Cloud AWS
Конфигурация Java
Давайте начнем с еще более популярного способа настройки приложений Spring — настройки Java. В этом случае все относительно просто, поскольку вы можете сами указать необходимую конфигурацию прокси в коде. Рассмотрим следующий класс конфигурации, объявляющий две компоненты — конфигурацию клиента и прокси-сервера S3 (если эти параметры не разрешены в файлах свойств / свойствах, по умолчанию будет использоваться соединение без прокси-сервера).
Пример конфигурации клиента S3 из класса ApplicationConfiguration
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
@Configuration@EnableContextInstanceDatapublic final class ApplicationConfiguration { @Value("${proxy.host}") private String proxyHost; @Value("${proxy.port}") private int proxyPort; @Value("${proxy.username}") private String proxyUsername; @Value("${proxy.password}") private String proxyPassword; @Bean public AmazonS3Client amazonS3Client() { return new AmazonS3Client(clientConfiguration()); } @Bean public ClientConfiguration clientConfiguration() { final ClientConfiguration clientConfiguration = new ClientConfiguration(); clientConfiguration.setProxyHost(proxyHost); clientConfiguration.setProxyPort(proxyPort); clientConfiguration.setProxyUsername(proxyUsername); clientConfiguration.setProxyPassword(proxyPassword); return clientConfiguration; }} |
Учитывая значение кода, подобного этому, рассмотрите возможность маркировки этого класса профилем, который используется для запуска приложения на компьютере разработчика, например, @Profile("local") .
Конфигурация XML
Когда речь идет о настройке прокси с использованием конфигурации XML, требуется определенная степень знаний о конфигурации Spring. Чтобы эта простая конфигурация работала, нам нужно создать экземпляр AmazonS3Client с настройками прокси, сохраненными в bean-компоненте конфигурации клиента. Следующий XML-файл показывает всю конфигурацию, поэтому давайте разберем ее на несколько разделов.
beans.xml
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<?xml version="1.0" encoding="UTF-8"?> xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/cloud/aws/context http://www.springframework.org/schema/cloud/aws/context/spring-cloud-aws-context.xsd"> <context:component-scan base-package="com.jakubstas.s3downloader"/> <!-- Bunch of simple configuration switches allowing access to instance metadata, integration of S3 into ResourceLoader and region auto detection. Some of these are not essential for the example however it is always nice to have the information they provide at hand when needed. --> <aws-context:context-instance-data/> <aws-context:context-resource-loader/> <aws-context:context-region auto-detect="true"/> <!-- Configuration of Amazons credentials provider chain to allow execution on developers machine as well as in the Beanstalk environment. --> <aws-context:context-credentials> <aws-context:instance-profile-credentials/> <aws-context:simple-credentials access-key="#{systemProperties['AWS_ACCESS_KEY_ID']}" key="#{systemProperties['AWS_SECRET_KEY']}"/> </aws-context:context-credentials> <!-- Bean with client configuration with passed proxy settings (if these settings are not resolved from property files / properties default no-proxy connection will be used) --> <!-- The client instance created by hand with proxy configuration --> <bean id="amazonS3" class="com.amazonaws.services.s3.AmazonS3Client" autowire-candidate="true" autowire="constructor"/> <!-- Proxy configuration for any AWS related client code - currently used for S3 (but might as well be used for DynamoDB access, ...) --> <bean id="clientConfiguration" class="com.amazonaws.ClientConfiguration"> <property name="proxyHost" value="${proxy.host}"/> <property name="proxyPort" value="${proxy.port}"/> <property name="proxyUsername" value="${proxy.username}"/> <property name="proxyPassword" value="${proxy.password}"/> </bean></beans> |
Учитывая значение кода, подобного этому, рассмотрите возможность маркировки этих компонентов с помощью профиля, используемого для запуска приложения на компьютере разработчика, например profile="local" .
Выходя за пределы S3
Пример до сих пор был в значительной степени ограничен S3. Однако эту конфигурацию можно использовать, когда это применимо, в соответствии с тем, как был разработан Amazon SDK. Давайте посмотрим на пример клиента DynomoDB . Существует несколько клиентов для различных сервисов Amazon AWS, которые могут использовать подход, описанный выше.
Пример конфигурации клиента DynamoDB из класса ApplicationConfiguration
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
@Configuration@EnableContextInstanceDatapublic final class ApplicationConfiguration { @Value("${proxy.host}") private String proxyHost; @Value("${proxy.port}") private int proxyPort; @Value("${proxy.username}") private String proxyUsername; @Value("${proxy.password}") private String proxyPassword; @Bean public AmazonS3 amazonS3Client() { return new AmazonS3Client(clientConfiguration()); } @Bean public AmazonDynamoDBClient amazonDynamoDBClient() { return new AmazonDynamoDBClient(clientConfiguration()); } @Bean public ClientConfiguration clientConfiguration() { final ClientConfiguration clientConfiguration = new ClientConfiguration(); clientConfiguration.setProxyHost(proxyHost); clientConfiguration.setProxyPort(proxyPort); clientConfiguration.setProxyUsername(proxyUsername); clientConfiguration.setProxyPassword(proxyPassword); return clientConfiguration; }} |
Вывод
Передача конфигурации приложения вашим компонентам является довольно стандартной задачей, которая не должна доставлять много хлопот опытному разработчику Spring. Однако, учитывая разный уровень опыта и трудности повседневной жизни разработчика, это может вызвать проблемы. Вот почему я рекомендую всем попробовать эти примеры самостоятельно, поскольку смоделированная здесь ситуация использует один из фундаментальных подходов к проектированию конфигурации Spring. Продолжайте практиковать и держите корпоративный прокси на расстоянии. 🙂
| Ссылка: | Spring Cloud AWS с настройками прокси от нашего партнера JCG Якуба Стаса в блоге |