1. 程式人生 > >SpringCloud :基本配置和健康檢測

SpringCloud :基本配置和健康檢測

一、基本配置:

- 心跳配置:

配置於eureka客戶端,用於定時向伺服器傳送心跳請求,目的是告知eureka伺服器,服務還活著,要繼續維護我的服務。

#配置心跳間隔
eureka.instance.lease-renewal-interval-in-seconds=5

- 配置服務超時時間: 
配置於eureka客戶端,當服務關閉超過這個時間時,eureka伺服器會清除掉這個服務。配置這個引數的時候要關閉伺服器的自我保護模式

#配置服務超時時間(此值將設定為至少高於leaseRenewalIntervalInSeconds中指定的值。)
eureka.instance.lease-expiration-duration-in-seconds=10

- 自我保護模式:

配置於eureka伺服器

#關閉自我保護模式
eureka.server.enable-self-preservation=false

- 伺服器定時清理服務列表(毫秒):

eureka伺服器預設30秒會重新整理服務列表,將已經關閉的服務清除掉
#伺服器定時清理列表(毫秒)
eureka.server.eviction-interval-timer-in-ms=1000
  • 獲取登錄檔資訊的頻率

配置於eureka客戶端,用於設定eureka客戶端獲取eureka伺服器的登錄檔頻率

#從eureka伺服器獲取登錄檔資訊的頻率(以秒為單位)。
eureka.client.registry-fetch-interval-seconds=5

程式碼例項:

    @Autowired
    private DiscoveryClient discoveryClient;

    //抓取服務列表
    @RequestMapping("getService")
    public String getService() {
        List<String> services = discoveryClient.getServices();
        for (String service : services) {
            List<ServiceInstance> serviceInstances = discoveryClient.getInstances(service);
            for (ServiceInstance instance : serviceInstances) {
                System.out.println("instance:" + instance.getServiceId());
            }
        }
        return "success";
    }
  • 客戶端元資料:

元資料就是自定義資料給其他eureka客戶端呼叫。 
比如在服務A配置如下:

#客戶端元資料
eureka.instance.metadata-map.username=warrior

那麼,我們可以在服務B中通過如下程式碼獲取元資料:

    @Autowired
    private DiscoveryClient discoveryClient;

    //獲取police服務的元資料username
    @RequestMapping("getMata")
    public String getMata() {
        List<ServiceInstance> serviceInstances = discoveryClient.getInstances("police");
        for (ServiceInstance instance : serviceInstances) {
            String username = instance.getMetadata().get("username");
            System.out.println("instance:" + instance.getServiceId() + "---username:" + username);
        }

        return "success";
    }

二、健康檢測:

什麼是健康檢測呢?

比如,現在有服務A註冊到eureka伺服器上,假如這個時候A服務內部的資料庫連線斷了,那麼對於eureka伺服器來說, 
A服務的狀態仍然是UP(也就是正常狀態),那麼這個時候其他服務呼叫者呼叫A服務就會出問題。由此就用到了健康檢測。

如何實現健康檢測呢?

使用Spring-boot的Actuator元件可以實現服務的健康檢測。通過健康指示器和健康處理器來實現,健康指示器用於修改服務狀態,健康處理器用於將服務狀態通知回給伺服器。由於,健康指示器只是修改了服務的狀態,並沒有將服務狀態通知給伺服器,所以需要再通過健康處理器將服務狀態通知伺服器。

pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>1.5.13.RELEASE</version>
        </dependency>

HealIndication:

import com.warrior.controller.PoliceController;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.actuate.health.Status;
import org.springframework.stereotype.Component;

/**
 * @author:
 * @description: 健康指示器
 * @program: consultingPlatform
 * @create: 2018-06-14 15:38
 **/
@Component
 public class HealthIndication implements  HealthIndicator {
    @Override
    public Health health() {
        if (PoliceController.dbStatus) {  //模擬資料庫連結狀態
            return Health.status(Status.UP).build();
        } else {
            return Health.status(Status.DOWN).build();
        }
    }
}

HealHandler

import com.netflix.appinfo.HealthCheckHandler;
import com.netflix.appinfo.InstanceInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.health.Status;
import org.springframework.stereotype.Component;

/**
 * @author:  
 * @description: 健康處理器
 * @program: consultingPlatform
 * @create: 2018-06-14 16:37
 **/
@Component
public class HealthHandler implements HealthCheckHandler{

    @Autowired
    HealthIndication healthIndic;

    @Override
    public InstanceInfo.InstanceStatus getStatus(InstanceInfo.InstanceStatus instanceStatus) {
        if(healthIndic.health().getStatus().equals(Status.UP)){
            return InstanceInfo.InstanceStatus.UP;
        }else {
            return InstanceInfo.InstanceStatus.DOWN;
        }
    }
}