Eureka 2.0 開源工做宣告中止,對於註冊中心來講 Consul 是個更好的選擇。html
在本場 Chat 中你能夠學到的:node
瞭解和搭建 Consul 服務;
Spring Cloud Consul 服務發現;
Spring Coud Consul 配置管理和配置刷新;
使用 Docker 搭建 Consul 集羣;
Consul 負載均衡;
Spring Cloud Consul配置項整理。
在本場 Chat 旨在幫助你們更加深刻了解和使用 Consul。結合 Spring Cloud 完成微服務的註冊發現和配置管理。linux
Consul 介紹和安裝web
Consul 是什麼算法
Consul 是一個支持多數據中心分佈式高可用的服務發現和配置共享的服務軟件,採用 Go 語言開發。spring
Consul 支持健康檢查,並容許 HTTP 和 DNS 協議調用 API 存儲鍵值對。Consul 採用 Raft 一致性協議算法,來保證服務的高可用;使用 GOSSIP 協議管理成員和廣播消息,而且支持 ACL 訪問控制。docker
Consul 的使用場景數據庫
Docker 實例的註冊與配置共享
與 Consul template 服務集成,動態生成 Nginx 和 HAProxy 等配置文件
Spring-Cloud-Consul 服務發現和配置文件存儲
Consul 的優點json
使用 Raft 算法來保證一致性, 比 ZooKeeper 的 Paxos 算法更簡單直接。
支持多數據中心,內外網的服務採用不一樣的端口進行監聽。 ZooKeeper 和 etcd 均不提供多數據中心功能的支持。
支持健康檢查,etcd 不提供此功能。
支持 http 和 dns 協議接口。ZooKeeper 的集成較爲複雜,etcd 只支持 http 協議。
官方提供 web 管理界面,etcd 無此功能。
Consul 1.2 新增 Service Mesh 解決方案。
Consul、ZooKeeper、etcd、Eureka 比較bootstrap
連接
官方網站:https://www.consul.io
下載地址:https://www.consul.io/downloads.html
啓動
Consul 安裝包解壓完成以後就是一個可執行程序,直接運行便可。
Consul 默認啓動爲 dev 模式,重啓後丟失數據,啓動參數詳解請見附錄部分。
Windows
consul.exe agent -server -bootstrap -advertise 127.0.0.1 -data-dir ./data -ui
Linux
consul agent -server -bootstrap -advertise 127.0.0.1 -data-dir ./data -ui
Mac
安裝
brew install consul
修改 Consul 啓動參數:
vim /usr/local/opt/consul/homebrew.mxcl.consul.plist
修改 ProgramArguments 部分:
<key>ProgramArguments</key><array><string>/usr/local/opt/consul/bin/consul</string><string>agent</string><string>-server</string><string>-bootstrap</string><string>-advertise</string><string>127.0.0.1</string><string>-data-dir</string><string>./data</string><string>-ui</string></array>
啓動:bashbrew services start consul
訪問 Web 界面
咱們爲 Consul 添加了 -ui 啓動參數,就會自動 Consul 的 Web 界面。端口默認爲 8500,本地訪問:http://localhost:8500/。
Spring Cloud Consul
Spring Cloud Consul 項目是 Spring Cloud 針對 Consul 服務治理的實現。
提供了服務發現(可替代Eureka)和配置管理(可替代Spring Cloud Config)的功能。
服務發現
1. 使用 IDEA Spring Initalizr 建立項目(consul-demo)
添加 Consul Discovery 和 Actuator (用於 Consul 服務監控檢查)依賴:
注意:Spring Boot 2.0 的變化,2.0 actuator http 默認只開啓了 health 和 info,全功能開放須要添加配置。
management: endpoints: web: exposure: include: '*'
2. 新建 bootstrap.yml 配置文件
spring: application: name: consul-demo cloud: consul: host: localhost port: 8500
3. 查看 Consul web 界面能夠看到 consul-demo 服務已經註冊
分佈式配置
Consul 提供了用於存儲配置和其餘元數據的 [鍵/值存儲]。是 Spring Cloud Consul Config 的替代方案。
默認狀況下,配置存儲在 /config 文件夾中。根據應用程序的名稱和模擬 Spring Cloud Config 順序解析屬性的活動配置文件,建立多個 PropertySource 實例。
例如,名爲「consul-demo」的應用程序和「dev」配置文件將建立如下屬性源:
config/consul-demo,dev/config/consul-demo/config/application,dev/config/application/
注意:application 爲全部服務的通用配置。,dev 表示 dev 環境的配置。
更改依賴
想要使用 Spring Cloud Consul 的分佈式配置功能,須要將 spring-cloud-starter-consul-discovery 依賴更改成 spring-cloud-starter-consul-all。
注:spring-cloud-starter-consul-all 中包含了下列依賴:
<!--消息總線,提供配置實時刷新,再也不依賴中間件--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-bus</artifactId></dependency><!--consul的配置中心功能--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-config</artifactId></dependency><!--服務註冊和發現功能--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>
在 Consul KEY/VALUE 中添加配置
首先,在 bootstrap.yml 中添加 Consul 配置:
key spring.cloud.consul.config.format value yaml
spring: cloud: consul: host: localhost port: 8500 config: format: yaml
而後:打開 Consul UI 界面添加 key/value 配置:
添加 consul-demo 服務配置:config/consul-demo/data
server: port: 8100
添加通用配置:config/application/data
management: endpoints: web: exposure: include: '*'
配置的自動更新
Consul 中的 key/value 配置更改以後 Spring Cloud 服務端須要開啓 Spring 的定時任務 watch Consul 中的配置,添加註解:@EnableScheduling 。
不一樣於 Spring cloud config 的配置更新機制(配置更新以後使用 bus 將配置變更推送給各個服務),Spring Cloud Consul 採用的是客戶端定時 watch Consul 中的 key/value 變化,而後觸發 Spring 的 RefreshEvent,刷新上下文。
Consul 集羣搭建
Consul 集羣搭建最方便的方式是採用 Docker compose。
集羣說明
3 server 節點(consul-server1 ~ 3)和 2 node 節點(consul-node1 ~ 2)
映射本地 consul/data1 ~ 3/ 目錄到 Docker 容器中,避免 Consul 集羣重啓後數據丟失。
Consul web http 端口分別爲 850一、850二、8503
新建 docker-compose.yml
version: '2.0'services: consul-server1: image: consul:latest hostname: "consul-server1" ports: - "8501:8500" volumes: - ./consul/data1:/consul/data command: "agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0" consul-server2: image: consul:latest hostname: "consul-server2" ports: - "8502:8500" volumes: - ./consul/data2:/consul/data command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0" depends_on: - consul-server1 consul-server3: image: consul:latest hostname: "consul-server3" ports: - "8503:8500" volumes: - ./consul/data3:/consul/data command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0" depends_on: - consul-server1 consul-node1: image: consul:latest hostname: "consul-node1" command: "agent -join consul-server1 -disable-host-node-id" depends_on: - consul-server1 consul-node2: image: consul:latest hostname: "consul-node2" command: "agent -join consul-server1 -disable-host-node-id" depends_on: - consul-server1
集羣啓動時默認以 consul-server1 爲 leader,而後 server2 ~ 3 和 node1 ~ 2 加入到該集羣。當 server1 出現故障下線是,server2 ~ 3 則會進行選舉選出新leader。
集羣操做
建立並啓動集羣:docker-compose up -d
中止整個集羣:docker-compose stop
啓動集羣:docker-compose start
清除整個集羣:docker-compose rm(注意:須要先中止)
訪問
http://localhost:8501
http://localhost:8502
http://localhost:8503
Consul 負載均衡
Consul 可使用 Ngxin 來作集羣的負載均衡。
設定負載均衡的服務器列表
upstream consul { server 127.0.0.1:8501; server 127.0.0.1:8502; server 127.0.0.1:8503;}
服務配置
server { listen 80; server_name consul.test.com;#服務域名,須要填寫你的服務域名 location / { proxy_pass http://consul;#請求轉向consul服務器列表 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}
Spring Cloud 服務中 Consul 的地址填寫 http://consul.test.com (你的服務域名)便可,不須要像 Eureka 中須要填寫各個服務的地址,Consul 的集羣輕量高效。
總結
相較於 Eureka,Consul 有着更少的資源佔用能支撐更大的規模集羣。
相較於 Spring Cloud Config 配置中心,使用起來沒有 Git 存儲的配置管理版本追溯方便,須要本身採用用數據庫管理配置並同步到 Consul 的方式。
可是 Spring Cloud Consul 的配置更新方式更加簡單高效。
附錄
Consul 啓動參數說明
啓動參數 說明
-advertise 通知展示地址用來改變咱們給集羣中的其餘節點展示的地址,通常狀況下-bind地址就是展示地址
-bootstrap 用來控制一個server是否在bootstrap模式,在一個datacenter中只能有一個server處於bootstrap模式,當一個server處於bootstrap模式時,能夠本身選舉爲raft leader
-bootstrap-expect 在一個datacenter中指望提供的server節點數目,當該值提供的時候,consul一直等到達到指定sever數目的時候纔會引導整個集羣,該標記不能和bootstrap公用
-bind 該地址用來在集羣內部的通信,集羣內的全部節點到地址都必須是可達的,默認是0.0.0.0
-client consul綁定在哪一個client地址上,這個地址提供HTTP、DNS、RPC等服務,默認是127.0.0.1
-config-file 明確的指定要加載哪一個配置文件
-config-dir 配置文件目錄,裏面全部以.json結尾的文件都會被加載
-data-dir 提供一個目錄用來存放agent的狀態,全部的agent容許都須要該目錄,該目錄必須是穩定的,系統重啓後都繼續存在
-dc 該標記控制agent容許的datacenter的名稱,默認是dc1
-encrypt 指定secret key,使consul在通信時進行加密,key能夠經過consul keygen生成,同一個集羣中的節點必須使用相同的key
-join 加入一個已經啓動的agent的ip地址,能夠屢次指定多個agent的地址。若是consul不能加入任何指定的地址中,則agent會啓動失敗,默認agent啓動時不會加入任何節點。
-retry-join 和join相似,可是容許你在第一次失敗後進行嘗試
-retry-interval 兩次join之間的時間間隔,默認是30s
-retry-max 嘗試重複join的次數,默認是0,也就是無限次嘗試
-log-level consul agent啓動後顯示的日誌信息級別。默認是info,可選:trace、debug、info、warn、err
-node 節點在集羣中的名稱,在一個集羣中必須是惟一的,默認是該節點的主機名
-protocol consul使用的協議版本
-rejoin 使consul忽略先前的離開,在再次啓動後仍舊嘗試加入集羣中
-server 定義agent運行在server模式,每一個集羣至少有一個server,建議每一個集羣的server不要超過5個
-syslog 開啓系統日誌功能,只在linux/osx上生效
-ui 使用自帶的ui
-ui-dir 提供存放web ui資源的路徑,該目錄必須是可讀的
-pid-file 提供一個路徑來存放pid文件,可使用該文件進行SIGINT/SIGHUP(關閉/更新)agent
Spring Cloud Consul 配置
核心參數
配置項 默認值
spring.cloud.consul.enabled true
spring.cloud.consul.host localhost
spring.cloud.consul.port 8500
服務發現參數
配置項 默認值
spring.cloud.consul.discovery.acl-token
spring.cloud.consul.discovery.catalog-services-watch-delay 10
spring.cloud.consul.discovery.catalog-services-watch-timeout 2
spring.cloud.consul.discovery.datacenters
spring.cloud.consul.discovery.default-query-tag
spring.cloud.consul.discovery.default-zone-metadata-name zone
spring.cloud.consul.discovery.deregister true
spring.cloud.consul.discovery.enabled true
spring.cloud.consul.discovery.fail-fast true
spring.cloud.consul.discovery.health-check-critical-timeout
spring.cloud.consul.discovery.health-check-interval 10s
spring.cloud.consul.discovery.health-check-path /actuator/health
spring.cloud.consul.discovery.health-check-timeout
spring.cloud.consul.discovery.health-check-tls-skip-verify
spring.cloud.consul.discovery.health-check-url
spring.cloud.consul.discovery.heartbeat.enabled false
spring.cloud.consul.discovery.heartbeat.interval-ratio
spring.cloud.consul.discovery.heartbeat.ttl-unit s
spring.cloud.consul.discovery.heartbeat.ttl-value 30
spring.cloud.consul.discovery.hostname
spring.cloud.consul.discovery.instance-group
spring.cloud.consul.discovery.instance-id 默認爲服務名+環境+端口號
spring.cloud.consul.discovery.instance-zone
spring.cloud.consul.discovery.ip-address
spring.cloud.consul.discovery.lifecycle.enabled true
spring.cloud.consul.discovery.management-port
spring.cloud.consul.discovery.management-suffix management
spring.cloud.consul.discovery.management-tags
spring.cloud.consul.discovery.port
spring.cloud.consul.discovery.prefer-agent-address false
spring.cloud.consul.discovery.prefer-ip-address false
spring.cloud.consul.discovery.query-passing false
spring.cloud.consul.discovery.register true
spring.cloud.consul.discovery.register-health-check true
spring.cloud.consul.discovery.scheme http
spring.cloud.consul.discovery.server-list-query-tags
spring.cloud.consul.discovery.service-name
spring.cloud.consul.discovery.tags
配置服務參數
配置項 默認值spring.cloud.consul.config.enabled truespring.cloud.consul.config.prefix configspring.cloud.consul.config.default-context applicationspring.cloud.consul.config.profile-separator ,spring.cloud.consul.config.data-key dataspring.cloud.consul.config.format KEY_VALUE, PROPERTIES, YAML, FILESspring.cloud.consul.config.name ${spring.application.name}spring.cloud.consul.config.acl-token spring.cloud.consul.config.fail-fast falsespring.cloud.consul.config.watch.enabled truespring.cloud.consul.config.watch.wait-time 55spring.cloud.consul.config.watch.delay 1000