解決kubernetes中微服務pod之間調用失敗報錯connection refused的問題

現象:

?

從這里可以看到是當前服務在調用product service服務是出現了連接拒絕connection refused

走讀一下原始代碼:

可以看到請求是由FeignClient代理發出的?,但問題在于為什么Feign請求的時候會產生connection refused錯誤?

上面的日志又沒有給出詳細信息。我們需要看到feign請求網址的完整信息。

解決辦法:新建一個配置類

import feign.Logger; import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration public class FeignConfig {

? ? ? ? ?@Bean

? ? ? ? ? ?Logger.Level feignLoggerLevel() {

? ? ? ? ? ?return Logger.Level.FULL; // 設置Feign日志級別為FULL

? ? }

}

然后把這個配置類寫到@FeignClient注解里的configration里面

@FeignClient(name = "your-service", configuration = FeignConfig.class)

public interface YourServiceClient { // Feign客戶端的方法定義 }

這樣配置后,Feign將以Full日志級別打印詳細的HTTP請求和響應信息,包括完整的URL

因為我的@FeignClient注解里面的configration里面已經有配置類了,所以我把上面的那個bean直接追加到那個配置類里面:

然后再來查看日志果然發現:feign請求的地址有問題:竟然請求到當前自身ip 127.0.0.1了,

難怪會連接拒絕。

?2023-11-21 02:14:07.336 ?INFO 1 --- [oduct-service-1] c.n.l.DynamicServerListLoadBalancer ? ? ?: DynamicServerListLoadBalancer for client product-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=product-service,current list of Servers=[127.0.0.1:8081],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; ?Instance count:1; ? ? ? Active connections count: 0; ? ? ?Circuit breaker tripped count: 0; ? ? ? Active connections per server: 0.0;]
},Server stats: [[Server:127.0.0.1:8081; ? ? ? ?Zone:defaultZone; ? ? ? Total Requests:0; ? ? ? Successive connection failure:0; ?Total blackout seconds:0; ? ? ? Last connection made:Thu Jan 01 00:00:00 GMT 1970; ? ? ?First connection made: Thu Jan 01 00:00:00 GMT 1970; ? ? ?Active Connections:0; ? total failure count in last (1000) msecs:0; ? ? average resp time:0.0; ? ?90 percentile resp time:0.0; ? ?95 percentile resp time:0.0; ? ?min resp time:0.0; ? ? ?max resp time:0.0; ? ? ?stddev resp time:0.0]?

看了一下springboot配置文件

原來是ip-address設置在作怪,因為它主動上報eureka自身的ip地址為127.0.0.1, 那其他服務調用該服務時從eureka拿到的地址就會是127.0.0.1, 從而向自身發起調用,這樣必須會產生連接拒絕錯誤(因為你本來就是跨服務調用,自身怎么會有你需要的服務)

注意:?不要手動設置ip-address,而應該讓Eureka自動獲取。這樣,服務將以實際的網絡地址注冊到Eureka,Feign在調用時將獲得正確的服務地址

然后去掉這個ip-address配置以后,仍然報錯:java.net.UnknownHostException: product-service-deploy-674d77cffd-4rj4m

?2023-11-21 04:57:26.847 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] ? ?: Servlet.service() for servlet [dispatcherServlet] in co ?ntext with path [] threw exception [Request processing failed; nested exception is com.netflix.hystrix.exception.HystrixRuntimeException: ProductService ?Api#findProductsByCategory(Integer) failed and no fallback available.] with root cause
java.net.UnknownHostException: product-service-deploy-674d77cffd-4rj4m

這回看起來feign請求的時候沒有請求ip , 但是解析到k8s的pod ip了。

為什么會這樣?

使用下面的api查看一下product-service在eureka中注冊的詳細信息:

${eureka-IP}:port/eukeka/apps/${server-name}

?像下面這樣: 這里可以很清晰的看到produc-service在eureka中的詳細信息,

特別是hostName和ipAddr, 從上面的情況來看,應該是eureka返回給服務調用方的是被調用服務的hostName而不是ip

?然后同時測試一下服務需求方是否能正常從k8s的內網ip ping通被調用服務,也就是測試服務之間的網絡連通性。

?可以看到兩個服務之間網絡聯通正常,然后從下圖可以看到在宿主機上也可以通過內網ip和端口訪問到該服務。

問題還是出現在eureka在springboot的配置中

eureka的client注冊到server時默認是使用hostname而不是ip,這就導致client在多臺機器時,服務間相互調用時也會使用hostname進行調用,從而調用失敗。

?為解決這個問題,eureka必須配置prefer-ip-address: true, 要求優先使用ip地址向eureka注冊。

那么最后調用方從eureka拿到的就是ip地址了而不是hostname.

為什么會這樣?因為eureka源碼就是這樣定義的(EurekaInstanceConfigBean.class),如下所示

?

加上prefer-ip-address以后,再通過eureka api查詢上述服務的信息,發現之前的hostName也變成了ip地址:

把上面的prefer-ip-address: true配置加上去以后,以為問題解決了, 但是又報錯如下:

?大概意思請求失敗,沒有fallback降級服務,但是我明明有寫降級服務啊:

后來發現原來是application沒有配置熔斷降級,加上去就可以了:

feign:hystrix:enabled: true #啟用熔斷降級

?最后問題終于解決,沒再報錯了。

總結一下解決辦法:

1. springboot eureka配置中不要手動設置ip-address,此配置必須去掉!

2.?springboot eureka必須配置prefer-ip-address: true

3.? 當feign調用報錯信息不明時,應設置Feign日志級別為FULL,查看詳細的服務調用信息,包括請求url等,這樣有利于診斷故障

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164877.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164877.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164877.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Programming Tensor Cores: NATIVE VOLTA TENSOR CORES WITH CUTLASS

PROGRAMMING TENSOR CORES: NATIVE VOLTA TENSOR CORES WITH CUTLASS 源自于 GTC Silicon Valley-2019: cuTENSOR: High-performance Tensor Operations in CUDA,介紹了 CUTLASS 1.3 中基于 Volta Tensor Core 實現高效矩陣乘法計算的策略。主要內容為以下三點&…

Python函數式編程:讓你的代碼更優雅更簡潔

概要 函數式編程(Functional Programming)是一種編程范式,它將計算視為函數的求值,并且避免使用可變狀態和循環。 函數式編程強調的是函數的計算,而不是它的副作用。 在函數式編程中,函數是第一類公民&a…

【Vue3】解決Vue打包后上傳服務器 資源路徑加載錯誤

問題: 我這里在打包Vue之后將打包后的dist 上傳至服務器站點根目錄內子目錄 名為 "adminstore" , 但是當我通過域名打開站點后發現 資源加載路徑內并沒有攜帶 子目錄 "adminstore" 文件名稱 錯誤:http://your website domain/js/app…

Java 開發常用的 Linux 命令匯總(建議收藏)

雖然平時大部分工作都是和Java相關的開發, 但是每天都會接觸Linux系統, 尤其是使用了Mac之后, 每天都是工作在黑色背景的命令行環境中. 自己記憶力不好, 很多有用的Linux命令不能很好的記憶, 現在逐漸總結一下, 以便后續查看. 基本操作 Linux關機,重啟 # 關機 shutdown -h n…

面試Java筆試題精選解答

文章目錄 熱身級別數組中重復的數字思路:使用map或HashSet來遍歷一遍就可以找出重復的字符樣例解答 用兩個棧實現隊列思路:Stack1正向進入,隊頭在棧底,用于進隊列操作;Stack2是Stack1倒棧形成,隊頭在棧頂&a…

學生成績管理系統(C++實現)

問題描述 實現學生成績管理系統: 學生信息包括:學號、姓名、性別、年齡、班級等信息。除了包括學生所有信息外,還包括專業、英語、程序設計和高等數學等課程。 設計一程序能夠對學生成績進行管理,應用到繼承、抽象類、虛函數、虛…

基于5G+物聯網+SaaS+AI的農業大數據綜合解決方案:PPT全文44頁,附下載

關鍵詞:智慧農業大數據,5G智慧農業,物聯網智慧農業,SaaS智慧農業,AI智慧農業,智慧農業大數據平臺 一、智慧農業大數據建設背景 1、應對全球人口快速增長帶來的糧食生產壓力,未來的糧食生產力必…

宣傳技能培訓1——《新聞攝影技巧》光影魔法:理解不同光線、角度、構圖的攝影效果,以及相機實戰操作 + 新聞攝影實例講解

新聞攝影技巧 寫在最前面摘要 構圖與拍攝角度景別人物表情與敘事遠景與特寫 構圖與拍攝角度案例 主體、陪體、前景、背景強調主體利用前景和背景層次感的創造 探索新聞攝影中的構圖技巧基本構圖技巧構圖技巧的應用實例實例分析1. 黃金分割和九宮格2. 三角型構圖3. 引導線構圖4.…

1)業務平臺集成電子簽章平臺

1.前言 電子簽章平臺隨著企業數字化轉型逐步滲透到日常運營項目中,如合同蓋章/規章制度發布/法審意見等場景下引入電子章解決蓋章需求。 作為特定業務下的統一處理方案,需要在業務管理平臺與電子簽章平臺之間構建一個橋梁,簡化電子簽章平臺…

Spring配置其他注解Spring注解的解析原理

Spring配置其他注解 Primary注解用于標注相同類型的Bean優先被使用權,Primary是Spring 3.0引入的,與Component和Bean一起使用,標注該Bean的優先級更高,則在通過類型獲取Bean或通過Autowired根據類型進行注入時,會選用優…

【C++11并發】future庫 筆記

簡介 C11之前&#xff0c;主線程要想獲取子線程的返回值&#xff0c;一般都是通過全局變量&#xff0c;或者類似機制。C11開始為我們提供了一組方法來獲取子線程的返回值&#xff0c;并保證其原子性。 頭文件 #include <future>std::promise 在promise中保存了一個值…

Python 的字符串格式化指南

字符串格式化 Python 中控制字符串格式通常有三種形式&#xff1a; % 占位符&#xff08;格式化符&#xff09;str.format() 函數f-string 內嵌式 Python 最先開始格式化字符串是用 %&#xff0c;但它的致命缺點是支持的類型有限制&#xff0c;只支持 int&#xff0c;str&am…

【從零開始實現意圖識別】中文對話意圖識別詳解

前言 意圖識別&#xff08;Intent Recognition&#xff09;是自然語言處理&#xff08;NLP&#xff09;中的一個重要任務&#xff0c;它旨在確定用戶輸入的語句中所表達的意圖或目的。簡單來說&#xff0c;意圖識別就是對用戶的話語進行語義理解&#xff0c;以便更好地回答用戶…

XUbuntu22.04之解決gpg keyserver receive failed no data(一百九十三)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 人生格言&#xff1a; 人生…

DevExpress WinForms TreeMap組件,用嵌套矩形可視化復雜分層數據

DevExpress WinForms TreeMap控件允許用戶使用嵌套的矩形來可視化復雜的平面或分層數據結構。 DevExpress WinForms有180組件和UI庫&#xff0c;能為Windows Forms平臺創建具有影響力的業務解決方案。同時能完美構建流暢、美觀且易于使用的應用程序&#xff0c;無論是Office風…

中文rlhf數據集50w條數據解析

中文rlhf數據集50w條數據解析 解析代碼數據名代碼解析 解析代碼 import jieba from tqdm import tqdm import re import pandas as pd import numpy as npdef find_non_english_text(text):pattern re.compile(r[^a-zA-Z])return pattern.sub(, text)def find_chinese_text(t…

教育數字化轉型:塑造未來學習新范式

在國家教育數字化戰略行動指引下&#xff0c;我國正積極推動數字化賦能教育高質量發展&#xff0c;以塑造教育發展的新優勢。如今&#xff0c;隨著科技新基建的普及和數字化賦能教育的深入推進&#xff0c;未來的教育模型正在逐漸形成。 在新的教育模型中&#xff0c;數字化學…

算法基礎(python版本)

第二章 算法設計思想 一、搜索排序 1.排序算法 https://visualgo.net/zh/sorting (1)冒泡排序 # 思路&#xff1a; # (1)比較相鄰元素&#xff0c;如果第一個比第二個大&#xff0c;則交換他們 # (2)第一輪下來&#xff0c;可以保證最后一個數一定是最大的&#xff1b;第二…

2023最全的Web自動化測試介紹

做測試的同學們都了解&#xff0c;做Web自動化&#xff0c;我們主要用Selenium或者是QTP。 有的人可能就會說&#xff0c;我沒這個Java基礎&#xff0c;沒有Selenium基礎&#xff0c;能行嗎&#xff1f;測試雖然屬于計算機行業&#xff0c;但其實并不需要太深入的編程知識&…

介紹一個功能強大的shopify app——TINYIMG

各位觀眾老爺&#xff0c;南來的北往的&#xff0c;東去的西走的&#xff0c;今天給大家推薦一個功能很強大的shopify app 當當當 那就是 tinyimg 這個app有多牛逼呢&#xff0c;且聽我慢慢道來 首先這個app可以用來優化圖片大小&#xff0c;給你的網站提提速 然后這個app還可…