1. 程式人生 > >改變eureka server中註冊的服務的健康檢測方式

改變eureka server中註冊的服務的健康檢測方式

預設情況下注冊到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 server註冊服務健康檢測方式

預設情況下注冊到eureka server的服務是通過心跳來告知自己是UP還是DOWN,並不是通過spring-boot-actuator模組的/health端點來實現的,這樣其實不是很合理。 預設的心跳實現方式可以有效的檢查eureka客戶端程序是否正常運作,但是無法保證

Eureka Server prometheus監控服務健康狀態

背景   服務程序監控一般都有相關元件處理了,早期業務出現特定服務使用的DB資源超過額配量,導致健康檢測失敗,服務陸續從Eurek

服務註冊Eureka Server

父工程匯入依賴(版本控制) <dependency> <groupId>org.springframework.cloud</groupId> <artifactId

springboot關閉eureka server註冊服務列表自我保護配置

配置叢集服務可以向eureka通知應用是否可以使用a、在eureka server的application.properties中加入:# 設為false,關閉自我保護eureka.server.enable-self-preservation=false # 清理間隔(單位毫秒,預設是60*1000) eu

Spring Coud 2.0 Client 使用 https 註冊eureka server (一)

使用Spring Cloud 元件搭建微服務時,預設情況下,eureka server 與 eureka client 之間的註冊與通訊都是 通過 http 方式,為了使交換更加安全,需要調整為Https,在這前大家需要自己百度一下HTTPS工作原理,這裡就不介紹了。

springcloud 向Eureka註冊服務異常 com.sun.jersey.api.client.ClientHandlerException:java.net.ConnectException: Connection refused: connect

默認 handle cte localhost 文件 con refused exce idt 異常如下: 通過debug發現,服務端的url地址仍然是默認的http://localhost:8761/eureka/apps/,也就是說yml文件中配置沒有生效,檢查後發

Eureka Server啟用 https服務指北

文章共 591字,閱讀大約需要 2分鐘 ! 概 述 在我的前文《Eureka Server 開啟Spring Security Basic認證》中已經給 Eureka Server 開啟了最基本的鑑權措施,本文則讓 HTTPS加持於 Eureka Server,讓安全措施來的更徹底一點。 注: 本文

SpringCloud元件之(Eureka)的註冊服務與發現服務的實踐

吐槽:不得不說,學完了Springboot,,發現沒學到啥玩應,,將白了就是正常的單體應用多了一個容器,預設給你整合好了tomcat的容器,利用maven的打包方式,管你是幾個model的工程,還是單獨的model的工程,(ps:吐槽下IDEA和Eclipse的設計思想,

SQL Server幾種遍歷方式比較

不同 .com font size 常用 分享 分享圖片 遊標 inf SQL遍歷解析   在SQL的存儲過程,函數中,經常需要使用遍歷(遍歷table),其中遊標、臨時表等遍歷方法很常用。面對小數據量,這幾種遍歷方法均可行,但是面臨大數據量時,就需要擇優選擇,不同的遍歷方

SQL Server資料庫檔案的存放方式,檔案和檔案組

http://www.cnblogs.com/CareySon/archive/2011/12/26/2301597.html 寫在前面:上次我關於索引的文章有幾個園友發站內信問我如何將索引和表儲存在不同的硬碟上。我覺的需要專門寫一篇文章來講述一下檔案和檔案組應該更

SpringCloudFeign服務呼叫請求方式及引數總結

前言 最近做微服務架構的專案,在用feign來進行服務間的呼叫。在互調的過程中,難免出現問題,根據錯誤總結了一下,主要是請求方式的錯誤和接引數的錯誤造成的。在此進行一下總結記錄。以下通過分為三種情況說明,無引數,單引數,多引數。每種情況再分get和post兩種請求方式進行說明。這樣的話,6種情況涵蓋了feig

Spring Cloud Eureka 2 (Eureka Server搭建服務註冊中心)

class XML bsp gist client intellij 嘗試 ati register 工具:IntelliJ IDEA 2017.1.2 x64、maven3.3.9 打開IDE file===>new===>project next

2.spring cloud服務註冊中心eureka server---新增Hystrix Dashboard(第四章)

Hystrix Dashboard 我們在熔斷示例專案spring-cloud-consumer-hystrix的基礎上更改,重新命名為:spring-cloud-consumer-hystrix-dashboard。 1、新增依賴 org.springframework.boot 版本 :

1.spring cloud服務註冊中心eureka server---新增Security使用者認證(第四章)

為服務註冊中心eureka server—新增Security使用者認證 在spring-cloud-eureka服務註冊中心專案的基礎上增加使用者認證。 1、新增依賴 <dependency> <groupId>org.springframew

idea建立EurekaServer註冊中心和eureka client和Eureka Server加上安全的使用者認證

new -project 選擇spring initializr 建立自己的包名,類名。 這一步與建立springboot有區別,畫重點了,注意下面的兩個紅框框 專案名 在Application類上添加註解@EnableEurekaServer宣告註冊中心

將微服務註冊Eureka Server

一、微服務程式編寫 1、在已寫好的微服務程式中新增pom依賴: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sta

Spring Cloud-02服務發現與服務註冊Eureka + Eureka Server的搭建

文章目錄 服務發現元件概述 Eureka概述 Eureka原理 Maven父子工程的搭建 Eureka Server的搭建 新建 Maven Module 新增spring-cloud-starter-eureka-s

Spring Cloud-03將微服務註冊Eureka Server上 + 為Eureka Server新增使用者認證

文章目錄 概述 將使用者微服務micorservice-provider-user註冊到Eureka Server上 pom中增加 spring-cloud-starter-netflix-eureka-client 依賴 啟動類新增@

將微服務註冊Eureka Server

   註冊到單節點Eureka Server    將編寫如何將微服務註冊到Eureka Server上    先建立一個子模組專案,用來放api介面,然後再建立一個子模組,充當提供者。        在提供者專案的pom檔案中新增依賴     <depen

Spring Cloud (一) 快速建立Eureka Server服務註冊中心

開發環境 jdk1.8 idea 2018 用Eclipse 或者MyEclipse的,建立一個maven工程,然後將下面的pom檔案複製過去就好了。(強烈推薦Idea ,真的很強大) 用Idea 的往下看: 第一步,file –>