前言
最近一段時間開始了一個新項目,幾個同事共同開發,同時使用了PHP和JAVA兩種語言,分成了各個模塊,在相互調用時的配置難以維護,於是就開始尋找服務發現的方案,spring 系列的目前提供了eureka、consul、zookeeper,最終選擇consul.
eureka
eureka由JAVA語言開發,在spring cloud中使用方便,容易配置,是首先想到的方案,但基於以下原因放棄:
- 目前spring集成的為1.X版本,且2.0已閉源,前景不明朗;
- 與其它語言協同開發時,非JAVA語言需要開啟一個sidecar進程才可以通信;
consul
consul由GO語言開發,是專門用來做服務發現的,具有服務注冊、服務必現、服務檢測、UI管理、命令管理、API管理、數據存儲等;且spring在此基礎上做了封裝,優先采用;
zookeeper
zooKeeper最先使用於hadoop集群管理,用來維護集群狀態,是一個大而全的組件,學習成本略高
consul安裝
- 從官網下載相應平台的包: 官網地址;
- 解壓到指定目錄,直接運行即可:
consul agent -server -bootstrap-expect=1 -data-dir=/data/data/consul/consul1 -node=master_1 -bind=0.0.0.0 -client=0.0.0.0 -enable-script-checks=true -config-dir=/etc/consul/consul1 -ui
- 至此consul安裝完成,其它常規操作(如集群部署、常用命令)請參考官方文檔或CSDN博客
spring-cloud配置
- 引入依賴包
//consul-all包含consul-bus、consul-discovery、consul-config三部分
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-all</artifactId>
</dependency>
- application.yml/bootstrap.yml配置
spring:
cloud:
consul:
host: 192.168.1.40
port: 8500
discovery:
heartbeat:
enabled: true
enabled: true
register: true
deregister: true
prefer-ip-address: true
instance-id: ${spring.application.name}:${random.value}
# 只查詢有效的記錄
query-passing: true
config:
# 在consul中配置的key路徑為: config/cloud-consul/key 在啟動或更新時會覆蓋項目中原先配置
format: key_value
enabled: true
# 所有項目共用的配置 consul的配置路徑為: config/application/key
default-context: application
data-key: data
prefix: config
- 在入口中加入服務發現注解
@SpringBootApplication
@EnableDiscoveryClient
- 獲取指定服務的信息
//通過feign或restTemplate即可遠程調用
@Autowired
private ConsulDiscoveryClient discoveryClient;
public List<ServiceInstance> test2(String serviceName){
List<ServiceInstance> instanceList = discoveryClient.getInstances(serviceName);
return instanceList;
}
- 至此,一個簡單的服務注冊發現完工,可以到consul ui界面查詢相關信息,默認為8500端口
consul-config
consul自帶數據存儲功能,是config-client和config-server的替代方案,由於上文已經引入consul-all
功能,已包含consul-config功能,所以consul的配置位置要由application.yml
轉到bootstrap.yml
中,以官方的說明,consul中的數據將會在一個特定的啟動階段加入到spring容器中,當consul中數據變更時,會觸發refresh操作,完成參數的熱更新;
- 配置參數
config:
# 在consul中配置的key路徑為: config/cloud-consul/key 在啟動或更新時會覆蓋項目中原先配置
format: key_value
enabled: true
# 所有項目共用的配置 consul的配置路徑為: config/application/key
default-context: application
data-key: data
prefix: config
-
通過consul-ui或命令設置屬性
-
在需要同步更新的類上加上
@RefreshScope
的注解 -
更改consul中的key值,觸發更新
注意內容:
全局的配置屬性所在路徑:/config/application/
或 /config/application,profile
,項目配置屬性所有路徑: /config/service-name
或 /config/service-name,profile
可能會現現的坑
- consul默認綁定IP為127.0.0.1,可通過-client= 和 -bind來修改
- 負載均衡器會選取失效的服務節點 請確保query-passing的屬性為true
- 在spring項目關閉時,會觸發服務自動注銷,如因意外情況造成失效的節點未注銷,可能會造成異常情況(因consul不能自動剔除失效節點),特別是上
query-passing
的屬性為false時,需要手動注銷失效節點,方法請參考consul官方文檔;
重要說明
最好的教程就是官方文檔,把consul和spring-cloud-consul文檔過一遍,大部分問題都可以解決,如果有一些弄不清楚,就google吧.............. 如果發現有任何錯誤,歡迎各位大神指正