借鉴nacos注册中心的设计**,开发了一个健康检查组件:HealthChecker, 供兄弟们学习和工作使用,该组件在本人项目组研测环境运行良好。
1、服务及组件运行过程中,不可避免的会出现不可用故障,除了保障高可用,还需对故障进行及时告警及恢复,避免引发全局不可用。
2、该健康检查组件只需在待检查服务添加主动健康检查组件客户端依赖,即可实现该服务的健康检查及告警功能。
3、对于数据库等组件,只需简单配置,即可实现中间件故障的秒级感知,而不是等客户反馈,提高故障处理速度及客户对产品的满意度。
主动健康检查及告警组件分为三部分,分别是客户端、服务端、告警服务。
本仓库中包含了客户端、服务端全部代码,不包括告警服务,由于不用业务的告警需求不同,兄弟们可以根据自己的业务需求开发自己的告警服务,将检查结果落库,然后制定相应的告警规则和告警途径。
被动健康检查:SpringBoot微服务
主动健康检查:Mysql、redis、etcd、oss
待补充.......
服务信息存储结构:
能检查所有微服务的所有节点健康状态,也能检查MySql、redis、OSS、ETCD等依赖的健康状态
本组件容易集成到springboot项目中,对代码无侵入。
如redis配置,添加必须的注解,添加类型(如redis),添加redis连接信息字段,如下图:
添加@HealthChecker注解,实现HealthCheckProcessor接口,开启一个线程进行健康检查,如下图:
异步化
阻塞队列
将服务注册的任务放入阻塞队列,采用线程池异步来完成实例更新,从而提高并发写能力。
线程池
定时线程可复用
连接池
数据库检查连接可复用
双重检查锁
确保在应用程序中只有一个实例
观察者模式
尽量减少依赖关系,使之便于维护 ,耦合度低
注册处理,心跳处理,发送http请求等功能单独封装类
策略模式
根据任务的类型选择相应的 HealthCheckProcessor 实例进行处理,将具体的处理逻辑委托给对应的处理器
同步锁
对修改服务列表的动作加锁处理,避免并发修改的安全问题
双重检查锁
保证线程安全,减少同步开销
copyOnWrite技术
在addIPAddress方法中,会拷贝旧的实例列表,添加新实例到列表中。完成对实例状态更新后,则会用新列表直接覆盖旧实例列表。而在更新过程中,旧实例列表不受影响,依然可以在处理心跳,判断健康状态时进行读取。
health-server高可用,实现多实例部署,实现节点间数据同步