Spring Cloud Bindings の Bindings をコンテナ化にせずアクセスする

Spring Cloud Bindings をコンテナ化せずに利用する方法を記載します。

流れとしては以下の順です。

  • 必要な System Property を設定する
  • SERVICE_BINDING_ROOT 環境変数の設定
  • pom.xml のアップデート
  • (オプショナル) 自作のBindingsを作る

Service Bindings そのものについては以下のとおり。

https://servicebinding.io/

必要な System Property を設定する

Spring Boot 起動時に、System Propery を以下の値を設定する

1org.springframework.cloud.bindings.boot.enable=true

Intellij などを使う場合は以下のように設定する。 Run → Edit Configurations... 以下の設定をいれる。

SERVICE_BINDING_ROOT の環境変数を設定する

Service Bindings の開始ディレクトリーを設定する。

Intellij などを使う場合は以下のように設定する。 Run → Edit Configurations... 以下の設定をいれる。

pom.xml のアップデート

必要な依存関係は以下のように追加する。 この際<spring-cloud-bindings.version> の値は更新する

 1  <properties>
 2    ...
 3    <spring-cloud-bindings.version>1.10.0</spring-cloud-bindings.version>
 4    ...
 5  </properties>
 6  <dependencies>
 7      ...
 8      <dependency>
 9          <groupId>org.springframework.cloud</groupId>
10          <artifactId>spring-cloud-bindings</artifactId>
11          <version>${spring-cloud-bindings.version}</version>
12      </dependency>
13     ...
14  </dependencies>
15  <repositories>
16        ...
17        <repository>
18            <id>spring-releases</id>
19            <url>https://repo.spring.io/release/</url>
20            <releases>
21                <enabled>true</enabled>
22            </releases>
23            <snapshots>
24                <enabled>false</enabled>
25            </snapshots>
26        </repository>
27        ...
28  </repositories>
29  <build>
30        <plugins>
31            <plugin>
32                <groupId>org.springframework.boot</groupId>
33                <artifactId>spring-boot-maven-plugin</artifactId>
34                <configuration>
35                    <excludes>
36                        <exclude>
37                            <groupId>org.springframework.cloud</groupId>
38                            <artifactId>spring-cloud-bindings</artifactId>
39                        </exclude>
40                    </excludes>
41                </configuration>
42            </plugin>
43        </plugins>
44  </build>

なお以下のブロックをいれておかないと、のちにコンテナ化する際に、Spring Bootのビルドパックの更新の動きと衝突してエラーになる。

1<configuration>
2    <excludes>
3        <exclude>
4            <groupId>org.springframework.cloud</groupId>
5            <artifactId>spring-cloud-bindings</artifactId>
6        </exclude>
7    </excludes>
8</configuration>

(オプショナル) 自作のBindingsを作る

ここまで設定すれば、あとは自作のBindingsを作ることも可能になる。 例えば、以下のようなコードを用意する。

 1package jp.vmware.tanzu.twitterwordclouddemo.utils;
 2
 3import org.jetbrains.annotations.NotNull;
 4import org.springframework.cloud.bindings.Binding;
 5import org.springframework.cloud.bindings.Bindings;
 6import org.springframework.cloud.bindings.boot.BindingsPropertiesProcessor;
 7import org.springframework.core.env.Environment;
 8
 9import java.util.List;
10import java.util.Map;
11
12public class TwitterBindingsPropertiesProcessor implements BindingsPropertiesProcessor {
13
14	public static final String TYPE = "twitter";
15
16	@Override
17	public void process(Environment environment, @NotNull Bindings bindings, @NotNull Map<String, Object> properties) {
18		if (!environment.getProperty("jp.vmware.tanzu.bindings.boot.twitter.enable", Boolean.class, true)) {
19			return;
20		}
21		List<Binding> myBindings = bindings.filterBindings(TYPE);
22		if (myBindings.size() == 0) {
23			return;
24		}
25		properties.put("twitter.bearer.token", myBindings.get(0).getSecret().get("bearer-token"));
26	}
27
28}

さらに META-INF/spring.factories を以下のように作成する

1org.springframework.cloud.bindings.boot.BindingsPropertiesProcessor=jp.vmware.tanzu.twitterwordclouddemo.utils.TwitterBindingsPropertiesProcessor

そして、以下のようなディレクトリー構成を SERVICE_BINDING_ROOT で設定したディレクトリに配置すれば、起動時にService Bindings が有効になる。