SpringCloud :基本配置和健康检测

曾光誉
2023-12-01

一、基本配置:

- 心跳配置:

配置于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;
        }
    }
}
 类似资料: