詳解Spring Cloud Finchley版中Consul多實(shí)例注冊(cè)的問題處理
consul 簡(jiǎn)介
consul 具有以下性質(zhì):
- 服務(wù)發(fā)現(xiàn):consul通過http 方式注冊(cè)服務(wù),并且服務(wù)與服務(wù)之間相互感應(yīng)。
- 服務(wù)健康監(jiān)測(cè)
- key/value 存儲(chǔ)
- 多數(shù)據(jù)中心
consul可運(yùn)行在mac windows linux 等機(jī)器上。
由于Spring Cloud對(duì)Etcd的支持一直沒能從孵化器中出來,所以目前來說大多用戶還在使用Eureka和Consul,之前又因?yàn)镋ureka 2.0不在開源的消息,外加一些博眼球的標(biāo)題黨媒體使得Eureka的用戶有所減少,所以,相信在選擇Spring Cloud的用戶群體中,應(yīng)該有不少用戶會(huì)選擇Consul來做服務(wù)注冊(cè)與發(fā)現(xiàn)。
本文就來說一下,當(dāng)我們使用Spring Cloud最新的Finchley版 + Consul 1.2.x時(shí)候最嚴(yán)重的一個(gè)坑:多實(shí)例注冊(cè)的問題。
問題解讀
問題:該問題可能在開發(fā)階段不一定會(huì)發(fā)現(xiàn),但是在線上部署多實(shí)例的時(shí)候,將會(huì)發(fā)現(xiàn)Consul中只有一個(gè)實(shí)例。
原因:造成該問題的主要原因是Spring Cloud Consul在注冊(cè)的時(shí)候?qū)嵗↖nstanceId)采用了:“服務(wù)名-端口號(hào)”(即: {spring.application.name}-{server.port} )的值,可以看到這個(gè)實(shí)例名如果不改變端口號(hào)的情況下,實(shí)例名都是相同的。如果熟悉Spring Cloud Consul的讀者,可能會(huì)問老版本也是這個(gè)規(guī)則,怎么沒有這個(gè)問題呢?。主要是由于Consul對(duì)實(shí)例唯一性的判斷標(biāo)準(zhǔn)也有改變,在老版本的Consul中,對(duì)于實(shí)例名相同,但是服務(wù)地址不同,依然會(huì)認(rèn)為是不同的實(shí)例。在Consul 1.2.x中,服務(wù)實(shí)例名成為了集群中的唯一標(biāo)識(shí),所以,也就導(dǎo)致了上述問題。
解決方法
既然知道了原因,那么我們要解決它就可以有的放矢了。下面就來介紹兩個(gè)具體的解決方式:
方法一:通過配置屬性指定新的規(guī)則
下面舉個(gè)例子,通過 spring.cloud.consul.discovery.instance-id 參數(shù)直接來配置實(shí)例命名規(guī)則。這里比較粗暴的通過隨機(jī)數(shù)來一起組織實(shí)例名。當(dāng)然這樣的組織方式并不好,因?yàn)殡S機(jī)數(shù)依然有沖突的可能,所以您還可以用更負(fù)責(zé)的規(guī)則來進(jìn)行組織實(shí)例名。
方法二:通過擴(kuò)展 ConsulServiceRegistry 來重設(shè)實(shí)例名
由于通過配置屬性的方式對(duì)于定義實(shí)例名的能力有限,所以我們希望可以用更靈活的方式來定義。這時(shí)候我們就可以通過重寫 ConsulServiceRegistry 的 register 方法來修改。比如下面的實(shí)現(xiàn):
public class MyConsulServiceRegistry extends ConsulServiceRegistry {
public MyConsulServiceRegistry(ConsulClient client, ConsulDiscoveryProperties properties, TtlScheduler ttlScheduler, HeartbeatProperties heartbeatProperties) {
super(client, properties, ttlScheduler, heartbeatProperties);
}
@Override
public void register(ConsulRegistration reg) {
reg.getService().setId(reg.getService().getName() + “-” + reg.getService().getAddress() + “-” + reg.getService().getPort());
super.register(reg);
}
}
上面通過拼接“服務(wù)名”-“ip地址”-“端口號(hào)”的方式,構(gòu)造了一個(gè)絕對(duì)唯一的實(shí)例名,這樣就可以讓每個(gè)服務(wù)實(shí)例都能正確的注冊(cè)到Consul上了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot + Spring Cloud Consul 服務(wù)注冊(cè)和發(fā)現(xiàn)詳細(xì)解析
- spring cloud consul注冊(cè)的服務(wù)報(bào)錯(cuò)critical的解決
- SpringCloud與Consul集成實(shí)現(xiàn)負(fù)載均衡功能
- SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本)
- springcloud使用consul作為配置中心
- 詳解使用Spring Cloud Consul實(shí)現(xiàn)服務(wù)的注冊(cè)和發(fā)現(xiàn)
- 詳解Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)
- Springcloud服務(wù)注冊(cè)consul客戶端過程解析
相關(guān)文章
Mybatis-Plus雪花id的使用以及解析機(jī)器ID和數(shù)據(jù)標(biāo)識(shí)ID實(shí)現(xiàn)
這篇文章主要介紹了Mybatis-Plus雪花id的使用以及解析機(jī)器ID和數(shù)據(jù)標(biāo)識(shí)ID實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Mybatis模糊查詢和動(dòng)態(tài)sql語句的用法
今天小編就為大家分享一篇關(guān)于Mybatis模糊查詢和動(dòng)態(tài)sql語句的用法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
Java8 使用工廠方法supplyAsync創(chuàng)建CompletableFuture實(shí)例
這篇文章主要介紹了Java8 使用工廠方法supplyAsync創(chuàng)建CompletableFuture實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
JAVA錯(cuò)誤:'無效目標(biāo)發(fā)行版?17'的解決方案
這篇文章主要給大家介紹了關(guān)于JAVA錯(cuò)誤:'無效目標(biāo)發(fā)行版?17'的解決方案,文中通過圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用java具有一的的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-09-09
springboot加載命令行參數(shù)ApplicationArguments的實(shí)現(xiàn)
本文主要介紹了springboot加載命令行參數(shù)ApplicationArguments的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
教你使用eclipse?搭建Swt?環(huán)境的全過程
本文給大家分享使用eclipse?搭建Swt?環(huán)境的全過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
MyBatis 探秘之#{} 與 ${} 參傳差異解碼(數(shù)據(jù)庫連接池筑牢數(shù)據(jù)交互
本文詳細(xì)介紹了MyBatis中的`#{}`和`${}`的區(qū)別與使用場(chǎng)景,包括預(yù)編譯SQL和即時(shí)SQL的區(qū)別、安全性問題,以及如何正確使用數(shù)據(jù)庫連接池來提高性能,感興趣的朋友一起看看吧2024-12-12

