状态页和健康检查的URL在Spring Cloud Eureka中默认使用了spring-boot-actuator模块提供的/info端点和/health端点。为了服务的正常运作,我们必须确保Eureka客户端的/health端点在发送元数据的时候,是一个能够被注册中心访问到的地址,否则服务注册中心不会根据应用的健康检查来更改状态而/info端点如果不正确的话,会导致Eureka面板中单击服务实例时,无法访问到服务实例提供的信息接口。
客户端服务提供者pom文件添加springboot的监测中心actuator:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>
@RestController
public class PoliceController {
@RequestMapping(value="/call/{id}",method=RequestMethod.GET,produces=MediaType.APPLICATION_JSON_VALUE)
public Police call(@PathVariable Integer id,HttpServletRequest request){
Police p=new Police();
p.setId(id);
p.setName("angus");
p.setMessage(request.getRequestURI().toString());
return p;
}
public static boolean canVisitDb=true;
@RequestMapping(value="db/{can}",method=RequestMethod.GET)
public void setDb(@PathVariable boolean can){
canVisitDb=can;
}
}
@Component
public class MyHeathIndicator implements HealthIndicator{
public Health health(){
if(PoliceController.canVisitDb){
return new Health.Builder(Status.UP).build();
}else{
return new Health.Builder(Status.DOWN).build();
}
}
}
下面这个类是同步Eureka中的状态:
@Component
public class MyHealthCheckHandler implements HealthCheckHandler{
@Autowired
private MyHeathIndicator healtIndicator;
public InstanceStatus getStatus(InstanceStatus currentStatus) {
Status status=healtIndicator.health().getStatus();
if(status.equals(Status.UP)){
return InstanceStatus.UP;
}else{
return InstanceStatus.DOWN;
}
}
}