首页 分享 eureka.client.healthcheck.enabled=true改变eureka server中注册的服务的健康检测方式

eureka.client.healthcheck.enabled=true改变eureka server中注册的服务的健康检测方式

来源:花匠小妙招 时间:2024-12-26 23:15

默认情况下注册到eureka server的服务是通过心跳来告知自己是UP还是DOWN,并不是通过spring-boot-actuator模块的/health端点来实现的,这样其实不是很合理。

默认的心跳实现方式可以有效的检查eureka客户端进程是否正常运作,但是无法保证客户端应用能够正常提供服务。由于大多数微服务应用都会有一些其他的外部资源依赖,比如数据库,REDIS缓存等,如果我们的应用与这些外部资源无法连通的时候,实际上已经不能提供正常的对外服务了,但因为客户端心跳依然在运行,所以它还是会被服务消费者调用,而这样的调用实际上并不能获得预期的后果。

我们可以通过在eureka客户端中配置:eureka.client.healthcheck.enabled=true,就可以改变eureka server对客户端健康检测的方式,改用actuator的/health端点来检测。

我们在前面的ribbon consumer样例工程中添加一个自定义的HealthIndicator:

package com.example.eurekaclientconsumerribbon.health;

import org.springframework.boot.actuate.health.Health;

import org.springframework.boot.actuate.health.HealthIndicator;

import org.springframework.stereotype.Component;

@Component

public class MyHealthChecker implements HealthIndicator {

private boolean up = true;

@Override

public Health health() {

if (up) {

return new Health.Builder().withDetail("aaa_cnt", 10)

.withDetail("bbb_status", "up").up().build();

} else {

return new Health.Builder().withDetail("error", "client is down").down().build();

}

}

public boolean isUp() {

return up;

}

public void setUp(boolean up) {

this.up = up;

}

}

里面有一个成员变量up,用来控制是否监控,下面我们会在请求中改变这个变量的值来模拟健康状态UP->DOWN

package com.example.eurekaclientconsumerribbon.controller;

import com.example.eurekaclientconsumerribbon.health.MyHealthChecker;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class UpController {

@Autowired

MyHealthChecker myHealthChecker;

@RequestMapping("/up")

public String up(@RequestParam("up") Boolean up) {

myHealthChecker.setUp(up);

return up.toString();

}

}


application.yml:

spring:

application:

name: eureka-client-consumer-ribbon

management:

security:

enabled: false

---

spring:

profiles: peer1

server:

port: 8200

eureka:

client:

serviceUrl:

defaultZone: http://peer1:8001/eureka/,http://peer2:8002/eureka/

healthcheck:

enabled: true #使用health端点来代替心跳表明服务是否可用,反应到eureka server ui上服务的UP还是DOWN

instance:

hostname: peer1

# instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

---

spring:

profiles: peer2

server:

port: 8201

eureka:

client:

serviceUrl:

defaultZone: http://peer1:8001/eureka/,http://peer2:8002/eureka/

instance:

hostname: peer2

# instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}


主要看配置里面设置了eureka.client.healthcheck.enabled=true,这个配置属性在IDEA里面不会自动提示,我一度怀疑写错了,试过确实有效的改变了检测方式。

启动类:

package com.example.eurekaclientconsumerribbon;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;

import org.springframework.context.annotation.Bean;

import org.springframework.web.client.RestTemplate;

@SpringBootApplication

@EnableEurekaClient

@EnableCircuitBreaker

@EnableHystrixDashboard

public class EurekaClientConsumerRibbonApplication {

@LoadBalanced

@Bean

RestTemplate restTemplate() {

return new RestTemplate();

}

public static void main(String[] args) {

SpringApplication.run(EurekaClientConsumerRibbonApplication.class, args);

}

}


pom:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>

<artifactId>eureka-client-consumer-ribbon</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>jar</packaging>

<name>eureka-client-consumer-ribbon</name>

<description>Demo project for Spring Boot</description>

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>1.5.6.RELEASE</version>

<relativePath/>

</parent>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

<spring-cloud.version>Dalston.SR3</spring-cloud.version>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka</artifactId>

</dependency>

<dependency>

<groupId>org.jolokia</groupId>

<artifactId>jolokia-core</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-ribbon</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-hystrix</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

</dependencies>

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-dependencies</artifactId>

<version>${spring-cloud.version}</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<executions>

<execution>

<goals>

<goal>build-info</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</build>

</project>

启动该服务将会注册到eureka server中去,此时显示的应该是UP

然后我们调用一下服务:http://localhost:8200/up?up=false,将此时查看http://localhost:8200/health,整个应用的health状态变成DOWN了:

注册中心的服务状态也将变为DOWN:

我们可以试一下把application.yml中eureka.client.healthcheck.enabled=true这段配置去掉重新启动服务,然后调用服务将health变为DOWN,但是注册中心中仍然会显示该服务的status为UP!

相关知识

spring boot 2.0.3+eureka高可用配置 及unavailable
数据库连接复用 MultipleActiveResultSets=true
【项目实战】登录与注册业务的实现(前端+后端+数据库)
ASP.NET 链接sql数据库的 「登录/注册」界面
全文搜索 (SQL Server)
植物病虫害检测服务
用户登录、注册最基本的流程图
K8s系列 Prometheus+Grafana构建智能化监控系统
EF 3.0 要开启 数据库连接复用 MultipleActiveResultSets=true
JavaWeb实现简单的用户注册登录(入门级)

网址: eureka.client.healthcheck.enabled=true改变eureka server中注册的服务的健康检测方式 https://www.huajiangbk.com/newsview1314143.html

所属分类:花卉
上一篇: 图:马英九赴台北马偕医院进行健康
下一篇: SpringCloud健康检查4

推荐分享