为什么Spring的健康状况会再次下降,下降,上升,上升,上升和下降?

为什么

我们新JavaScript客户端应用程序会定期调用Grails后端的/health端点来确定离线状态。 事情开始变得“​​有趣”。

我们免费获得此端点,因为Grails基于Spring Boot,而Spring Boot带有一个名为Spring Boot Actuator的子项目。

这给了我们许多端点 ,使我们可以监视我们的应用程序并与之交互,包括/health返回健康信息。

因此,我们的JS客户端会检查它是否可以到达此/health端点(每隔几秒钟执行一次),以确定用户是在线还是离线。 没什么好想的,以后我们可能会切换到仅使用Google主页之类的东西,但是现在可以了。

健康检查失败

localhost一切似乎总是正常的,但是,一旦我有了Jenkins管道,最终在每次构建后将应用程序部署到我们的测试服务器,我们就开始在那里验证应用程序,事情变得很有趣。

通常情况下,我们的通话情况非常好。

GET https://tst.example.com/health 200 ()
GET https://tst.example.com/health 200 ()
GET https://tst.example.com/health 200 ()
etc

每隔几秒钟,我们就会在Chrome Inspector中看到错误累积的情况。 运行状况检查将失败,并且HTTP状态代码503 Service unavailable长时间503 Service unavailable

GET https://tst.example.com/health 503 ()
GET https://tst.example.com/health 503 ()
GET https://tst.example.com/health 503 ()
etc

过了一会儿,我们会再次接到好电话!

GET https://tst.example.com/health 200 ()
GET https://tst.example.com/health 200 ()
etc

这些失败请求的响应只是说

{"status":"DOWN"}

从设计上来说,这不是很描述。

我当然没有写任何healh指标自己会这样,为什么会“下降”?

经验丰富的Spring Booters知道它将在类路径上获取任何运行状况指示器,并且默认情况下带有一些。 实际使用的是一个谜,因为默认情况下,Spring Boot将该端点归类为“敏感”,因此不会向外界公开太多信息。

我必须通过设置以下设置来使运行状况检查更加“有趣”:

endpoints.health.sensitive: false

现在,手动调用端点即可显示竞争者!

{"status":"DOWN","diskSpace":{"status":"DOWN","total":8579448832,"free":20480,"threshold":10485760},"db":{"status":"UP","database":"H2","hello":1}
}

“关闭”的一般状态是(在本例中为2)现在明确列出的自动配置的运行状况指示器的汇总结果。

当我看到以下内容时,立即想到的是:

  • 我为什么还没有去除H2
  • 嘿,测试服务器上的磁盘空间已经用完了吗?

H2数据库是所有Grails应用程序中的默认依赖项,但是我们的应用程序不使用它-不在生产环境中也不用于测试-因此,我们一定要从依赖项中删除它。 不用担心。

关于磁盘空间,这是很好的DiskSpaceHealthIndicator (实际上是自动配置的指示器的一部分 ),告诉我事情不健康

它的默认阈值为10485760字节或10 MB ,这是应该可用的最小磁盘空间。

而且……只有20 kb的可用空间? 总共8场演出。

那是一个相当低的数字

在最初的0.7秒内,我不相信健康指标,您能想象吗?

因此,我通过SSH进入测试服务器,以使用df实用程序检查可用磁盘空间:

[Ted@server-01t ~]$ df -h
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root  8.0G  8.0G   20K 100% /
...

是的,至少健康检查证明了事实的真相:实际上只剩下一小块空间。

我将其转给配置此机器的IT同事进行调查。 似乎早先的实验已经存在一些Java堆转储,占用了空间-有人告诉我将尽快将其删除。

最好也检查其他节点。

[Ted@server-02t ~]$ df -h
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root  8.0G  5.3G  2.8G  66% /

那里有足够的空间。

等一下? “其他节点?” 是的,我们有2个测试服务器01t02t

那时,我意识到:我看到的行为是由于负载tst.example.com将请求转发到tst.example.comserver-01t或另一个server-02t 。 其中之一是磁盘空间不足,这说明服务器上Grails应用程序的运行状况指示器显示“关闭”,从而导致HTTP 503。

当通过Chrome Inspector观察这些运行状况调用(这些请求由我们的JS客户端不断发出)时,只剩下一个小问题:为什么我们会有(有时50倍)“涨”( 200 ),然后一连串的“跌” ”( 503 ),然后看似随机?

负载平衡器应使我们“固定”在JS客户端首次发出请求的那个节点上,因为我们这样配置服务器。

如果负载tst.example.com每个请求 (发送给tst.example.com )轮流发送给服务器1或2,我期望会有更多(随机)响应,例如“ up”“ down”“ down”“ up” ,“ “向下”“向上”“向上”“向下”“向上”

好吧,在我观察此行为的窗口期间,似乎团队的其他成员仍在开发功能,并…推向Jenkins选择的Git,并将其部署到两台服务器上。 由于将应用程序串行重新部署到ech服务器,因此负载平衡器“看到” 一台服务器上的应用程序不可用(具有足够的磁盘空间: “ up”“ up”“ up”“ up”“ up” ” )在部署期间将流量重定向到另一台服务器 (几乎没有磁盘空间: “关闭”“关闭”“关闭” ))…

…不久之后便用新的WAR更新,并再次在另一台服务器上结束请求(具有足够的磁盘空间: “ up”“ up”“ up”“ up”“ up” )。

再花3个小时浪费我的生命。 包括一些时间在这里记下这些东西(但我认为这是值得的)

学过的知识

了解你的过程

知道有一个负载均衡器和多个节点(以及它们如何工作)会有所帮助。 而且CI服务器不断将新版本部署到正在调查的环境中并没有帮助。 但是完全知道这确实有助于澄清观察到的行为。

了解您的框架的“明智”默认设置。

如果使用Grails 3和Spring Boot,请了解从类路径“自动配置”的内容 ,检查并确保它确实是您想要的

我们将摆脱H2并检查我们实际需要的运行状况指标,可能会完全禁用自动配置。 我们清理了导致堆满的Java堆转储。 我们已经再次确认Unix团队将监视操作系统,包括磁盘空间,以便至少不再需要DiskSpaceHealthIndicator

翻译自: https://www.javacodegeeks.com/2017/10/why-is-springs-health-down-down-up-up-up-and-down-again.html

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

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

相关文章

浅谈auto与decltype函数的区别

auto与decltype都是C里处理类型的指示符,它们的使用场景如下: autodecltype在我们需要给变量赋值的时候,简单的程序往往可以通过观察得出表达式的类型,但在一些大型程序中这样做往往是行不通的,为此可以使用auto指示符…

php mysql 快餐_用PHP+MYSQL做一个简单的点餐系统的后台,初学者. 请高手指点下如何实现后台添加菜名 餐馆 价格...

展开全部" name"cm" placeholder"菜名" type"text" />" name"cg" placeholder"餐馆" type"text" />" name"jg" placeholder"价格" type"text" />if…

三句话讲清楚直接初始化与拷贝初始化

直接初始化 int main() {int a(3);printf("%d",a); }拷贝初始化 int main() { int a3; printf("%d",a); }区别 直接初始化拷贝初始化不使用等号初始化一个变量就是直接初始化使用等号初始化一个变量就是拷贝初始化 直接初始化与拷贝初始化的使用一般以代…

redhat 9.0 mysql 配置_RedHat 9.0下Apache+PHP+MySQL服务器安装配置

一、安装环境操作系统:Linux RedHat 9.0web服务软件:Apache httpd-2.2.3.tar.gz数据库软件:MySQL-server-5.0.26-0.i386.rpm(服务端)MySQL-client-5.0.26-0.i386.rpm(客户端)MySQL-devel-5.0.26-0.i386.rpm(开发包)MySQL-shared-5.0.26-0.i38…

spark减少内存消耗_将内存消耗减少20倍

spark减少内存消耗这将是另一个故事,与我们分享有关内存相关问题的最新经验。 该案例是从最近的客户支持案例中提取的,在该案例中,我们遇到了一个行为异常严重的应用程序,该应用程序因生产中的OutOfMemoryError消息而死。 在连接了…

运筹视角下,体系化学习机器学习算法原理的实践和总结

文章目录 引言目标设计目标实践文章汇总经验总结一则预告 引言 上两周总结了我在体系化学习运筹学基础知识方面的个人经验,看过那篇文章的人可能知道,今年我还花了很多时间学习机器学习中各种模型的算法原理。 在工业应用中,机器学习和运筹…

C++输出一句话里面第一个单词并大写

这里主要是使用了decltype()函数来方便我们对数据处理&#xff0c;它可以自动的帮助我们推算变量的类型&#xff0c;防止后面出现溢出的错误 #include<iostream> #include<string> using namespace std; int main() {string s1("juice and rice");//迭代…

低版本mysql utf8mb5_记住:永远不要在 MySQL 中使用 UTF-8

最近我遇到了一个 bug&#xff0c;我试着通过 Rails 在以“utf8”编码的 MariaDB 中保存一个 UTF-8 字符串&#xff0c;然后出现了一个离奇的错误&#xff1a;Incorrect string value: ‘\xF0\x9F\x98\x83 我用的是 UTF-8 编码的客户端&#xff0c;服务器也是 UTF-8 编码的&…

C++中使用cin读取一组词存入vector后将其大写打印

今天在复习C的时候偶然看到这个题目&#xff0c;要求是使用C完成大写转换然后存放到vector中去&#xff1a; 这里也是使用了一个string库&#xff0c;但不知道为什么string库里并没有自带大小写转化&#xff0c;只得使用algorithm库的transform函数来进行大小写转化 #include&…

使用Logstash,JDBC将数据聚合并索引到Elasticsearch中

介绍 在我以前的帖子在这里和这里我展示了如何使用JDBC和Elasticsearch JDBC进口商库从SQL数据库索引数据到Elasticsearch。 在这里的第一篇文章中&#xff0c;我提到了使用导入程序库的一些缺点&#xff0c;这些缺点我已在此处复制&#xff1a; 不支持ES版本5及更高版本 嵌套…

hive选择mariadb还是mysql_Hive MariaDb的安装

1.安装命令yum -y install mariadb-server mariadb2.进入mariadb数据库mysql -u root -p //第一次登录时的密码为空3.修改mariadb数据库密码update user set passwordpassword(sugar) where userroot;4.设置root用户可以从任何主机登录&#xff0c;对任何的库和表都有访问权限g…

一文带你彻底搞懂C++中一些常见指针(形如*p)的用法

提高指针效率以及程序可读性 为什么要后置运算符&#xff1f; 有C语言编程经验的人可能会感到疑问&#xff0c;为什么在C里面我们推荐优先使用运算符的前置版本&#xff0c;就是把运算符号放在变量的前面&#xff0c;前置版本的递增避免了不必要的工作&#xff0c;它将值加一后…

mysql ssd tps 上不去_转【案例分享】压测TPS上不去

1.问题描述&#xff1a;客户新上的一个关键业务系统&#xff0c;在做上线前的压力测试时&#xff0c;应用的并发无法达到上线前的并发指标和响应时间指标要求。压测时TPS的曲线很不稳定&#xff0c;如下所示&#xff1a;2.分析过程&#xff1a;从上述知识点可以知道&#xff1a…

C++函数概念解析(1)

函数 一个典型的函数包含以下几个部分 返回类型函数名称一个或者多个形参函数体 举例如下 int fact(int ival) {int ret1;while(val>1)ret*val--;//这里先乘再减return ret; }函数名fact形参ival实参ret返回类型int 每当我们定义出一个函数&#xff0c;我们不能直接使用…

棋牌类游戏算法–牌分类_快速分类–三向和双枢轴

棋牌类游戏算法–牌分类毫无疑问&#xff0c;Quicksort被认为是本世纪最重要的算法之一&#xff0c;并且它是许多语言的事实上的系统排序&#xff0c;包括Java中的Arrays.sort 。 那么&#xff0c;quicksort有何新功能&#xff1f; 好吧&#xff0c;除了我刚刚&#xff08;在J…

真实收货地址大全2016_中国古典诗词大全汇集了诗经、唐诗、宋词、元曲以及纳兰词,12册精美套装。...

↑点击上方“诗画天地”关注我们诗词也如人生&#xff0c;你驻足便是驿站&#xff0c;你前行便是风景。任由时光无尽幻变&#xff0c;回眸处星孤月洁&#xff0c;阅读诗词能让人生变得清明透彻&#xff0c;仿佛与古人走在同一条道上&#xff0c;俯仰之间&#xff0c;人生皆是诗…

C++函数概念解析(2)

数组形参 我们为函数传递一个数组时&#xff0c;实际传递的是这个数组的指针 void print(const int*); void print(const int[]);//函数的意图是作用于一个数组 void print(const int[10]);以数组作为形参的函数也必须保证这个数组不越界 使用标记指定数组长度 以C风格字符串…

C++中函数概念解析(3)

概念&#xff1a; 如果同一作用域里几个函数的名字相同但形参列表不相同&#xff0c;我们称之为重载&#xff08;overload&#xff09; 它们这些函数接受的参数不一样&#xff0c;但执行的操作非常类似&#xff0c;当调用这些函数时&#xff0c;编译器会根据传递的实参类型推断…

python可以帮机器人编程吗_Python如何实现机器人聊天

今天午休的时候&#xff0c;无意之中看了一篇博客&#xff0c;名字叫Python实现机器人&#xff0c;感觉挺有的意思的。于是用其写了一个简单的Python聊天&#xff0c;源码如下所示:# -*- coding: utf-8 -*-import aimlimport sysimport osdef get_module_dir(name):print("…

测试案例6种编写方法_一种编写测试的好方法

测试案例6种编写方法测试。 我最近一直在考虑测试。 作为我对各种项目所做的代码审查的一部分&#xff0c;我已经看到了数千行未经测试的代码。 这不仅是测试覆盖率统计数据指出这一点的情况&#xff0c;更是该项目中根本没有任何测试的情况 。 我一直听到这种悲惨状况的两个原…