Spring Cloud構成の概要

Spring Cloud設定のクイックイントロ

1. 概要

Spring Cloud Configは、複数のアプリケーションと環境に分散した構成を保存および提供するためのSpringのクライアント/サーバーアプローチです。

この構成ストアは、理想的にはGitバージョン管理の下でバージョン管理され、アプリケーションの実行時に変更できます。 サポートされているすべての構成ファイル形式とEnvironmentPropertySource or @Valueなどの構成を使用するSpringアプリケーションに非常によく適合しますが、任意のプログラミング言語を実行する任意の環境で使用できます。

この記事では、Gitでバックアップされた構成サーバーをセットアップし、それを単純なRESTアプリケーションサーバーで使用し、暗号化されたプロパティ値を含む安全な環境をセットアップする方法の例に焦点を当てます。

2. プロジェクトの設定と依存関係

コードを書く準備をするために、最初に2つの新しいMavenプロジェクトを作成します。 サーバープロジェクトは、spring-cloud-config-serverモジュール、およびspring-boot-starter-securityspring-boot-starter-webのスターターバンドルに依存しています。


    org.springframework.cloud
    spring-cloud-config-server
    1.1.2.RELEASE


    org.springframework.boot
    spring-boot-starter-security
    1.4.0.RELEASE


    org.springframework.boot
    spring-boot-starter-web
    1.4.0.RELEASE

ただし、クライアントプロジェクトの場合、必要なのはspring-cloud-starter-configspring-boot-starter-web modulesだけです。


    org.springframework.cloud
    spring-cloud-starter-config
    1.1.2.RELEASE


    org.springframework.boot
    spring-boot-starter-web
    1.4.0.RELEASE

3. 構成サーバーの実装

アプリケーションの主要部分は構成クラス(より具体的には@SpringBootApplication)であり、auto-configureアノテーション@EnableConfigServer:を介して必要なすべてのセットアップを取り込みます。

@SpringBootApplication
@EnableConfigServer
public class ConfigServer {

    public static void main(String[] arguments) {
        SpringApplication.run(ConfigServer.class, arguments);
    }
}

次に、サーバーがリッスンしているサーバーportと、バージョン管理された構成コンテンツを提供するGit-urlを構成する必要があります。 後者は、ローカルファイルシステム上のhttpssh、または単純なfileなどのプロトコルで使用できます。

Tip:同じ構成リポジトリを指す複数の構成サーバーインスタンスを使用することを計画している場合は、リポジトリをローカルの一時フォルダーに複製するようにサーバーを構成できます。 ただし、2要素認証を備えたプライベートリポジトリには注意してください。取り扱いが困難です。 そのような場合、ローカルファイルシステムでそれらを複製し、コピーを操作する方が簡単です。

使用可能なrepository-urlを構成するためのplaceholder variables and search patternsもいくつかあります。しかし、これは私たちの記事の範囲を超えています。 興味のある方は、公式文書を始めるのに適した場所です。

また、アプリケーションを再起動するたびに自動生成されるパスワードを回避するために、application.propertiesBasic-Authenticationのユーザー名とパスワードを設定する必要があります。

server.port=8888
spring.cloud.config.server.git.uri=ssh://localhost/config-repo
spring.cloud.config.server.git.clone-on-start=true
security.user.name=root
security.user.password=s3cr3t

4. 構成ストレージとしてのGitリポジトリ

サーバーを完成させるには、構成されたURLの下でGitリポジトリを初期化し、いくつかの新しいプロパティファイルを作成し、それらをいくつかの値で一般化する必要があります。

構成ファイルの名前は、通常のSpringapplication.propertiesのように構成されますが、「アプリケーション」という単語の代わりに、構成された名前です。 クライアントのプロパティ‘spring.application.name'の値が使用され、その後にダッシュとアクティブなプロファイルが続きます。 例えば:

$> git init
$> echo 'user.role=Developer' > config-client-development.properties
$> echo 'user.role=User'      > config-client-production.properties
$> git add .
$> git commit -m 'Initial config-client properties'

Troubleshooting:ssh関連の認証の問題が発生した場合は、sshサーバーで~/.ssh/known_hosts~/.ssh/authorized_keysを再確認してください。

5. 構成の照会

これで、サーバーを起動できます。 サーバーが提供するGit-backed構成APIは、次のパスを使用してクエリできます。

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

{label}プレースホルダーはGitブランチを参照し、{application}はクライアントのアプリケーション名を参照し、{profile}はクライアントの現在アクティブなアプリケーションプロファイルを参照します。

したがって、ブランチmasterの開発プロファイルで実行されている計画された構成クライアントの構成を次の方法で取得できます。

$> curl http://root:[email protected]:8888/config-client/development/master

6. クライアントの実装

次に、クライアントの世話をしましょう。 これは非常に単純なクライアントアプリケーションであり、1つのGETメソッドを持つRESTコントローラーで構成されます。

サーバーをフェッチするための構成は、bootstrap.applicationという名前のリソースファイルに配置する必要があります。これは、このファイル(名前が示すように)がアプリケーションの起動中の非常に早い段階で読み込まれるためです。

@SpringBootApplication
@RestController
public class ConfigClient {

    @Value("${user.role}")
    private String role;

    public static void main(String[] args) {
        SpringApplication.run(ConfigClient.class, args);
    }

    @RequestMapping(
      value = "/whoami/{username}",
      method = RequestMethod.GET,
      produces = MediaType.TEXT_PLAIN_VALUE)
    public String whoami(@PathVariable("username") String username) {
        return String.format("Hello!
          You're %s and you'll become a(n) %s...\n", username, role);
    }
}

アプリケーション名に加えて、アクティブなプロファイルと接続の詳細もbootstrap.propertiesに入れます。

spring.application.name=config-client
spring.profiles.active=development
spring.cloud.config.uri=http://localhost:8888
spring.cloud.config.username=root
spring.cloud.config.password=s3cr3t

テストするために、構成がサーバーから適切に受信され、role valueがコントローラーメソッドに挿入された場合、クライアントの起動後に単純にカールします。

$> curl http://localhost:8080/whoami/Mr_Pink

応答が次の場合、Spring Cloud Config Serverとそのクライアントは今のところ正常に動作しています。

Hello! You're Mr_Pink and you'll become a(n) Developer...

7. 暗号化と復号化

Requirement:Springの暗号化および復号化機能とともに暗号的に強力なキーを使用するには、JVM.‘Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files'をインストールする必要があります。これらは、たとえばOracleからダウンロードできます。 インストールするには、ダウンロードに含まれている指示に従ってください。 一部のLinuxディストリビューションは、パッケージマネージャーを通じてインストール可能なパッケージも提供します。

構成サーバーはプロパティ値の暗号化と復号化をサポートしているため、ユーザー名やパスワードなどの機密データのストレージとしてパブリックリポジトリを使用できます。 サーバーが対称鍵または鍵ペアを使用するように構成されている場合、暗号化された値には文字列{cipher}のプレフィックスが付き、パス‘/encrypt'へのREST呼び出しによって生成できます。

復号化するエンドポイントも利用可能です。 両方のエンドポイントは、アプリケーションの名前とその現在のプロファイルのプレースホルダーを含むパスを受け入れます:‘/*/{name}/{profile}'。 これは、クライアントごとに暗号化を制御する場合に特に便利です。 ただし、それらが有用になる前に、次のセクションで行う暗号化キーを構成する必要があります。

Tip:curlを使用して暗号化/復号化APIを呼び出す場合は、(–data/-dの代わりに)–data-urlencodeオプションを使用するか、「Content-Type」ヘッダーを明示的に設定することをお勧めします。 ‘text/plain'。 これにより、暗号化された値の「+」などの特殊文字が正しく処理されます。

クライアントを介したフェッチ中に値を自動的に復号化できない場合、そのkeyは名前自体に名前が変更され、先頭に「invalid」という単語が付けられます。 これにより、たとえば、暗号化された値をパスワードとして使用することを防止できます。

Tip: YAMLファイルを含むリポジトリを設定するときは、暗号化されてプレフィックスが付けられた値を一重引用符で囲む必要があります。 プロパティでは、これは当てはまりません。

7.1. キー管理

構成サーバーは、デフォルトで対称または非対称の方法でプロパティ値を暗号化できるようになっています。

To use symmetric cryptographyの場合、application.propertiesのプロパティ‘encrypt.key'を選択したシークレットに設定するだけです。.または、環境変数ENCRYPT_KEYを渡すこともできます。 。

For asymmetric cryptographyの場合、‘encrypt.key'PEMでエンコードされた文字列値に設定するか、使用するkeystoreを構成できます。

デモサーバーには高度にセキュリティ保護された環境が必要なため、後者のオプションを選択し、RSAキーペアを含む新しいキーストアをJavakeytoolを最初に生成します。

$> keytool -genkeypair -alias config-server-key \
       -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \
       -dname 'CN=Config Server,OU=Spring Cloud,O=example' \
       -keypass my-k34-s3cr3t -keystore config-server.jks \
       -storepass my-s70r3-s3cr3t

その後、作成したキーストアをサーバーのapplication.propertiesに追加し、再実行します。

encrypt.key-store.location=classpath:/config-server.jks
encrypt.key-store.password=my-s70r3-s3cr3t
encrypt.key-store.alias=config-server-key
encrypt.key-store.secret=my-k34-s3cr3t

次のステップとして、暗号化エンドポイントを照会し、値をレスポンスとしてリポジトリ内の構成に追加できます。

$> export PASSWORD=$(curl -X POST --data-urlencode d3v3L \
       http://root:[email protected]:8888/encrypt)
$> echo "user.password=$PASSWORD" >> config-client-development.properties
$> git commit -am 'Added encrypted password'
$> curl -X POST http://root:[email protected]:8888/refresh

テストするために、セットアップが正しく機能する場合は、ConfigClientクラスを変更して、クライアントを再起動します。

@SpringBootApplication
@RestController
public class ConfigClient {

    ...

    @Value("${user.password}")
    private String password;

    ...
    public String whoami(@PathVariable("username") String username) {
        return String.format("Hello!
          You're %s and you'll become a(n) %s, " +
          "but only if your password is '%s'!\n",
          username, role, password);
    }
}

構成値が正しく復号化されている場合、クライアントに対する最終クエリは次のように表示されます。

$> curl http://localhost:8080/whoami/Mr_Pink
Hello! You're Mr_Pink and you'll become a(n) Developer, \
  but only if your password is 'd3v3L'!

7.2. 複数のキーを使用する

暗号化と復号化に複数のキーを使用する場合、たとえば、提供されるアプリケーションごとに専用のキーを使用する場合は、{cipher}プレフィックスとBASE64の間に\{name:value}の形式で別のプレフィックスを追加できます。 )sでエンコードされたプロパティ値。

構成サーバーは、\{secret:my-crypto-secret}\{key:my-key-alias}などのプレフィックスをほとんどすぐに理解します。 後者のオプションでは、application.propertiesに構成済みのキーストアが必要です。 このキーストアは、一致するキーエイリアスを検索します。 例えば:

user.password={cipher}{secret:my-499-s3cr3t}AgAMirj1DkQC0WjRv...
user.password={cipher}{key:config-client-key}AgAMirj1DkQC0WjRv...

キーストアのないシナリオでは、ルックアップを処理し、各キーのTextEncryptor-Objectを返すタイプTextEncryptorLocator@Beanを実装する必要があります。

7.3. 暗号化されたプロパティの提供

サーバー側の暗号化を無効にし、プロパティ値の復号化をローカルで処理する場合は、サーバーのapplication.propertiesに次のように入力できます。

spring.cloud.config.server.encrypt.enabled=false

さらに、他のすべての「encrypt。*」プロパティを削除して、RESTエンドポイントを無効にすることができます。

8. 結論

これで、構成サーバーを作成して、Gitリポジトリからクライアントアプリケーションに構成ファイルのセットを提供できるようになりました。 このようなサーバーでできることは他にもいくつかあります。

例えば:

  • プレースホルダーも解決された状態で、JSON –の代わりにYAMLまたはProperties形式で構成を提供します。 これは、構成がPropertySourceに直接マップされていない非Spring環境で使用する場合に役立ちます。

  • プレーンテキストの構成ファイルを提供します。オプションで、解決されたプレースホルダーを使用します。 これは、たとえば、環境に依存するロギング構成を提供するのに役立ちます。

  • 構成サーバーをアプリケーションに埋め込みます。アプリケーションは、クライアントにサービスを提供するスタンドアロンアプリケーションとして実行するのではなく、Gitリポジトリから構成します。 したがって、ユースケースに応じて、一部のブートストラッププロパティを設定するか、@EnableConfigServerアノテーションを削除する必要があります。

  • Spring Netflix Eurekaサービス検出で構成サーバーを使用可能にし、構成クライアントで自動サーバー検出を有効にします。 これは、サーバーに固定の場所がない場合、またはその場所で移動する場合に重要になります。

最後に、この記事on Githubのソースコードを見つけます。