国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

詳解Spring Cloud Finchley版中Consul多實例注冊的問題處理

2024-07-14 08:42:11
字體:
來源:轉載
供稿:網友

consul 簡介

consul 具有以下性質:

  1. 服務發現:consul通過http 方式注冊服務,并且服務與服務之間相互感應。
  2. 服務健康監測
  3. key/value 存儲
  4. 多數據中心

consul可運行在mac windows linux 等機器上。

由于Spring Cloud對Etcd的支持一直沒能從孵化器中出來,所以目前來說大多用戶還在使用Eureka和Consul,之前又因為Eureka 2.0不在開源的消息,外加一些博眼球的標題黨媒體使得Eureka的用戶有所減少,所以,相信在選擇Spring Cloud的用戶群體中,應該有不少用戶會選擇Consul來做服務注冊與發現。

本文就來說一下,當我們使用Spring Cloud最新的Finchley版 + Consul 1.2.x時候最嚴重的一個坑:多實例注冊的問題。

問題解讀

問題:該問題可能在開發階段不一定會發現,但是在線上部署多實例的時候,將會發現Consul中只有一個實例。

原因:造成該問題的主要原因是Spring Cloud Consul在注冊的時候實例名(InstanceId)采用了:“服務名-端口號”(即: {spring.application.name}-{server.port} )的值,可以看到這個實例名如果不改變端口號的情況下,實例名都是相同的。如果熟悉Spring Cloud Consul的讀者,可能會問老版本也是這個規則,怎么沒有這個問題呢?。主要是由于Consul對實例唯一性的判斷標準也有改變,在老版本的Consul中,對于實例名相同,但是服務地址不同,依然會認為是不同的實例。在Consul 1.2.x中,服務實例名成為了集群中的唯一標識,所以,也就導致了上述問題。

解決方法

既然知道了原因,那么我們要解決它就可以有的放矢了。下面就來介紹兩個具體的解決方式:

方法一:通過配置屬性指定新的規則

下面舉個例子,通過 spring.cloud.consul.discovery.instance-id 參數直接來配置實例命名規則。這里比較粗暴的通過隨機數來一起組織實例名。當然這樣的組織方式并不好,因為隨機數依然有沖突的可能,所以您還可以用更負責的規則來進行組織實例名。

 

復制代碼代碼如下:
spring.cloud.consul.discovery.instance-id=${spring.application.name}-${random.int[10000,99999]}

 

方法二:通過擴展 ConsulServiceRegistry 來重設實例名

由于通過配置屬性的方式對于定義實例名的能力有限,所以我們希望可以用更靈活的方式來定義。這時候我們就可以通過重寫 ConsulServiceRegistry 的 register 方法來修改。比如下面的實現:

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);  }}

上面通過拼接“服務名”-“ip地址”-“端口號”的方式,構造了一個絕對唯一的實例名,這樣就可以讓每個服務實例都能正確的注冊到Consul上了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 康定县| 石河子市| 太康县| 肇庆市| 太仆寺旗| 屏南县| 万荣县| 蓬莱市| 陈巴尔虎旗| 嘉义市| 句容市| 杨浦区| 德昌县| 阿瓦提县| 铜鼓县| 林芝县| 九龙城区| 洮南市| 牡丹江市| 集贤县| 桦川县| 克拉玛依市| 晋城| 社旗县| 郎溪县| 肃宁县| 吉水县| 咸宁市| 延川县| 砚山县| 滦南县| 兴城市| 潼关县| 垣曲县| 宁强县| 华池县| 郑州市| 佳木斯市| 罗平县| 长岭县| 贡嘎县|