Eureka自我保护机制与服务发现
Eureka的自我保护机制介绍
默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话讲解:好死不如赖活着
综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。
在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保护模式。
如果你真的想禁用,那么在我们的服务注册中心microservicecloud-eureka-7001工程的application.yml里面添加禁用模式即可。
添加禁用自我保护的内容:
server: enable-self-preservation: false
但是eureka自我保护模式希望大家在没有其他特殊业务需求的话就不要去禁用它的自我保护模式
Eure的服务发现
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
1.修改microservicecloud-provider-dept-8001工程的DeptController
我们添加一个服务发现接口名为:DiscoveryClient
在DeptController中添加内容:
import org.springframework.cloud.client.discovery.DiscoveryClient; @Autowired private DiscoveryClient client;
我们要做一个DiscoveryRest风格的服务,让大家知道这个Discovery服务发现的信息
在DeptController中再添加内容:
@RequestMapping(value = "/dept/discovery", method = RequestMethod.GET)
public Object discovery()
{
//client.getServices()的意思是获取eureka里面有多少个微服务
//那么我们如果只有一个微服务是部门,后续我们在工作中可能会有越来越多的微服务
//那么List查出来的就会有很多的微服务,然后进行遍历然后打印出来
List<String> list = client.getServices();
System.out.println("**********" + list);
//client.getInstances()的意思就是在那么多的微服务里面,你指定只找哪一个微服务
List<ServiceInstance> srvList = client.getInstances("MICROSERVICECLOUD-DEPT");
for (ServiceInstance element : srvList) {
//然后打印你指定要找的微服务的ID和主机和端口以及访问地址等信息
System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"
+ element.getUri());
}
return this.client;
}
然后添加内容成功后,我们在主启动类上添加一个注解
@EnableDiscoveryClient //服务发现
然后进入测试
1.先启动microservicecloud-eureka-7001工程
2.再启动microservicecloud-provider-dept-8001工程
3.然后在浏览器中输入:http://localhost:8001/dept/discovery 进行测试
测试的效果图:
然后在控制台也可以看到我们注册的微服务信息
4.我们使用consumer来访问该服务
1).修改microservicecloud-consumer-dept-80工程下的DeptController_Consumer类
添加内容:
//测试@EnableDiscoveryClient,消费端可以调用服务发现
@RequestMapping(value="/consumer/dept/discovery")
public Object discovery()
{
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/discovery", Object.class);
}
添加成功后,我们直接再启动microservicecloud-consumer-dept-80进行测试。
启动成功后在浏览器输入:http://localhost/consumer/dept/discovery 进行测试
测试效果图:
说明从消费者也能成功的访问到
- 点赞
- 收藏
- 关注作者
评论(0)