自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Nacos Client 1.4.1 版本踩坑記錄

開發(fā) 前端
就在這周,我接到 MSE Nacos 用戶的反饋,說線上 Nacos 不可用,服務(wù)都下線了,日志里面也是一堆報(bào)錯(cuò),我下意識(shí)以為線上炸了,趕緊上線排查。本文主要記錄這次問題的排查過程,以及解決方案。

[[402066]]

本文轉(zhuǎn)載自微信公眾號(hào)「Kirito的技術(shù)分享」,作者kiritomoe。轉(zhuǎn)載本文請(qǐng)聯(lián)系Kirito的技術(shù)分享公眾號(hào)。

問題發(fā)現(xiàn)

就在這周,我接到 MSE Nacos 用戶的反饋,說線上 Nacos 不可用,服務(wù)都下線了,日志里面也是一堆報(bào)錯(cuò),我下意識(shí)以為線上炸了,趕緊上線排查。本文主要記錄這次問題的排查過程,以及解決方案。

首先看用戶反饋的報(bào)錯(cuò),日志如下:

并且用戶反饋業(yè)務(wù)日志也出現(xiàn)了大量的服務(wù)地址找不到的報(bào)錯(cuò),說明 Nacos 服務(wù)都下線了。

我立刻查看了服務(wù)端的監(jiān)控,發(fā)現(xiàn)用戶的 MSE Nacos 集群并無異常,cpu/內(nèi)存等指標(biāo)有下降,并沒有異常行為,排除了服務(wù)端異常的可能性。

隨即將視線聚焦在了客戶端。老實(shí)說,這個(gè)報(bào)錯(cuò)我第一次見,看異常堆棧,字面意思便是域名解析出問題了。這個(gè)報(bào)錯(cuò)大概持續(xù)了 10 分鐘,立刻讓用戶在業(yè)務(wù)節(jié)點(diǎn)上使用 ping、dig 等工具確認(rèn)域名解析是否正常,測(cè)試發(fā)現(xiàn)均無異常。繼續(xù)讓用戶 telnet mse-xx.com 8848,發(fā)現(xiàn)也能夠 telnet 通。

根據(jù)這些現(xiàn)象,大概能得出結(jié)論:用戶的機(jī)器上出現(xiàn)了短暫的域名解析問題,導(dǎo)致短時(shí)間訪問不通 MSE Nacos。但用戶繼續(xù)反饋說,一部分重啟以后的機(jī)器已經(jīng)恢復(fù)了,但沒有重啟的機(jī)器,竟然還會(huì)出現(xiàn)調(diào)用報(bào)錯(cuò)。不然怎么說重啟大法好呢,但也加深了問題的詭異性。

正當(dāng)一籌莫展時(shí),另一用戶也找上來了,竟然也是一樣的問題,并且由于第二個(gè)用戶還同時(shí)使用了 redis,報(bào)錯(cuò)日志中除了出現(xiàn) nacos 的域名解析問題,還報(bào)了 redis 的域名解析報(bào)錯(cuò)。至此,更加堅(jiān)定了我之前推測(cè),根因肯定是域名解析出現(xiàn)了故障,導(dǎo)致這兩個(gè)用戶收到了影響。但問題在于,為什么短暫的域名解析失敗(大概 10 分鐘),會(huì)導(dǎo)致持續(xù)性的 Nacos 問題呢?并且只有重啟才能恢復(fù)。

分析兩個(gè)用戶的共性,最終我和同事將可疑點(diǎn)鎖定在了 Nacos 客戶端版本上,對(duì)比發(fā)現(xiàn),用戶都是同一個(gè)報(bào)錯(cuò),并且竟然都是 nacos-client 1.4.1 版本。

Nacos 1.4.1 版本引入的 bug

在問題發(fā)生時(shí),Nacos 1.x 最新的版本已經(jīng)是 Nacos 1.4.2 了,將源碼 checkout 到 1.4.1 版本,追蹤堆棧附近的問題,

上述這段代碼是 Nacos 訪問服務(wù)端的一段代碼,進(jìn)入 595 行,一探究竟。

我們成功找到了堆棧中的直接報(bào)錯(cuò),就是這段 IsIPv4 的判斷觸發(fā)。splitIPPortStr 這個(gè)方法的主要邏輯是從 Nacos 的連接串篩選出連接地址,主要是為了做默認(rèn)端口號(hào)的判斷,如果用戶沒有攜帶 8848,會(huì)默認(rèn)帶上 8848。

但問題恰恰便是出現(xiàn)在這兒:

InetAddress.getByName(addr) 是一個(gè)內(nèi)置的方法,描述如下:

  1. Given the name of a host, returns an array of its IP addresses, based on the configured name service on the system. 

意思是把一個(gè)域名傳給操作系統(tǒng),返回一串 IP,這不就是域名解析嗎!我當(dāng)時(shí)就很好奇,你說你判斷 IPv4 格式,為啥要這么判斷呢?直接判斷 IPv4 的 pattern 不行嗎?而這段代碼,恰恰是導(dǎo)致問題的兇手之一。

我們看看 1.4.2,已經(jīng)修復(fù)了這個(gè)邏輯了,直接改成了正則判斷。

但疑問還是存在的,域名解析短暫失敗了,為啥會(huì)導(dǎo)致服務(wù)全都下線了,并且解析恢復(fù)后,服務(wù)依舊沒有上線呢?

繼續(xù)追蹤這段代碼,發(fā)現(xiàn) callServer 這段代碼會(huì)被 com.alibaba.nacos.client.naming.beat.BeatReactor 持有,用于維持自身和 Nacos 的心跳。

而由于上述域名解析失敗,拋出的異常是 IllegalArgumentException,并沒有被里層方法轉(zhuǎn)換成 NacosException,從而導(dǎo)致心跳線程沒有 catch 住異常,徹底停止發(fā)送心跳了!

這也就成功解釋了,為什么短暫的域名解析失敗,會(huì)導(dǎo)致服務(wù)全部下線了。(Nacos 是利用心跳維護(hù)和 server 端的存活狀態(tài)的)

改進(jìn)建議

修改 isIPv6 和 isIPv4 的判斷方式,改為正則匹配。上文提及,這點(diǎn)已經(jīng)在 1.4.2 修復(fù)了。

心跳線程要保證不被異常中斷下一次心跳的提交。

第二點(diǎn),也已經(jīng)被修復(fù)了。

總結(jié)

nacos-client 1.4.1 存在嚴(yán)重的 bug,客戶端與 Nacos Server 如果發(fā)生短暫的域名解析問題,會(huì)導(dǎo)致心跳永久丟失,進(jìn)而引發(fā)服務(wù)全量下線,即使網(wǎng)絡(luò)恢復(fù),也不會(huì)自動(dòng)恢復(fù)心跳。

域名解析失敗常見于網(wǎng)絡(luò)抖動(dòng)或者 K8s 環(huán)境下的 coreDNS 訪問超時(shí)等場(chǎng)景,為避免域名解析對(duì) Nacos 造成的重大影響,請(qǐng)務(wù)必自查應(yīng)用代碼中使用的 nacos-client 的版本。

該問題僅存在于 1.4.1 版本,低于此版本不受此問題的影響,使用 1.4.1 的用戶建議升級(jí)至 1.4.2 以避免此問題。

使用 SpringCloud/Dubbo 的用戶,需要確認(rèn)實(shí)際框架使用的 nacos-client 版本,可以通過顯式指定 nacos-client 的版本以覆蓋框架默認(rèn)的版本。其中 Dubbo 用戶要格外小心,Dubbo 的 2.7.11 版本默認(rèn)使用了 nacos-client 1.4.1,務(wù)必顯式指定 nacos-client 的版本到 1.4.2,Dubbo 也將在下個(gè) release 版本替換 Nacos 的默認(rèn)版本。

責(zé)任編輯:武曉燕 來源: Kirito的技術(shù)分享
相關(guān)推薦

2023-01-18 23:20:25

編程開發(fā)

2020-09-15 08:46:26

Kubernetes探針服務(wù)端

2025-04-15 02:00:00

API版本項(xiàng)目

2023-02-20 08:11:04

2017-05-05 08:12:51

Spark共享變量

2021-10-28 19:10:02

Go語言編碼

2021-09-03 11:15:18

場(chǎng)景sql配置

2024-04-10 08:39:56

BigDecimal浮點(diǎn)數(shù)二進(jìn)制

2024-04-01 08:05:27

Go開發(fā)Java

2023-09-22 11:29:11

JavasubList

2017-07-17 15:46:20

Oracle并行機(jī)制

2021-10-22 19:41:01

鴻蒙HarmonyOS應(yīng)用

2021-10-15 06:49:37

MySQL

2022-11-18 07:34:12

Docker項(xiàng)目目錄

2024-10-09 08:09:11

2023-04-26 11:29:58

Jenkins版本Java 11

2023-06-30 08:10:14

JavaBigDecimal

2025-04-29 10:17:42

2024-11-26 08:20:53

程序數(shù)據(jù)歸檔庫

2021-06-09 08:21:14

Webpack環(huán)境變量前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)