本文参考:https://www.jianshu.com/p/cb7fa0aa47a8
一、Eureka 的服务发现
EurekaClient 会从 server 端获取一份注册表信息,将其复制一份到 client 端本地,然后进行调用访问其它服务。
所以我们可以在本地获取到所有注册到 Eureka server 端的服务信息。
1、在 client 端的 主启动类加注解 @EnableDiscoveryClient
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
2、通过 Spring 的依赖注入可以获取 DiscoveryClient 对象,通过 DiscoveryClient 我们能发现其它服务
import org.springframework.cloud.client.discovery.DiscoveryClient;
...
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/consumer/discovery/info")
public Object info() {
//获取 eureka server 端的所有服务
List<String> services = discoveryClient.getServices();
for (String service : services) {
List<ServiceInstance> instances = discoveryClient.getInstances(service);
log.info("service is {}", service);
//获取所有实例的信息
for (ServiceInstance serviceInstance :instances ) {
log.info("instanceId:{}, serviceId:{}, URI:{}, PORT:{}"
, serviceInstance.getInstanceId(), serviceInstance.getServiceId(),serviceInstance.getUri(),serviceInstance.getPort());
}
}
return services;
}
最终调用可以打印出所有服务和实例信息:
二、Eureka 的自我保护机制
1、什么是 Eureka 的自我保护机制?
(1)官方定义:自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。
(2)工作机制:如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:
一、Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
二、Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
三、当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
2、Eureka 的自我保护机制的相关配置
(1)eureka.server.enable-self-preservation=false
关闭自我保护,保证不可用服务被即使剔除
(2)eureka.server.eviction-interval-timer-in-ms= 60000
eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒
server:
port: 7001
eureka:
instance:
# hostname: localhost #eureka 服务端的实例名称
hostname: eureka7001.com #eureka 服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己
fetch-registry: false #是否去注册中心fetch信息,false表示自己就是注册中心,所以自己不必找自己去检索服务
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 60000