生产问题排查:springboot项目启动时注册nacos失败或运行时从nacos闪退

文章目录

  • 一、引出问题
  • 二、解决方案
    • 1、使用actuator健康检查
    • 2、项目启动时判断nacos是否正常连接
    • 3、k8s设置探针

一、引出问题

生产项目是用k8s部署的,最近经常遇到启动时注册不到nacos(查找nacos的host地址找不到),或者运行的好好的,突然也连不上nacos了(同样是查找nacos的host地址找不到)。

问题定位到,由于网络或其他问题,导致pod之间的网络出现了问题,导致根据服务名查找pod失败。

解决方案:考虑到几乎无法让pod自行连接上nacos了,所以考虑应用加上actuator健康检查,k8s加上探针,如果应用健康检查不通过,就重启pod。

二、解决方案

1、使用actuator健康检查

引入actuator健康检查,如果nacos注册失败,就重启容器

因为k8s已经支持了健康检查服务,每隔一段时间就会进行健康检查。

这里用到了spring-boot-starter-actuator

启动健康检查之后,访问/actuator/health,会提示UP,如果nacos宕机或者网络连接不上,会提示DOWN,并且返回码是503:
在这里插入图片描述
如果nacos正常的话,status是UP,并且返回码是200:
在这里插入图片描述

2、项目启动时判断nacos是否正常连接

项目启动时,如果nacos连接不上,就会在main方法抛出异常:
在这里插入图片描述
根源就是调用nacos -server端的api时发生的异常,但是如果捕捉这个异常,就会对业务代码侵入性较强。

好在如果发生了这个异常,就会中断springboot项目的启动,用健康检查就非常的合适,此时健康检查的接口都调用不到。

3、k8s设置探针

参考文档:https://www.cnblogs.com/shenyuanhaojie/p/16439958.html

官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

目前的k8s健康检查,http请求只能根据响应码来判断,如果想通过json体来判断,恐怕需要自定义一个接口了(或者用正则进行解析)。
但是springboot自带的actuator,是可以根据服务的健康状态返回不同的响应码的。

以下是大模型 给的结果,没验证过:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
所以,要加上restartPolicy配置:

在Kubernetes(简称K8s)中,Pod的重启策略定义了当容器失败时kubelet如何处理。有三种主要的重启策略:

Always
这是默认的重启策略。如果设置了为“Always”,那么无论容器停止运行的原因是什么(无论是正常退出还是异常终止),kubelet都会自动重启该容器。这意味着只要Pod尚存在,即使容器连续出错,kubelet也会不断地尝试重启容器。

OnFailure:
如果设置为“OnFailure”,则只有当容器以非0状态退出码结束时,kubelet才会尝试重启该容器。若容器正常退出(即退出码为0),kubelet将不会进行重启操作。

Never:
当设置为“Never”时,kubelet将不会对任何原因导致停止运行的容器进行重启。一旦容器停止,它将保持停止状态,直到手动干预或关联的控制器采取行动。

OnCrash(崩溃时重启)
该策略主要用于DaemonSet中的Pod。只有在节点重启或Pod崩溃后,才会触发Pod的重启。

综上所述,每个Pod中的所有容器共享相同的重启策略,由Pod的spec.restartPolicy字段指定。需要注意的是,当Pod被控制器(如Deployment、StatefulSet等)管理时,即使Pod未明确指定重启策略,控制器也会根据自身逻辑控制Pod副本的重启行为。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22107.shtml

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

相关文章

有文字转语音真人发声吗?这5个配音工具堪比真人配音

青春是一首永不老去的歌,它镌刻在生命的唱片上,永不退色。 每当我们听到那些熟悉的旋律,心中总会涌起一股暖流,仿佛回到了那个充满活力和梦想的年代。借助现代科技的力量,我们可以通过文字转语音软件,让这…

.NET集成DeveloperSharp实现图片的裁剪、缩放、与加水印

🏆作者:科技、互联网行业优质创作者 🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 🏆欢迎关注我(Net数字智慧化基地),里面…

Apache Doris 基础 -- 数据表设计(表索引)

1、索引概述 索引用于帮助快速过滤或搜索数据。目前,Doris支持两种类型的索引:内置智能索引和用户创建的二级索引。 内置智能索引 排序键和前缀索引:Apache Doris基于排序键以有序的方式存储数据。它为每1024行数据创建一个前缀索引。索引中的键是当前1024行组的…

github搭建个人博客

准备工作 windows安装nodejs windows安装git windows安装hexo 拥有gitee个人账户 配置信息 通过gitee创建博客仓库 登录gitee平台,进入主界面,右侧加号,新建仓库,注意:仓库名称和gitee用户名称一致 生成/添加 SSH 公…

初级网络工程师之入门到入狱(一)

本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、交换机二、路由器三、DHCP(动态主机配置协议)四、路由器配置 DHCP自…

【golang】go语言读取Excel表格中的数据

导入库基本用法封装 在Go语言中,可以使用第三方库来读取Excel文件。 常用的库是github.com/tealeg/xlsx,提供了处理Excel文件的功能。 导入库 首先,安装"github.com/tealeg/xlsx"库。可以通过以下命令在终端中安装: g…

Transformer系列:Greedy Search贪婪搜索解码流程原理解析

解码器预测流程简述 Encoder-Decoder这类框架需要在解码器中分别拿到前文已经翻译的输入,以及编码器的输出这两个输入,一起预测出下一个翻译的单词。在训练阶段,一个句子通过右移一位的方式转化为从第二个词到最后一个词的逐位预测任务&…

Springboot vue elementui 前后端分离 事故灾害案例管理系统

源码链接 系统演示:https://pan.baidu.com/s/1hZQ25cpI-B4keFsZdlzimg?pwdgw48

【Golang】go语言写入数据并保存Excel表格

导入包创建文件添加表格添加行添加单元格保存文件封装 导入包 首先,安装github.com/tealeg/xlsx库。可以通过以下命令在终端中安装: go get github.com/tealeg/xlsx创建文件 指定好文件的名字 fileName : "D:\\a.xlsx"再判断文件是否存在&…

Java集合概述

分类 分为两大类:Collection接口类和Map接口类 这两个接口都继承自一个共同的接口:Iterable接口,意为可迭代的 Iterable接口当中有一个Iterator迭代器接口对象,作为接口的变量(public static final修饰)…

Win10字体模糊?记好这5个方法,解决问题很简单!

“我的电脑是win10的,不知道是什么原因,电脑字体总是很模糊,大家有什么方法可以解决这个问题吗?” 在数字时代的浪潮中,Win10以其出色的性能和丰富的功能赢得了广大用户的青睐。然而,就像任何一款操作系统一…

广东电网突破2亿千瓦,华火新能源电燃灶引领绿色烹饪“灶”未来

近日,广东电网统调装机容量历史性突破2亿千瓦,标志着广东省在电力发展上迈出了坚实的步伐。这一重大成就不仅彰显了广东在能源领域的强劲实力,也为华火新能源电燃灶等绿色技术的普及应用提供了有力的支撑。 广东电网统调装机容量的突破&#…

用ffmpeg对视频添加语音、背景音乐和字幕的方法

先看代码: ffmpeg.exe ^ -i "D:/test/video.mp4" ^ -i "D:/test/voice.mp3" ^ -i "D:/test/music.mp3" ^ -i "D:/test/voice.srt" ^ -filter_complex "[1:a]volume1.0,asetptsPTS-STARTPTS[a_voice];[2:a]volume0.5,…

【 0 基础 Docker 极速入门】镜像、容器、常用命令总结

Docker Images(镜像)生命周期 Docker 是一个用于创建、部署和运行应用容器的平台。为了更好地理解 Docker 的生命周期,以下是相关概念的介绍,并说明它们如何相互关联: Docker: Docker 是一个开源平台&#…

重生奇迹mu五大王国

勇者大陆王国 奇迹大陆的战士,他们因为非常重视剑,而且穿着黑色的衣服,所以叫他们魔剑士。古代勇者大陆王国的魔剑士们都是用铠甲伪装自己的。但是这些个联合国统一成一个帝国之后,勇者大陆王国渐渐成为一个小城市。千年之后的现…

数据持久化第七课-URL重写与Ajax

数据持久化第七课-URL重写与Ajax 一.预习笔记 1.URL重写(对网页地址进行保护) 首先编写module,实现对网络地址的处理 其次就是module的配置 最后验证url重写技术 2.Ajax数据交互 编写后端响应数据 处理跨域的配置问题 运行项目得到后端响应数据的地址 编写前端ajax进行数据请…

程序人生 - 前端拿到后端数据,不能直接用还要再处理,合理吗?

前言 从后端拿到的 list 是散的,需要前端遍历 list 根据 item 的某些属性把同类型的 item 合并到一个 list 中,这样合理吗?我觉得这个不是应该在后端完成的吗? 这种撕扯,让我想起很久之前的一个笑话。我有个朋友之前…

EXCEL上传得时候特殊情况

比如excel里面不全是我们需要的,还有一些需要处理EXCEL中的日期,去掉‘-’等 DATA:begin_row TYPE i VALUE 2,begin_col TYPE i VALUE 1,end_row TYPE i VALUE 9999,end_col TYPE i VALUE 90,filename TYPE rlgrap-filename,gt_excel TYPE zalsme…

AI产品经理系列-如何使用kimi快速撰写用户故事(含提示词)

在AI时代,可能人人都可成为产品经理。 之前我们聊过如何使用kimi协助完成产品需求文档,如何写竞品分析报告,这一篇我们聊聊用户故事,如何使用kimi协助撰写产品需求文档中的用户故事。 在此之前我们先了解下什么是用户故事&#…

深入理解Django Serializer及其在Go语言中的实现20240604

深入理解Django Serializer及其在Go语言中的实现 在现代Web开发中,前后端分离已成为主流架构模式。作为开发者,我们经常需要处理数据的序列化和反序列化,以便在前后端之间传递数据。在Django中,Serializer是一个强大的工具&#…