Catalog
- Spring Cloud Consul
- 一、需求
- 二、是什么
- 三、優點
- 四、缺點
- 五、怎么用
- 六、細節
Spring Cloud Consul
一、需求
多個微服務之間通過RestTemplate中的api相互調用,一般要寫死微服務的IP地址和端口號,相當于硬編碼,非常不靈活,而且對于某中微服務可能會做負載均衡,這樣通過編碼的方式寫IP地址和端口號,對于一個微服務需要去調用另外一個微服務的時候就非常繁瑣和麻煩,Consul就幫我們解決了這個問題,項目中的每一個微服務都在Consul進行注冊(入駐),微服務之間調用的時候,就通過Consul來需要需要調用的微服務。
除此之外,當一個項目是由多個微服務組成的時候,往往會存在很多通用的配置,比如多個微服務可能使用的都是同一個數據庫的IP地址和端口號,如果在每一個微服務都單獨配置這些通用的配置,當數據庫的IP或者端口改變的時候,就需要去到每一個微服務單獨修改配置文件,當微服務的數量非常多的時候,修改這些配置文件就非常耗時,且意義不大,本著有問題就加一層的原則,我們可以將這些通用的配置信息抽取出來統一管理(全局配置信息),當全局配置信息發生改變的時候,就通知到每一個微服務進行修改,而Consul就可以幫我們做這件事情。
二、是什么
Consul屬于第三方軟件(類似tomcat),是獨立于微服務項目之外的(較于Eureka的優勢所在之一),可以為我們提供服務注冊與發現、代理配置中心等等功能,滿足CP(CAP理論),即保證數據一致性和分區容錯性,但不保證高可用。(Consul官網、Spring官網)
tips:CAP理論
CAP理論,即下面三個詞組的首字母Consistency、 Availability 、 Partition tolerance, 任何分布式系統理論上只能滿足其中任意兩個特性。
- C:代表數據的強一致性,其實也就是多個節點之間同步數據的時候,如果某個節點同步數據失敗,會直接拒絕后續的請求;
- A:代表高可用性,是相對于用戶來說,也就是這個分布式系統什么時候都能做出非錯誤響應(數據可能是過期的);
- P:代表分區容錯性,在分布式系統中,有多個節點,比如有三個節點A、B、C,A和B之間出現網絡故障無法通信,但A和C、B和C仍然可以通信,相當于形成了兩個分區,只有分區內的節點能夠相互通信,這就是網絡分區故障,而分區容忍性代表著系統即使發生網絡分區,也可以繼續運行。
三、優點
- 實現了和多微服務項目的解耦(早期的Eureka是耦合在項目中的);
- 陽哥筆記:
四、缺點
- 需要額外維護第三方服務器(Consul服務器)
五、怎么用
下載Consul服務
-
官網下載
-
安裝好后,點擊Exe文件,可能會一閃而過,但不影響使用
-
在D:\Final-plan\SpringCloud\dev-soft\consul_1.17.1_windows_386目錄下(輸入cmd,進入命令提示符界面),輸入"consul agent -dev"以開發模式啟動:
微服務的注冊與發現
-
導入Maven坐標;
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency>
-
修改微服務配置文件,主要配置微服務在Consul的名字,然后啟動項目;
spring:application:name: cloud-payment-service# 配置spring cloud consul for discovery servicecloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}
-
打開Consul的圖形化界面(本機),查看是否有該微服務;
-
基于Consul,通過RestTemplate實現微服務之間的調用,將原來被調用的微服務的IP地址和端口一并刪掉,換成在Consul中配置的名字;
//public static final String PaymentSrv_URL = "http://localhost:8001/pay";public static final String PaymentSrv_URL = "http://cloud-payment-service"; //IP地址和端口號修改為在Consul配置的名字,這里是在微服務中的調用方配置的需要調用的微服務地址
微服務從Consul拉取配置信息
-
導入Maven坐標;
<!--SpringCloud consul config--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>
-
建立bootstrap.yml文件(resource目錄下),該文件是比application.yml優先級更高的配置文件,會在項目初始化化的時候拉去外部源(這里指的是在Consul中的配置信息)的配置信息;
spring:application:name: cloud-payment-service####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}config:profile-separator: '-' # default value is ",",we update '-',這里配置的是Consul的文件夾命名的分隔符,主要是要識別最后一個分隔符后面的單詞作為環境標識符format: YAML # 規定Spring Cloud程序用什么解析器解析從consul拉取過來的數據watch:wait-time: 1 # 當Consul配置信息發生改變的時候,通知微服務來拉取# config/cloud-payment-service/data # /cloud-payment-service-dev/data # /cloud-payment-service-prod/data
-
在Consul中配置全局配置中心的信息,注意要創建文件夾輸入的名字的結尾要加’/', 第一個目錄需要指定為config,最后的數據的名字需要指定為data;
-
在application.yml文件中配置使用哪個環境的配置文件(對應到在Consul配置的配置信息文件夾中,最后一個分隔符的名字);
spring:profiles:active: dev# 多環境配置加載內容dev/prod,不寫就是默認default配置
-
測試從Consul拉取配置信息是否成功,在Controller層測試;
@Value("${server.port}")private String port;@GetMapping("/get/info")public String getInfoByConsul(@Value("${test.info}") String info){return "test.info: " + info + " " + port;}
六、細節
- 重啟Consul服務器之后,上面設置的全局配置中心就全部清空了,后續需要對這些配置做持久化。