解决kubernetes中微服务pod之间调用失败报错connection refused的问题

news2024/11/15 9:25:14

现象:

 

从这里可以看到是当前服务在调用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.coloradmin.cn/o/1245413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python+jieba+wordcloud实现文本分词、词频统计、条形图绘制及不同主题的词云图绘制

目录 序言:第三方库及所需材料函数模块介绍分词词频统计条形图绘制词云绘制主函数 效果预览全部代码 序言:第三方库及所需材料 编程语言:Python3.9。 编程环境:Anaconda3,Spyder5。 使用到的主要第三方库:…

飞书+ChatGPT搭建智能AI助手并实现公网访问web界面

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话,在下面操作步骤中…

时间序列分析算法的概念、模型检验及应用

时间序列分析是一种用于研究随时间变化的数据模式和趋势的统计方法。这类数据通常按照时间顺序排列,例如股票价格、气温、销售额等。时间序列分析的目标是从过去的观测中提取信息,以便预测未来的趋势。 以下是关于时间序列分析的一些重要概念、模型检验…

【深度学习】学习率及多种选择策略

学习率是最影响性能的超参数之一,如果我们只能调整一个超参数,那么最好的选择就是它。相比于其它超参数学习率以一种更加复杂的方式控制着模型的有效容量,当学习率最优时,模型的有效容量最大。本文从手动选择学习率到使用预热机制…

插入排序(形象类比)

最近在看riscv手册的时候,里面有一段代码是插入排序,但是单看代码的时候有点迷,没看懂咋操作的,后来又查资料复习了一下,最终才把代码看明白,所以写篇博客记录一下。 插入排序像打扑克牌 这是我听到过比较形…

RubyMine 2023:提升Rails/Ruby开发效率的强大利器

在Rails/Ruby开发领域,JetBrains RubyMine一直以其强大的功能和优秀的性能而备受开发者的青睐。现如今,我们迎来了全新的RubyMine 2023版本,它将为开发者们带来更高效的开发体验和无可比拟的工具支持。 首先,RubyMine 2023提供了…

IDEA安装教程

文章目录 1 下载IntelliJ IDEA2 安装3 IDEA配置4 创建项目 1 下载IntelliJ IDEA ​ 官方网站上下载最新版本的IntelliJ IDEA。官方网站提供了两个版本:Community版和Ultimate版。 Community版是免费的,适用于个人和非商业用途。Ultimate版则需要付费购…

ESP32之避障

ESP32之避障 图片 程序 int Led27;//定义LED 接口 int buttonpin4; //定义光遮断传感器接口 int val;//定义数字变量val void setup() { pinMode(Led,OUTPUT);//定义LED 为输出接口 pinMode(buttonpin,INPUT);//定义避障传感器为输出接口 } void loop() {Serial.begin(9600);…

JVMj之console Java监视与管理控制台

jconsole Java监视与管理控制台 1、jconsole介绍 jconsole (java monitoring and management console)是一款基于JMX (Java Management Extensions) 的可视化监视和管理工具。 2、启动jconsole 1、在linux和windwos下通过jconsole启动即可。 2、然后会自动搜索本机运行的…

【栈】不同字符的最小子序列

题目: /*** 思路:栈,使用数组记录每个字母出现的次数,再用一个数组标记字符是否在栈中* 遍历栈,存储字符时比较栈顶字符,若小于栈顶字符并且后面有重复的字符则* 栈顶元素出栈,否则入栈。** au…

超级利器!Postman自动化接口测试让你提升测试效率,节省宝贵时间!

Postman自动化接口测试 该篇文章针对已经掌握 Postman 基本用法的读者,即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求的操作。 当前环境: Window 7 - 64 Postman 版本(免费版):Chrome App v5.5.3 …

数字乡村:科技赋能农村产业升级

数字乡村:科技赋能农村产业升级 数字乡村是指通过信息技术和数字化手段,推动农业现代化、农村经济发展和农民增收的一种新模式。近年来,随着互联网技术的飞速发展,数字乡村开始在全国范围内迅速兴起,为乡村经济注入了新…

CVE-2022-0543(Redis 沙盒逃逸漏洞)

简介 CVE-2022-0543是一个与Redis相关的安全漏洞。在Redis中,用户连接后可以通过eval命令执行Lua脚本,但在沙箱环境中脚本无法执行命令或读取文件。然而,攻击者可以利用Lua沙箱中遗留的变量package的loadlib函数来加载动态链接库liblua5.1.s…

tcp/ip协议2实现的插图,数据结构2 (19 - 章)

(68) 68 十九1 选路请求与消息 函rtalloc,rtalloc1,rtfree (69)

解决mv3版本浏览器插件,不能注入js脚本问题

文章目录 背景引入ifream解决ifream和父页面完全跨域问题参考链接 背景 浏览器插件升级mv3版本后,不能再使用content_script内容脚本向原浏览器(top)注入script标签达到注入脚本的目的。浏览器认为插入未经审核的脚本是不安全的行为。 引入…

从0开始学习JavaScript--JavaScript元编程

JavaScript作为一门灵活的动态语言,具备强大的元编程能力。元编程是一种通过操作程序自身结构的编程方式,使得程序能够在运行时动态地创建、修改、查询自身的结构和行为。本文将深入探讨JavaScript中元编程的各个方面,包括原型、反射、代理等…

揭秘周杰伦《最伟大的作品》MV,绝美UI配色方案竟然藏在这里

色彩在UI设计的基本框架中占据着举足轻重的位置。实际上,精心挑选和组合的色彩配色,往往就是UI设计成功的不二法门。在打造出一个实用的UI配色方案过程中,我们需要有坚实的色彩理论知识,同时还需要擅于从生活中观察和提取灵感。以…

MySQL索引事务基础

目录 1. 索引 1.1索引的概念 1.2索引的特点 1.3 索引的使用场景 1.4索引的使用 1.4.1查看索引 1.4.2创建索引 1.4.3删除索引 1.5索引保存的数据结构 2.事务 2.1经典例子 2.2事务的概念 2.3事务的使用 2.4事务的4个核心特性 2.5事务的并发问题 2.5.1脏读 2.5.2不可…

Python Opencv实践 - 全景图片拼接stitcher

做一个全景图片切片的程序Spliter 由于手里没有切割好的全景图片资源,因此首先写了一个切片的程序spliter。 如果有现成的切割好的待拼接的切片文件,则不需要使用spliter。 对于全景图片的拼接,需要注意一点,各个切片图片之间要有…

Linux之实现简易的shell

1.打印提示符并获取命令行 我们在使用shell的时候&#xff0c;发现我们在输入命令是&#xff0c;前面会有&#xff1a;有用户名&#xff0c;版本&#xff0c;当前路径等信息&#xff0c;这里我们可以用环境变量去获取: 1 #include <stdio.h>2 #include <stdlib.h>…