改变eureka server中注册的服务的健康检测方式
2017-09-15 15:36
435 查看
默认情况下注册到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/> <!-- lookup parent from repository -->
</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!
默认的心跳实现方式可以有效的检查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/> <!-- lookup parent from repository -->
</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-actuator实现 eureka server健康检测方式
- (2-2)SpringCloud-服务注册到Eureka Server集群并消费
- 微服务实战——Spring Cloud 第四篇 将服务注册到Eureka Server上
- [bigdata-105] spring-cloud-02 服务注册 eureka server 双机高可用
- SpringCloud(第 004 篇)用户服务类(添加服务注册,将用户微服务注册到 EurekaServer 中)
- [Spring Cloud-01] eureka server 服务注册与发现
- SpringCloud(第 004 篇)用户服务类(添加服务注册,将用户微服务注册到 EurekaServer 中)
- spring cloud-将spring boot服务注册到Eureka Server上
- SpringCloud 将服务注册到Eureka Server上
- Spring Cloud (19) | Eureka Server 高可用服务注册中心
- ArcGIS for Server Linux版服务发布(不同数据源、文件夹注册方式)
- 微服务专题:服务注册与发现之三Consul健康检测
- 【SpringCloud】(五):服务注册到Eureka Server
- 微服务实战——Spring Cloud 第二篇 将服务注册到Eureka Server上
- spring cloud将spring boot服务注册到Eureka Server上的方法
- 微服务之注册服务至EurekaServer
- SpringCloud(第 005 篇)电影微服务,也注册到 EurekaServer 中,通过 Http 协议访问已注册到生态圈中的用户微服务
- SpringCloud 微服务注册与发现 – 为Eureka Server添加用户认证
- SpringCloud(第 004 篇)用户服务类(添加服务注册,将用户微服务注册到 EurekaServer 中)
- 3. 服务注册与发现之server springcloud-eureka-server