spring health_为什么Spring的Health会再次向下,向下,向上,向上,向上和向下?...

spring health

为什么

我们新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检查器中看到错误累积的情况。 运行状况检查将失败,并且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.comserver-01t或另一个server-02t 。 其中之一是磁盘空间不足,这说明服务器上Grails应用程序的运行状况指示器显示“关闭”,从而导致HTTP 503。

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

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

如果负载均衡器将每个请求 (发送给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

spring health

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

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

相关文章

使用JDBC连接数据库(MySQL)的源代码

文章目录JDBC 访问数据库的步骤使用 JDBC 访问数据库的演示代码使用 PreparedStatement 对象查询插入更新删除使用 Statement 对象查询删除JDBC 访问数据库的步骤 将 jdbc 驱劢程序相关的 jar 包 copy 到 WEB-INF/lib 下在 servlet 代码当中,使用 jdbc 访问数据库&…

popupwindow 不抢夺焦点_央视专访“上个厕所就要3000块”的亲历者, 被“坑”的不愉快经历...

资讯 聚焦 活动 宣传 推广 品牌 热文 找小编合作加个人微信2871001801百度百科:宁河于雍正九年(1731年)从宝坻县分出,据《河北省县名考原》称:“蓟运河纵贯县境,时多水患,故县以宁河名”!当然还有另外别的解释!民国三年(1914年)属直隶省津海道,民国十七年(1928年…

gitlab10.x迁移_1.x到2.x的迁移:可观察与可观察:RxJava FAQ

gitlab10.x迁移标题不是错误。 rx.Observable 1.x的io.reactivex.Observable与2.x的io.reactivex.Observable完全不同。 盲目升级rx依赖关系并重命名项目中的所有导入将进行编译(稍作更改),但不能保证相同的行为。 在项目的早期, …

ubuntu安装与配置mysql_ubuntu下mysql的安装与配置

安装MySQL sudo apt-get install mysql-server 这个应该很简单了,而且我觉得大家在安装方面也没什么太大题目,所以也就未几说了,下面我们来讲讲配置。 配置MySQL 留意,在Ubuntu下MySQL缺省是只安装MySQLsudo apt-get install mysq…

Servlet 处理多种请求应用

一个 Servlet 如何处理多种请求? 1.使用后缀匹配模式 2.在 service 方法中获取请求资源路径,分析资源路径来决定作何处理 示例代码如下: package priv.lwx.javaex.web_demo_02.web.servlet;import javax.servlet.http.HttpServlet; import javax.serv…

小程序搜索框_微信小程序搜索及优化相关知识科普

生活中我们常常会用到微信小程序,但很多人不知道该如何搜索、找到小程序;而有些已经做了自己的小程序的商家,也不懂怎么提升自己的微信小程序搜索效果。所以下面就跟大家科普下这两个问题。1.怎么搜索微信小程序打开微信,点击右上…

java 函数式编程 示例_功能Java示例 第1部分–从命令式到声明式

java 函数式编程 示例功能编程(FP)的目的是避免重新分配变量,避免可变的数据结构,避免状态并全程支持函数。 如果将功能性技术应用于日常Java代码,我们可以从FP中学到什么? 在这个名为“ Functional Java …

su联合推拉插件_[实习小记一一SU建模]

鉴于本菜鸡在实习阶段一直在SU建模,那就讲讲我在SU建模的心路历程吧。本菜鸡之前还是SU小白时(俗称白斩鸡,并且现在也很白),只会死命地用推拉。来到公司初探SU,第一个高层建筑便花费我半个月的时间(我突然想起有一篇日记特别好笑我是个SU人&a…

Linux 命令之 tar 命令-打包和备份的归档工具(附压缩/解压工具)

文章目录一、命令介绍二、命令语法三、常用选项四、命令示例(一)对指定的目录进行打包(即备份归档),不压缩(二)对指定目录下的内容(不含目录本身)进行打包(即…

纹理和基元_通过粘性仙人掌基元进行延迟加载和缓存

纹理和基元您显然知道什么是延迟加载 ,对吗? 而且您无疑知道缓存 。 据我所知,Java中没有一种优雅的方法来实现它们中的任何一个。 这是我在Cactoos原语的帮助下为自己找到的。 Matteo Garrone的《 Reality》(2012年)…

oracle 造数据脚本_Oracle数据库shell脚本--统计所有数据库用户信息及明细

概述今天主要分享一下两个shell脚本,主要是为了查看所有数据库用户及其表空间,统计某个指定用户的明细,下面一起来看看吧~数据库连接脚本use script settdb.sh for DB login details registry#!/bin/bashtmp_username$SH_USERNAMEtmp_passwor…

学维修电脑要多久_学厨师要多久才出师

学厨师一般要学多久?以苏州新东方学厨师为例:厨师培训可以分为长期、短期。中餐、西餐、西点长期专业学习时间1-3年不等;短期专业从7天到8个月不等,主要是按学习内容来划分,比如学苏式汤面,只需要半个月左右…

Linux 命令之 rpm -- RPM 软件包的管理工具

文章目录一、命令介绍二、语法结构三、常用选项用于查询和检查包用于安装、升级和删除包用于执行其他功能四、命令示例(一)查询和检查包1. 查看一个已安装包的信息(版本、用途等)2. 查看与指定程序相关的所有安装文件3. 查看一个已…

react核心虚拟dom_使用虚拟时间测试基于时间的React堆核心流

react核心虚拟domReactor Core实现了Reactive Streams规范,并处理了(可能无限的)数据流。 如果您感兴趣,请查看它提供的出色文档 。 在这里,我假设对Reactor Core库的Flux和Mono类型有一些基本的了解,并且将…

图书管理系统python语言-Python简易版图书管理系统

本文实例为大家分享了python图书管理系统的具体代码,供大家参考,具体内容如下 """ 图书管理系统 """ import random # books{书名:剩余数量, 书名:剩余数量} import time books {"防脱发指南": 5, "颈椎康…

docker 打包mysql_基于docker部署mysql的数据持久化问题

本人最近在使用docker部署mysql时,在持久化mysql数据时遇到了一个有趣的问题,将排查过程及思考记录在这里,以备后查。先简单描述下我遇到的问题:在mysql容器中创建了两个数据库,然后使用docker commit想要保存容器的修…

Linux 命令之 ls -- 列出指定目录下的内容

文章目录一、命令介绍二、语法格式三、常用选项四、参考示例(一)显示工作目录下(当前目录)所有的文件和目录(二)显示工作目录下所有的文件和目录(三)显示文件的详细信息,…

kotlin dsl_Spring Webflux – Kotlin DSL –实现的演练

kotlin dsl在以前的博客文章中,我描述了Spring Web Framework中的响应式编程支持Spring Webflux如何使用基于Kotlin的DSL使用户能够以非常直观的方式描述路由。 在这里,我想探索一些底层实现。 描述一组端点的样本DSL看起来像这样: package…

cad调了比例因子没反应_「室内设计」大神们都在用的9个CAD制图技巧,你会用几个?...

1、快捷特性面板如何调取?2、 如何快速恢复上一次删除物体?3、 如何快速关闭监视注释器?4、如何快速处理重复碎线?5、如何解决虚线在模型空间和布局空间显示不一致的问题?6、 如何快速更改图块名称?7、 PL线…

ubuntu 12下的apache+php+mysql_老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略

一、首先安装MySql:对于MySql来讲在整个过程中是相对独立的安装,并且我的ubuntu在以前做开发的时候就已经安装了MySql,所以以下只给出安装步骤:1、安装MySql的服务:sudo apt-get install mysql-server要注意的是安装过…