解决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.mzph.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还可…