spring cloud consul中文手冊
Spring Cloud Consul
1.2.0.RELEASE
該專案通過自動配置並繫結到Spring環境和其他Spring程式設計模型成語,為Spring Boot應用程式提供Consul整合。通過幾個簡單的註釋,您可以快速啟用和配置應用程式中的常見模式,並使用基於Consul的元件構建大型分散式系統。提供的模式包括服務發現,控制匯流排和配置。智慧路由(Zuul)和客戶端負載平衡(Ribbon),斷路器(Hystrix)通過與Spring Cloud Netflix的整合提供。
安裝Consul
請參閱安裝文件獲取有關如何安裝Consul指令。
Consul Agent
所有Spring Cloud Consul應用程式必須可以使用Consul Agent客戶端。預設情況下,代理客戶端預計位於localhost:8500
。有關如何啟動代理客戶端以及如何連線到Consul Agent伺服器的叢集的詳細資訊,請參閱代理文件。對於開發人員,在安裝了領事後,您可以使用以下命令啟動Consul Agent:
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">./src/main/bash/local_run_consul.sh</span></span>
這將啟動埠8500上的伺服器模式的代理,其中ui可以在http:// localhost:8500上找到
服務發現與Consul
服務發現是基於微服務架構的關鍵原則之一。嘗試配置每個客戶端或某種形式的約定可能非常困難,可以非常脆弱。Consul通過HTTP API和DNS提供服務發現服務。Spring Cloud Consul利用HTTP API進行服務註冊和發現。這不會阻止非Spring雲應用程式利用DNS介面。Consul代理伺服器在通過八卦協議進行通訊的群集中執行,並使用筏式協議協議。
如何啟用
要啟用Consul服務發現,請使用組org.springframework.cloud
spring-cloud-starter-consul-discovery
的啟動器。有關使用當前Spring雲端列車設定構建系統的詳細資訊,請參閱Spring雲端計算頁面。
註冊Consul
當客戶端註冊Consul時,它提供有關自身的元資料,如主機和埠,ID,名稱和標籤。預設情況下,將建立一個HTTP 檢查,每隔10秒Consul命中/health
端點。如果健康檢查失敗,則服務例項被標記為關鍵。
示例Consul客戶端:
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)"><code class="language-java">@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}</code></span></span>
(即完全正常的Spring Boot應用程式)。如果Consul客戶端位於localhost:8500
以外的位置,則需要配置來定位客戶端。例:
application.yml
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">spring:
cloud:
consul:
host: localhost
port: 8500</span></span>
警告 |
如果您使用Spring Cloud Consul Config,上述值將需要放置在bootstrap.yml 而不是application.yml 中。 |
從Environment
獲取的預設服務名稱,例項ID和埠分別為${spring.application.name}
,Spring上下文ID和${server.port}
。
@EnableDiscoveryClient
使應用程式成為Consul“服務”(即註冊自己)和“客戶端”(即可以查詢Consul查詢其他服務)。
HTTP健康檢查
Consul例項的執行狀況檢查預設為“/ health”,它是Spring Boot Actuator應用程式中有用端點的預設位置。如果您使用非預設上下文路徑或servlet路徑(例如server.servletPath=/foo
)或管理端點路徑(例如management.context-path=/admin
)),則需要更改這些,即使是執行器應用程式。也可以配置Consul用於檢查執行狀況端點的間隔。“10s”和“1m”分別表示10秒和1分鐘。例:
application.yml
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">spring:
cloud:
consul:
discovery:
healthCheckPath: ${management.context-path}/health
healthCheckInterval: 15s</span></span>
元資料和Consul標籤
Consul尚不支援服務元資料。Spring Cloud的ServiceInstance
有一個Map<String, String> metadata
欄位。Spring Cloud Consul使用Consul標籤來近似元資料,直到Consul正式支援元資料。具有key=value
形式的標籤將被分割並分別用作Map
鍵和值。沒有相等=
符號的標籤將被用作鍵和值兩者。
application.yml
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">spring:
cloud:
consul:
discovery:
tags: foo=bar, baz</span></span>
上述配置將導致具有foo→bar
和baz→baz
的地圖。
使Consul例項ID唯一
預設情況下,一個領事實體註冊了一個等於其Spring應用程式上下文ID的ID。預設情況下,Spring應用上下文ID為${spring.application.name}:comma,separated,profiles:${server.port}
。在大多數情況下,這將允許一個服務的多個例項在一臺機器上執行。如果需要進一步的唯一性,使用Spring Cloud可以通過在spring.cloud.consul.discovery.instanceId
中提供唯一的標識來覆蓋此。例如:
application.yml
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">spring:
cloud:
consul:
discovery:
instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}</span></span>
使用這個元資料和在localhost上部署的多個服務例項,隨機值將在那裡進行,以使例項是唯一的。在Cloudfoundry中,vcap.application.instance_id
將在Spring Boot應用程式中自動填充,因此不需要隨機值。
使用DiscoveryClient
Spring Cloud支援Feign(一個REST客戶端構建器),還支援Spring RestTemplate
使用邏輯服務名稱而不是實際的URL。
您還可以使用org.springframework.cloud.client.discovery.DiscoveryClient
,它為Netflix不具體的發現客戶端提供簡單的API,例如
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">@Autowired
private DiscoveryClient discoveryClient;
public String serviceUrl() {
List<ServiceInstance> list = discoveryClient.getInstances("STORES");
if (list != null && list.size() > 0 ) {
return list.get(0).getUri();
}
return null;
}</span></span>
具有Consul的分散式配置
Consul提供了用於儲存配置和其他元資料的鍵/值儲存。Spring Cloud Consul Config是Config Server和Client的替代方案。在特殊的“引導”階段,配置被載入到Spring環境中。預設情況下,配置儲存在/config
資料夾中。根據應用程式的名稱和模擬Spring Cloud Config順序解析屬性的活動配置檔案,建立多個PropertySource
例項。例如,名為“testApp”的應用程式和“dev”配置檔案將建立以下屬性源:
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">config/testApp,dev/
config/testApp/
config/application,dev/
config/application/</span></span>
最具體的物業來源位於頂部,底部最不具體。Properties是config/application
資料夾適用於使用consul進行配置的所有應用程式。config/testApp
資料夾中的Properties僅適用於名為“testApp”的服務例項。
配置當前在應用程式啟動時被讀取。傳送HTTP POST到/refresh
將導致重新載入配置。觀看鍵值儲存(Consul支援))目前不可能,但將來將是此專案的補充。
如何啟用
要開始使用Consul配置,請使用組org.springframework.cloud
和工件id spring-cloud-starter-consul-config
的啟動器。有關使用當前Spring雲端列車設定構建系統的詳細資訊,請參閱Spring雲端計算頁面。
這將啟用將配置Spring Cloud Consul配置的自動配置。
定製
可以使用以下屬性自定義Consul配置:
bootstrap.yml
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">spring:
cloud:
consul:
config:
enabled: true
prefix: configuration
defaultContext: apps
profileSeparator: '::'</span></span>
-
enabled
將此值設定為“false”將禁用Consul配置 -
prefix
設定配置值的基本資料夾 -
defaultContext
設定所有應用程式使用的資料夾名稱 -
profileSeparator
設定分隔符的值,用於使用配置檔案在屬性源中分隔配置檔名稱
配置觀察
Consul配置觀察功能可以利用領事看守鑰匙字首的能力。Config Watch會阻止Consul HTTP API呼叫,以確定當前應用程式是否有任何相關配置資料發生更改。如果有新的配置資料,則會發布重新整理事件。這相當於呼叫/refresh
執行器端點。
要更改Config Watch呼叫的頻率change spring.cloud.consul.config.watch.delay
。預設值為1000,以毫秒為單位。
禁用Config Watch集合spring.cloud.consul.config.watch.enabled=false
。
YAML或Properties配置
儲存與YAML或Properties格式的一組屬性相對於單個鍵/值對可能更為方便。將spring.cloud.consul.config.format
屬性設定為YAML
或PROPERTIES
。例如使用YAML:
bootstrap.yml
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">spring:
cloud:
consul:
config:
format: YAML</span></span>
必須在適當的data
鍵中設定YAML。使用鍵上面的預設值將如下所示:
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">config/testApp,dev/data
config/testApp/data
config/application,dev/data
config/application/data</span></span>
您可以將YAML文件儲存在上述任何鍵中。
您可以使用spring.cloud.consul.config.data-key
更改資料金鑰。
git2consul與配置
git2consul是一個Consul社群專案,將檔案從git儲存庫載入到各個金鑰到Consul。預設情況下,金鑰的名稱是檔案的名稱。分別支援副檔名為.yml
和.properties
的YAML和Properties檔案。將spring.cloud.consul.config.format
屬性設定為FILES
。例如:
bootstrap.yml
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">spring:
cloud:
consul:
config:
format: FILES</span></span>
給定/config
中的以下金鑰,development
配置檔案和應用程式名稱為foo
:
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">.gitignore
application.yml
bar.properties
foo-development.properties
foo-production.yml
foo.properties
master.ref</span></span>
將建立以下屬性來源:
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">config/foo-development.properties
config/foo.properties
config/application.yml</span></span>
每個鍵的值需要是一個格式正確的YAML或Properties檔案。
快速失敗
在某些情況下(如本地開發或某些測試場景)可能會方便,如果不能配置領事,則不會失敗。在bootstrap.yml
中設定spring.cloud.consul.config.failFast=false
將導致配置模組記錄一個警告而不是丟擲異常。這將允許應用程式繼續正常啟動。
Consul重試
如果您希望您的應用程式啟動時可能偶爾無法使用代理商,則可以要求您在發生故障後繼續嘗試。您需要在您的類路徑中新增spring-retry
和spring-boot-starter-aop
。預設行為是重試6次,初始退避間隔為1000ms,指數乘數為1.1,用於後續退避。您可以使用spring.cloud.consul.retry.*
配置屬性配置這些屬性(和其他)。這適用於Spring Cloud Consul配置和發現註冊。
提示 |
要完全控制重試,請使用id為“consulRetryInterceptor”新增RetryOperationsInterceptor 型別的@Bean 。Spring重試有一個RetryInterceptorBuilder ,可以輕鬆建立一個。 |
Spring Cloud Bus與Consul
如何啟用
要開始使用Consul匯流排,請使用組org.springframework.cloud
和工件ID spring-cloud-starter-consul-bus
的啟動器。有關使用當前Spring雲端列車設定構建系統的詳細資訊,請參閱Spring雲端計算頁面。
有關可用的執行機構端點以及如何傳送自定義訊息,請參閱Spring Cloud Bus文件。
斷路器與Hystrix
應用程式可以使用Spring Cloud Netflix專案提供的Hystrix斷路器,將此啟動器包含在專案pom.xml:spring-cloud-starter-hystrix
中。Hystrix不依賴於Netflix Discovery Client。@EnableHystrix
註釋應放置在配置類(通常是主類)上。那麼方法可以用@HystrixCommand
註釋來被斷路器保護。有關詳細資訊,請參閱文件。
使用Turbine和Consul Hystrix指標聚合
Turbine(由Spring Cloud Netflix專案提供),聚合多個例項Hystrix指標流,因此儀表板可以顯示聚合檢視。Turbine使用DiscoveryClient
介面查詢相關例項。要將Turbine與Spring Cloud Consul配合使用與以下示例類似的方式配置Turbine應用程式:
pom.xml
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)"><dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency></span></span>
請注意,Turbine依賴不是起始者。渦輪啟動器包括對Netflix Eureka的支援。
application.yml
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">spring.application.name: turbine
applications: consulhystrixclient
turbine:
aggregator:
clusterConfig: ${applications}
appConfig: ${applications}</span></span>
clusterConfig
和appConfig
部分必須匹配,因此將逗號分隔的服務標識列表放在單獨的配置屬性中是有用的。
Turbine.java
<span style="color:rgba(0, 0, 0, 0.8)"><span style="color:rgba(0, 0, 0, 0.9)">@EnableTurbine
@EnableDiscoveryClient
@SpringBootApplication
public class Turbine {
public static void main(String[] args) {
SpringApplication.run(DemoturbinecommonsApplication.class, args);
}
}</span></span>