この記事REVIEW:
- 春クラウドコンフィグ基本的な概念
- 春クラウドコンフィグクライアントのロード処理
- 春の雲Configメッセージベースのバス構成
- 春の雲コンフィグプレースホルダ
- 春クラウドコンフィグ倉庫のベストプラクティス
- 春クラウドコンフィグヘルスチェック問題分析
本論文では、春の雲コンフィグの基本的な概念を説明した構成を実践し、発生した問題を分析します。Configuration Centerを実行を開始する方法についての公式のデモを参照することができます。
本明細書中で使用される春のクラウド版:Edgware.SR3
春クラウドコンフィグ基本的な概念
インフラストラクチャおよびサービスアプリケーションが集中マイクロ外部の分散システム・コンフィギュレーション・サポートを提供するためのスプリングクラウド構成が使用されます。
- サーバ:分散構成センター、独立したマイクロサービスアプリケーション、倉庫(GIT)を接続するために使用されるコンフィギュレーションとは、暗号化/復号化アクセスインタフェースをクライアント構成情報を提供します。、
- クライアント:構成管理アプリケーションリソースセンターおよびビジネス関連の設定内容を指定して各マイクロサービスアプリケーションとインフラストラクチャ、取得および設定中心から開始負荷設定情報のマイクロサービスアーキテクチャ
SCC効果:
抽象マッピングサーバとクライアントの環境変数と構成プロパティを達成するために。
SCCの利点:
デフォルトのコンフィギュレーション情報は、GIT、バージョン管理、構成情報のネイティブサポートを使用して格納されます。
春の雲コンフィグチャート:
図メッセージバスベースのアーキテクチャ:
上記のように、図役割のアーキテクチャのいくつかの重要な要素:
リモートGITリポジトリ:
コンフィギュレーション・ファイルを格納する場所。
構成サーバー:
位置及び倉庫の接続に分散構成の中心、マイクロ指定されたサービスアカウントのパスワードおよびその他の情報。
ローカルGITリポジトリ:
構成サーバーのファイルシステムでは、各時間の設定情報については、顧客の注文、コンフィグサーバGITリポジトリ読み、ローカルのgitリポジトリの要求に戻り、その後、地元から最新の設定を取得します。リモートリポジトリが得られない場合に、ローカルレポジトリコンテンツに直接戻されます。
サーバーA / B:
特定のマイクロサービスアプリケーションは、彼らはあなたがしたいアプリケーションの外部設定情報を達成するために、構成サーバーアドレスを指定します。アプリケーションの起動時に読み込まれる構成サーバーへの設定情報の要求を開始します。
メッセージセンター:
第2のメッセージベースのアプローチは、現在カフカ、RabbitMQのをサポートし、外部MQ成分に依存し、バスの概略図です。流通センター/バス/リフレッシュエンドポイントによって提供されるコンフィギュレーションサーバは、クライアントはHTTPの形でインターフェースを介してプル構成構成サーバーからメッセージを受信し、プロデューサーとしてメッセージを送信します。
サービスレジストリ:
構成サーバーは、ユーレカとして、サービスレジストリに登録することができ、クライアントは完全な健康診断にサービスレジストリは、[構成サーバーによってコンフィグServerサービスのリストを検索し、リモートの設定情報を取得します。
春クラウドコンフィグクライアントのロード処理
クライアント・アプリケーションは、構成管理から設定実行フローを取得します。
1)アプリケーションは、構成情報の構成サーバの要求に、アプリケーション名bootstrap.yml構成{アプリケーション}、コンテキスト名{プロファイル}、支店名{ラベル}に応じて、開始時。
2)構成サーバーの構成情報を見つけるために、位置合わせの上に自分の端末構成パスを維持するために、顧客とのGITリポジトリの情報によると。
3)のgit cloneコマンドにより、あなたは設定が構成サーバー・ファイル・システム(ローカルGITリポジトリ)にダウンロードされています
4)コンフィグServerは、春のApplicationContextインスタンスを作成し、ローカルのgitリポジトリから設定ファイルをロードし、そして最終的に戻って、クライアントアプリケーションに対する設定内容を読み込みます。
5)クライアント・アプリケーションを取得した後そうロードされませんジャーパッケージの内容に繰り返し、外部の構成例ApplicationContextのクライアント、内部構成ジャークライアント構成パッケージの内容のコンテンツよりも優先度の高いコンテンツにロードされます。
春の雲Configメッセージベースのバス構成
コンフィギュレーション・センターのpom.xmlとして構成サーバーの導入しました:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
構成サーバーの設定ファイル(YML形式):
server:
port: ${CONFIG_SERVER_PORT:8021}
spring:
application:
name: letv-mas-config
# 配置了该项,访问/bus/refresh?destination=应用名:spring.application.index,如果未指定spring.application.index默认使用「应用名:server.port」
index: ${CONFIG_SERVER_IP:127.0.0.1}
cloud:
config:
server:
git:
# 基于 http 协议的单仓库,每一个应用创建一个目录,每个目录下创建配置文件
uri: ${GIT_URI:http://xxxx/config.git}
search-paths: '{application}'
# 配置的 Git 仓库基于 http 协议的,必须配置用户名和密码
username: ${GIT_USERNAME:config_server}
password: ${GIT_PASSWORD:config@123}
# 本地仓库目录设定
basedir: /letv/app/mas/config/repos
# 本地仓库如果有脏数据,则会强制拉取(默认是false)
force-pull: true
# 配置中心启动后从 GIT 仓库下载,如果uri配置中使用了 {application} 作为仓库名,这里要使用默认值false,否则启动报错.
clone-on-start: false
management:
security:
enabled: false
# 用户认证,客户端应用接入时加入安全认证配置
security:
user:
name: config
password: config2018
basic:
enabled: true
# 基于消息总线的 MQ 配置
spring:
cloud:
stream:
kafka:
binder:
zk-nodes: ${ZK_NODES:localhost:2181}
brokers: ${KAFKA_BROKERS:localhost:9092}
requiredAcks: -1
configuration:
security:
protocol: SASL_PLAINTEXT
sasl:
mechanism: PLAIN
jaas:
loginModule: org.apache.kafka.common.security.plain.PlainLoginModule
options:
username: test
password: test-secret
# 开启跟踪事件消息(默认是false)
bus:
trace:
enabled: true
# 自定义 topic 主题
destination: test.springcloud.config
導入されたクライアントのpom.xmlとして設定クライアント:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
コンフィグクライアントプロファイル(YML形式):
spring:
application:
name: letv-mas-client
index: ${CLIENT_SERVER_IP:127.0.0.1}:${server.port}
profiles:
active: ${CLIENT_PROFILE:default}
#include: busdev,streamdev
cloud:
config:
uri: ${CONFIG_SERVER_DOMAIN:http://config.xxx.cn/}
failFast: true #the client will halt with an Exception
enabled: true
# boostrap.yml 配置优先于启动参数变量 spring.profiles.active
profile: ${spring.profiles.active:${CLIENT_PROFILE:default}}
label: master
# 访问配置中心,用户安全认证
username: config
password: config2018
# 激活定时任务,当 GIT 版本发生变更后加载最新配置上下文
watcher:
enabled: true
security:
user:
name: config
password: config2018
# 基于消息总线的 MQ 配置( Kakfa 队列),如果zipkin中也使用 Kafka 队列,那么需要通过binder 形式配置做隔离,否则会互相影响,无法下发配置消息。
spring:
cloud:
stream:
# 自定义开关
enabled: true
# 指定中间件
default-binder: config-kafka
binders:
config-kafka:
type: kafka
environment:
spring:
cloud:
stream:
kafka:
binder:
zkNodes: ${ZK_NODES:localhost:2181}
brokers: ${KAFKA_BROKERS:localhost:9092}
# 生产者确认,0、1、-1,默认为1。0为不确认,1为leader单确认,-1为同步副本确认。-1的情况下消息可靠性更高。
required-acks: -1
# 是否自动创建topic,默认为true。设为false的情况下,依赖手动配置broker相关topic>配置,如果topic不存在binder则无法启动。
auto-create-topics: true
configuration:
security:
protocol: SASL_PLAINTEXT
sasl:
mechanism: PLAIN
jaas:
loginModule: org.apache.kafka.common.security.plain.PlainLoginModule
options:
username: test
password: test-secret
bus:
# 是否启用bus
enabled: true
# Bus 使用的队列或 Topic,Kafka 中的 topic,Rabbitmq 中的 queue
destination: test.springcloud.config
trace:
# 是否启用 Bus 事件跟踪,可以通过 /trace 页面查看
enabled: true
refresh:
# 是否发送 refresh 事件,开启时支持基于 config 文件变更的动态配置
enabled: true
env:
# 是否开启 env 事件,开启时支持直接动态配置相应环境变量,如 /bus/env?arg1=value1&arg2=value2
enabled: true
春の雲コンフィグプレースホルダ
プレースホルダを使用します:
ここで設定構成サーバーを取得するクライアントが要求を開始したとき、{アプリケーション}は、アプリケーションの名前を表し、構成サーバは、クライアントによるspring.application.nameのリソース構成の格納位置情報を検索する{アプリケーション}プレースホルダを充填されます。
注:{ラベル}パラメータが非常に特別で、「/」が含まれているGITブランチやタグならば、{ラベル}パラメータを使用したHTTP URLに適用されている「(_)」また、URIの意味を変えないようにするには、リソースの別のURIを指しています。
なぜプレースホルダがあるはず?
個々のマイクロサービスアプリケーションの構成ファイルを保存するために物流センターとしてGITを使用する場合は、プレースホルダを使用するURIは、一般的な倉庫の構成を計画し、実装するために私たちを助けることができます。
春クラウドコンフィグ倉庫のベストプラクティス
:ローカルリポジトリ
/ mlの/ 9rww8x69519fwqlwlt5jrx700000gqデフォルトの/ var /フォルダに保存されているバージョンにクラウドDの春、E / T / configの-レポ2486127823875015066 ディレクトリ。
バージョンBでは、実際に一時ディレクトリを/ tmp / configに-repo-乱数ディレクトリに保存され、テストされていません。
いくつかの予測不可能な問題を避けるために、我々は、固定されたローカルgitリポジトリのディレクトリを設定します。
spring.cloud.config.server.git.basedir=${user.home}/local-config-repo
構成サーバーが起動した後、ディレクトリ$ {のuser.home}はローカル・コンフィグ・レポが存在しないことが判明した場合、それが自動的に作成され、リモートのgitリポジトリからこの場所に保存されたコンフィギュレーションをダウンロードします。
リモートストレージ・プラクティス:
単一のリポジトリディレクトリ:
各プロジェクトは倉庫に対応します
spring.cloud.config.server.git.uri=https://gitee.com/ldwds/{application}
マルチ倉庫ディレクトリ:
同じ倉庫の下で、各プロジェクトのディレクトリ
spring.cloud.config.server.git.uri=https://gitee.com/ldwds/config-repo-demo.git
spring.cloud.config.server.git.search-paths='{application}'
1)単一のリポジトリのディレクトリ注意:
spring.cloud.config.server.git.uri=[https://gitee.com/ldwds/config-repo-demo/](https://gitee.com/ldwds/config-repo-demo/)
spring.cloud.config.serversearch-paths:’{application}'
元のクライアントアプリケーションの起動、サブディレクトリを作成し、サブディレクトリ名を設定-レポデモ倉庫で設定で指定されたspring.application.nameアプリケーション名です。
次のようにそれ以外の場合は、プロジェクトに参照プロパティが見つからない場合、エラーが報告されます。
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'from' in value "${from}"
2)マルチ倉庫ディレクトリ注:
このようにパラメータを設定することができない
spring.cloud.config.server.git.force-pull=true
し、spring.cloud.config.server.git.clone-on-start=true
そうでなければ与えられる開始され、またよくためのプレースホルダとして{applicatoin}を使用するものと理解される、倉庫の特定の名前を指定していない、リモートリポジトリ設定を引っ張る強制することはできません。
次のようなローカルリポジトリのディレクトリ設定した場合はspring.cloud.config.server.git.basedir=/data/config-repos/local-config-repo
コンフィグサーバを自動的に/データ/コンフィグ-reposのディレクトリを作成し、倉庫という名前の設定-repo-乱数リストを作成を開始し、これの倉庫の内容は、デフォルトの倉庫ヘルスチェックアプリから来ています。
クライアントアプリケーションは{アプリケーション}アプリケーション名を見つけるために倉庫によれば、起動後、マッチから構成サーバーは、CONFIG-repo-乱数下のGitリポジトリとディレクトリを複製します。
キャッシュする前に何のリポジトリ名がないため、構成サーバーを再起動する場合は、/バス/リフレッシュリフレッシュ構成を介してクライアント・アプリケーションは、それが自動的にGitのクローンからリポジトリのディレクトリの設定-repo-乱数とデータを作成します。
コンフィグServerはローカル倉庫、再起動やコンフィグサーバがないクライアント/バス/リフレッシュリフレッシュ構成されている場合、新しい倉庫を再確立します。
地元の物流センターの倉庫の原則の実装:
BASEDIRの.gitディレクトリの下に存在するかどうかに応じて地元の倉庫には、隠しファイルが含まれています。ローカルデポは、データウェアハウスの遠位端から地元のクローンに、存在しない場合は、ローカルの倉庫がある場合に、倉庫は、ローカルに、リモートからの最新のデータを取得し、その後、チェックアウトは、ラベルを指定し、リモート倉庫からのデータをマージし、現在のラベルの最新のブランチを取得しますHEADのバージョン、および環境情報として、デフォルトのアプリケーション名アプリリターン。
春クラウドコンフィグヘルスチェック問題分析
ヘルスチェックのpom.xmlを導入しました:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
デフォルトのヘルスチェックで依存を追加した後。無ヘルスチェックする場合は、できるspring.cloud.config.server.health.enabled=false
パラメータの設定を閉じます。
設定がされている場合:spring.cloud.config.server.git.uri=[https://gitee.com/ldwds/config-repo-demo.git](https://gitee.com/ldwds/config-repo-demo.git)
デフォルトのヘルスチェックで有効になって、私はアプリをチェックアプリのデフォルトの名前だと思うようになった、デフォルトとしてプロファイル、ラベルはヌルモニター(ソースコードを参照)です。
しかし、GITリポジトリ設定アプリの下で、そして/健康を訪問し、モニターの状態がまだUPでは適用されませんか?
{
"status": "UP"
}
この理解は、以下のような理由が間違っています:
倉庫指定されたアドレスがある場合GITリポジトリ指定されたアドレスの主流通センターは、関係を有する https://gitee.com/ldwds/ {アプリケーション}、{アプリケーション}モニターをチェックが倉庫アドレスとしてデフォルトのアプリケーション名アプリに置き換えられますこの場合、ディレクトリ内のローカルリポジトリアプリケーション{アプリケーション} {}のuser.homeとしてCONFIG-repo-乱数を作成中(例えば:/ユーザ/ liudewei1228 / CONFIG-レポ7949870192520306956)。
セットがあっても
spring.config.server.git.basedir=${user.home}/local-config-repo/
に使用されることはありません。
なぜ?倉庫として{アプリケーション}は、動的であるので、それはローカル倉庫のような特定のディレクトリBASEDIRを使用しないように、複数{アプリケーション}倉庫プロジェクトが存在してもよいです。
次のパラメータは、構成ヘルスチェックを設定します。
spring.cloud.config.server.health.repositories.config-repo-demo.name=应用名
spring.cloud.config.server.health.repositories.config-repo-demo.label=分支
spring.cloud.config.server.health.repositories.config-repo-demo.profiles=环境变量
環境状態情報は、任意の異常状態が(例えば倉庫としてNoSuchRespositoryExceptionを見つけることができません)が表示されます。この手順で上下に表示される検索。
ウリは、次のケースとして倉庫に{アプリケーション}を含む、クライアント・アプリケーションは、それ以外の場合は有効にすることはできません原因となる、開口部の前に事前に倉庫として良いspring.application.name = configのクライアントアプリケーション名を作成する必要があります。({アプリケーション}プロジェクトは倉庫ではなく、ディレクトリであると考えられるため)。
ソースを参照してください:ConfigServerHealthIndicator.javaのdoHealthCheck方法。
正しく構成され、倉庫名、ラベル、プロファイルは、アクセス/健康・インタフェースが表示源は、このアドレスでの情報源にアクセスしますが、ロゴの実際の影響することはできません。
アクセス/健康結果:
{
"status": "UP",
"repositories": [
{
"sources": [
"https://gitee.com/ldwds/config-repo-demo/config-client/config-client.properties";
],
"name": "config-client",
"profiles": [
"default"
],
"label": "master"
}
]
}
それ以外の場合は、指定された倉庫を見つけることができない情報は、次の情報のみが表示されます。
{
"status": "UP",
"repositories": [
{
"name": "config-client",
"profiles": [
"default"
],
"label": "master"
}
]
}
最新の春クラウドConfigが、我々はより多くの理解を学ぶために公式サイトを組み合わせることができ、多くの問題を改善しました。
本論文では、春の雲コンフィグ(春クラウドEバージョン)ベースのコンフィギュレーションの基本的な概念は、健康診断で遭遇メッセージバス、倉庫カタログの練習、練習、練習問題を分析した使用しています、私たちは友人のこの構成の中心部を使用したいです彼らは助けます。
アポロ流通センター(Ctripのオープンソース)、ナコス登録&コンフィギュレーション・センター(アリババオープンソース):マイクロサービスアーキテクチャの現在の選択は、国内のオープンソース・コンフィギュレーション・センターを使用することを推奨されている場合。
私は〜あなたと一緒に成長し、よりエキサイティングな記事のロックを解除し、スキャンコードは、関係、公共の数の関心を歓迎します