企业级应用:检测服务是否正常运行

news2024/11/23 11:41:24

1.说明:

在公司日常小项目中,会遇到一些小需求,比如:检测服务是否正常运行。

当一个经验不是很足的项目经理,让你写一个接口,然后检测服务是否正常运行啦。

然后你说阿里云有自动检测的接口,还能发短信到你手机上,他说不用。

你说可以用一个定时任务定时给服务发送请求,使用cron可以实现,他也说不用。

然后就用springcloud内部提供的健康监测接口吧,如下说明:

2.方式1:Ping(IP或者域名)

首先说明:使用ping来检测的话,会不可靠的。因为Ping可能会出现错误返回,而用http请求会准确很多

    public static void main(String[] args) {
        String ipAddress = "Recently.com"; // 替换为实际的服务IP地址

        try {
            InetAddress inetAddress = InetAddress.getByName(ipAddress);
            boolean isReachable = inetAddress.isReachable(5000); // 设置超时时间,单位为毫秒

            if (isReachable) {
                System.out.println("服务正常运行");
            } else {
                System.out.println("服务无法访问");
            }
        } catch (IOException e) {
            System.out.println("发生异常: " + e.getMessage());
        }
    }

部分字段说明:

InetAddress.isReachable() 方法用于检测主机的可达性,而不仅仅是服务的可达性。它通过发送一个特殊的ICMP Echo请求(类似于Ping请求)来测试目标主机是否可达。

然而,请注意,isReachable() 方法在不同的操作系统和网络配置下可能会有不同的行为。在某些情况下,由于操作系统或网络设备的限制,该方法可能会返回错误的结果或被阻塞。

此外,isReachable() 方法的实现也依赖于底层操作系统的特性。在某些操作系统上,可能需要具有管理员权限才能正确使用该方法。

因此,对于监测服务是否正常运行的目的,使用基于Ping的可达性测试并不是一种可靠的方法。更好的方法是通过与服务进行实际的通信,例如发送HTTP请求并检查响应状态码。

3.方式2:发送GET请求

1)ServiceMonitor 主类

使用HttpURLConnection发送HTTP GET请求到指定的服务URL,并根据响应代码判断服务是否正常。

public class ServiceMonitor {
    public static void main(String[] args) {
        String serviceUrl = "https://Recently.com:9091/actuator/health";
        Boolean flag =true;
        while (flag){
            try {
                URL url = new URL(serviceUrl);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(5000); // 设置连接超时时间,单位为毫秒
                connection.setReadTimeout(5000); // 设置读取超时时间,单位为毫秒

                int responseCode = connection.getResponseCode();

                 if (responseCode == HttpURLConnection.HTTP_OK) {
                    System.out.println("服务正常运行");
                } else {
                    System.out.println("服务无法访问,响应代码: " + responseCode);
                    // 获取错误信息
                    String errorResponse = getErrorResponse(connection);
                    System.out.println("错误响应内容: " + errorResponse);
                    flag = false;
                }
                Thread.sleep(5000);
            } catch (IOException e) {
                System.out.println("发生异常: " + e.getMessage());
                flag=false;
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }

 // 获取错误响应内容
    private static String getErrorResponse(HttpURLConnection connection) throws IOException {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()))) {
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            return response.toString();
        }
}

这里需要说明一下,SpringBoot项目中是可以存在非入口类main方法的,也就是说非入口类main方法跟入口类main方法可以同时存在项目中,处理不一样的逻辑内容。

代码中的ServiceMonitor类包含一个main方法,用于执行服务监测逻辑。它通过创建URL对象和HttpURLConnection对象来与服务进行通信,并设置连接和读取超时时间。然后,通过调用connection.getResponseCode()方法获取响应代码,根据响应代码判断服务的健康状态。

如果响应代码为HTTP_OK,表示服务正常运行,输出"服务正常运行"。否则,输出"服务无法访问"以及响应代码,并调用getErrorResponse()方法获取错误响应内容并输出。

getErrorResponse()方法中,它通过读取错误流并将内容存储在字符串中,最后返回错误响应内容。

2)DataSourceConfig 获取配置文件中的数据库信息

@Data
@Component
@ConfigurationProperties(prefix = "global.datasource")
public class DataSourceConfig {
    private String url;
    private String username;
    private String password;
}

 在应用启动时,Spring容器会读取配置文件中的属性值,并将其绑定到DataSourceConfig类的对应属性上,可以通过注入DataSourceConfig类的实例来访问这些属性的值。关于Spring容器会读取配置文件中的属性值的详细说明,在我的另一篇文章中有详细说明:SpringBoot中YML,yaml,properties文件的读取_Recently 祝祝的博客-CSDN博客SpringBoot中YML,yaml,properties文件的读取https://blog.csdn.net/qq_45656077/article/details/129013297?spm=1001.2014.3001.5501 

3)HealthCheckController 健康检测主要实现类

@Controller
@RequestMapping("/actuator")
public class HealthCheckController implements HealthIndicator {

    @Autowired
    private DataSourceConfig dataSourceConfig;

    @Override
    public Health health() {
        boolean isHealthy = checkHealth(); // 根据实际需求进行健康状态检查

        if (isHealthy) {
            return Health.up().build();
        } else {
            return Health.down().build();
        }
    }

    @GetMapping("/health")
    public String getHealthStatus() {
        Health health = health();
        return health.getStatus().getCode(); // 返回健康状态码
    }

    private boolean checkHealth() {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(dataSourceConfig.getUrl(),
                    dataSourceConfig.getUsername(), dataSourceConfig.getPassword());
            connection.close();
            return true;
        } catch (SQLException e) {
            return false;
        }
    }
}

实现了HealthIndicator接口,该接口定义了一个health()方法,用于返回应用程序的健康状态。在实现中,它调用了checkHealth()方法进行实际的健康状态检查。

如果健康检查结果为true,即服务健康,则通过Health.up().build()方法返回一个UP状态的Health对象。

如果健康检查结果为false,即服务不健康,则通过Health.down().build()方法返回一个DOWN状态的Health对象。

另外,该类还定义了一个getHealthStatus()方法,用于处理"/actuator/health"路径的GET请求,并返回健康状态码。它内部调用了health()方法来获取健康状态,并通过health.getStatus().getCode()方法获取健康状态码并返回。

checkHealth()方法中,它通过使用DriverManagerDataSourceConfig中的数据库连接属性来尝试建立数据库连接。如果连接成功,表示数据库可用,返回true,否则表示数据库不可用,返回false

4.总结说明

上边我的示例是通过检测数据库时候能够连接成功,并且通过HTTP请求接口服务,来检测服务是否正常,其实还可以通过外部服务依赖检查、磁盘空间检查、内存利用率检查、CPU利用率检查、日志检查、健康指标检查来查看服务健康状态,只有需要在接口checkHealth()方法中添加逻辑即可。

checkHealth()方法根据实际需求编写健康状态检查的逻辑 、以检查数据库连接、外部依赖、服务可用性等 、返回true表示健康,返回false表示不健康

 

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

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

相关文章

一文说明ROS中URDF和SRDF分别是什么

文章目录 前言一、功能作用说明URDFSRDF 二、样例文件说明URDF文件例子SRDF文件例子 总结 前言 URDF全称为Unified Robot Description Format,中文可以翻译为“统一机器人描述格式”。与计算机文件中的.txt文本格式、.jpg图像格式等类似,URDF是一种基于…

浅谈TCP IP协议(二)IP地址

上一节大致了解TCP/IP协议栈是个啥东西,依旧是雾里看花的状态,有很多时候学一门新知识时,开头总是很急躁,无从下手,刚学会一点儿,却发现连点皮毛都不算,成就感太低,所以任何时候学习…

JavaScript 中的 Window.open() 用法详解

文章目录 1 方法介绍2 参数说明3 使用示例3.1 当前窗口中打开网页3.2 新窗口中打开网页3.3 在独立窗口中打开一个指定大小和位置的网页 1 方法介绍 window.open() 方法是 JavaScript 中的一个内置方法,用于在浏览器中打开一个新的窗口或标签页。 这个方法的语法是…

《五》 Git 中的标签和分支

标签 tag: Git 可以给仓库中某一次 commit 的提交打上标签。对于重大的版本经常会打上一个标签来表示它的重要性。 创建标签: git tag【tag 名称】:创建标签。 查看标签: git tag:查看标签。 推送标签到远程仓库…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月30日论文合集)

文章目录 一、检测相关(16篇)1.1 Contextual Object Detection with Multimodal Large Language Models1.2 Towards minimizing efforts for Morphing Attacks -- Deep embeddings for morphing pair selection and improved Morphing Attack Detection1.3 Mining Negative Tem…

Pytorch CIFAR10图像分类 ShuffleNet篇

Pytorch CIFAR10图像分类 ShuffleNet篇 文章目录 Pytorch CIFAR10图像分类 ShuffleNet篇4. 定义网络(ShuffleNet)Channel Shuffle网络单元 Shuffle UnitShuffleNet 网络结构summary查看网络测试和定义网络 5. 定义损失函数和优化器6. 训练及可视化&#…

「教程」微信小程序获取经纬度查询天气预警信息

使用天气预警API 可以帮助人们及时获取和了解天气预警信息,以便采取相应的措施来保护自身和财产。天气预警通常是由气象部门或相关机构发布的,用于提醒公众可能出现的极端天气或自然灾害,如暴雨、洪水、台风、暴风雪、雷暴、高温、低温、霜冻…

LNMT架构之LNMT与nginx动静分离

LNMT架构之LNMT与nginx动静分离 目录 一、实验前提环境配置 (一)关闭防火墙,安装本地yum (二)部署tomcat (三)部署Mariadb (四)部署nginx 二、动静分离 步骤一&a…

Django实现接口自动化平台(二)认证授权【持续更新中】

上一章: Django实现接口自动化平台(一)日志功能【持续更新中】_做测试的喵酱的博客-CSDN博客 下一章: 一、认证与授权配置 1、认证:获取权限的方式 2、授权:通过认证之后,可以获取哪些权限 …

【大数据分析】Hbase的基本原理

目录 Hbase 架构ClientZooKeeperMasterRegionServerHRegionStoreMemStoreStoreFileHFileHLog Hbase数据模型关于数据模型的其他概念Name SpaceTableRowColumnTime StampCell Hbase 架构 Client (1).META.表,记录了用户所有表拆分出来的 Regi…

ESP32设备驱动-TMP006 红外热电堆传感器驱动

TMP006 红外热电堆传感器驱动 文章目录 TMP006 红外热电堆传感器驱动1、TMP006介绍2、硬件准备3、软件准备4、驱动实现1、TMP006介绍 Texas Instruments 的 TMP006 是一系列温度传感器中的第一款,无需接触物体即可测量物体的温度。 它使用非常灵敏的热电堆来测量从物体表面发…

怎么给视频配音?视频配音软件有哪些?

视频配音在日常生活中被广泛应用,比如在电影解说、游戏解说、纪录片视频等领域,可以帮助创作者更好地表达自己的视频内容,提高视频的吸引力和感染力。很多小伙伴也想学习怎么给视频配音,但不清楚视频配音教程哪个好?没…

解密服务性能利器:Pyroscope让你的应用飞起来

开发人员通常需要查看生产应用程序中的性能瓶颈以确定问题的原因。为此,您通常需要可以通过日志和代码工具收集的信息。不幸的是,这种方法通常耗时,并且不能提供有关潜在问题的足够详细信息。 一种现代且更先进的方法是应用和使用分析技术和工…

Camunda如何利于性能指标优化流程性能

Camunda 提供了一系列性能指标,以帮助用户评估和优化其业务流程的性能。以下是 Camunda 提供的一些常见性能指标: 1、流程执行时间(Process Execution Time):指从流程实例启动到完成的时间。 2、流程实例数&#xff…

共同成长 合力致远,就在2023亚马逊云科技合作伙伴峰会

在云计算蓬勃发展的今天,在推动业务发展、实现共赢的过程中,价值成就,是亚马逊云科技对合作伙伴自始至终的承诺。为助力合作伙伴成就价值,共建成长路径,2023亚马逊云科技合作伙伴峰会将于6月27日在上海世博中心重磅启幕…

好选客浅谈鞋靴行业找外贸客户~

鞋靴概述 鞋靴制品是指使用各种材料(如:皮革、布料、橡胶、塑料等)制作的款式、类型、功能各异的鞋子和靴子,包括日常通勤的休闲鞋、提供舒适的缓震和支撑的运动鞋与适用于正式场合的皮鞋和高跟鞋等,在保护脚部、提供…

Ubuntu18.04安装Autoware.ai 1.14 GPU版

硬件: CPU:i7-9700 显卡:GTX 1050 Ti 1-安装ROS 2-安装显卡驱动 1-删除旧版显卡驱动 sudo apt-get remove --purge nvidia*2-查看可供安装的驱动 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt-get update sudo apt-get …

期货黄金交易平台哪个最可靠?如何选择?

在期货黄金交易中,期货黄金交易平台是否可靠?如何才能快速筛选出可靠的黄金交易平台?对投资者来说都是很重要的。 期货黄金交易平台要保障用户资金安全 资金的安全性方面要求平台受到严格监管,最好是受多国监管的,这样…

低代码平台产品排行榜揭晓:这些产品值得你选择和使用

低代码平台改变了软件开发的方式。它不需要开发团队从头开始创建应用程序,而是允许用户在几乎没有编码知识的情况下构建自定义应用程序。这些平台为需要定制软件解决方案但没有预算或时间聘请开发团队的企业提供了一种简单且经济高效的解决方案。而在本文中&#xf…

抖音搜索/抖音下拉词/抖音seo/抖音关键词排名系统开发

为了优化抖音平台上的内容,开发抖音关键词排名系统成为了必要的措施。该系统可以针对搜索结果和下拉词进行分析,为用户提供更准确的搜索结果。为实现这一目标,开发团队进行了大量的市场调查和用户研究。 在开发过程中,团队利用了…