为什么

我们新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

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

  1. 计算机成绩名次怎么算,excel表格如何计算同一名学生二次考试成绩的上升和下降名次?...

    第一次考试存在sheet1表:10名学生姓名存在A列,即A1到A10:学生分数存在B列,即B1到B10:同样,第二次考试存在sheet2表, 现把sheet1表中C列作为存放学生上升或下降的名次 =R ...

  2. 批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

    批量梯度下降(BGD).随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解 </h1><div class="clear"></div> ...

  3. 网站排名下降的原因,网站排名下降怎么办?

    很多企业做seo,搜索引擎优化最终的目的就是获得流量并且靠流量获利,而真正想要让网站获得大量精准流量的前提就是,网站关键词的排名,可以这么说,seo就是围绕着当前网站关键词的排名所进行的优化,但是在搜 ...

  4. 梯度算法之梯度上升和梯度下降

    转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thi ...

  5. 机器学习:随机梯度下降(SGD)与梯度下降(GD)的区别与代码实现。

    机器学习:随机梯度下降(SGD)与梯度下降(GD)的区别与代码实现. 梯度下降法(GD) 随即梯度下降(SGD) 代码实现 如果想细致的了解:-> 梯度下降法 梯度下降法(GD) 假设函数fx, ...

  6. spring oauth2 的error_description本地提示中文,线上提示英文。

    spring oauth2 的error_description本地提示中文,线上提示英文. 自由的灵魂需要一颗勇敢的心,要勇敢的自发去成全自己. 解决方案 在yml或properties文件中进行如 ...

  7. 前后端分离 -- 深入浅出 Spring Boot + Vue + ElementUI 实现相册管理系统【文件上传 分页 】 文件上传也不过如此~

    前后端分离 – 深入浅出系列 Spring Boot + Vue + ElementUI 实现相册管理系统[文件上传 分页 ] 文件上传也不过如此~ 引言 Hello,我是Bug终结者,一名热爱后端J ...

  8. 防止内卷和被潜规则,Spring Cloud Alibaba微服务架构实战派(上下册)|35岁程序员那些事

    目录 1 写书缘由 2 本书上册核心内容 2.1 Spring Cloud Alibaba基础实战 2.1.1 主要内容 2.1.2 MyBatis-Plus实现多租户架构的核心原理 2.2 分布式服 ...

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

    spring health 为什么 我们新JavaScript客户端应用程序会定期调用Grails后端的/health端点,以确定离线状态. 事情开始变得"​​有趣". 我们免费获 ...

最新文章

  1. openGL学习笔记(1)——常用方法原型解释
  2. String与NSString关系
  3. hibernate中@Entity和@Table的区别
  4. MongoDB高可用集群搭建
  5. java8 filter return_java8新特性Java 8 Streams filter示例 - Java教程
  6. Xcode 如何使用旧版本SDK以保证程序兼容性
  7. Adobe Edge Animate --点击元件内部元素使元件其他元素发生改变
  8. html颜色代码表_html颜色代码表
  9. static_cast, dynamic_cast, const_cast,reinterpret_cast探讨
  10. mysql 配置 explicit_defaults_for_timestamp
  11. HTML5 Guitar Tab Player
  12. golang中GDK和UTF8编码转换
  13. 机器学习诗词创作_通过机器学习创作音乐
  14. CALPHAD方法中“外推”的理解
  15. GarsiaWachs算法
  16. vue中使用天地图测距、测面、标点【一】
  17. php是什么化学物,dmap是什么化学物质以及它的性质用途
  18. 【数字孪生】数字孪生十问:分析与思考
  19. GBase 8a 虚拟集群
  20. oscam android 编译,phoscam app-phoscam安卓版预约 v1.0官方版_5577安卓网

热门文章

  1. Nacos(二)之概念
  2. BATJ面试必会|Jvm 虚拟机篇
  3. JavaFX UI控件教程(二十四)之Password Field
  4. 达到年薪 40W 必需掌握的技术
  5. 人人都能掌握的Java服务端性能优化方案
  6. 面试必问的 CAS ,要多了解
  7. 漫画:什么是动态规划?(整合版)
  8. java嵌套类与内部类
  9. sql server链接查询
  10. android解决工具类中没有context中的问题