@LoadBalanced
- 加了
@LoadBalanced
之后,restTemplate.getForObject(url, String.class);
中的 url 就不能用 ip + port 了,要用 spring.application.name
中指定的名字;
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
LoadBalancerClient
- 可以通过
LoadBalancerClient
获得 host 和 port;
@Autowired
private LoadBalancerClient eurekaClient;
private String method2(String message) {
ServiceInstance choose = eurekaClient.choose("hello-service-provider");
String hostname = choose.getHost();
int port = choose.getPort();
// ...
}
register | 服务注册
- Eureka Client 在第一次心跳的时候,向 Eureka Server 注册,启动和第一次心跳之间是有时间差的;
- 注册的时候,会提供诸多自身的元数据:主机名、端口、健康指标 URL 等;
Renew | 服务续约
- Eureka Client 通过发送心跳进行续约;
- 默认每 30s 汇报一次心跳;
- Eureka Server 在 90s 之内收到心跳,就认为 Eureka Client 是活着的,然后重进计时 90s;如果没收到,就剔除服务;
- 这些默认值不推荐修改,是 Netflix 在实践中总结的;
Cancel | 服务下线
- Eureka Client 在优雅退出的时候,会发送 cancel 命令;
- Eureka Server 在收到 canel 命令之后会删除该节点;
- 在 kill -9 的时候不会发送这个命令;
注册表
- Eureka Client 会缓存由 Server 获取的注册表信息;
- Eureka Client 会定期更新注册表信息,默认 30s;
- Eureka Client 会处理注册表的合并等内容;
Eureka 与 Zookeeper 在多节点的情况下的比较
- Eureka 是 AP 系统,Eureka Client 到 Eureka Server 集群中的不可用节点获取信息,如果集群中还有活着的节点,就可以获取到;
- Zookeeper 是 CP 系统,Zookeeper 在对一个节点的数据操作之后,会对所有的节点做广播,在广播结束之前,不论操作的是哪个数据,都不可能看到操作的数据;
Eureka 注册慢
- 服务明明启动成功了,但就是调用不成功;
- Eureka 注册慢的根本原因在于 Eureka 的 AP 特性,它不会按“随来随走” 的原则取设计系统,即不是注册了就立即可以用;
- Eureka Client 延迟注册,默认 30s,就是因为 Eureka 在设计的时候,为了保证 AP,做了很多事情;
- Eureka Server 的响应缓存,默认 30s,就这俩在极端的情况下就是 60s 了;
- Eureka Server 的缓存刷新,默认 30s,在最极端的情况下,延迟会达到 90s;
- 虽然这些数据都可以改,但是一般不建议改;
Eureka 自我保护
- 就是在 Eureka 的节点上,操作一段时间后,会出现一段红字;
- Eureka Server 会自动更新续约更新阈值;
- Eureka Server 续约更新频率低于阈值则进入保护模式,在单节点的情况下,经常会进入保护模式;
- 自我保护模式下,Eureka Server 不会剔除任何注册信息,除非明确的告知 Eureka Server 要剔除一个服务,就是服务下线的时候;哪怕服务已经不可用了,Eureka Server 也会认为服务是暂时不可用,可能过一会儿就可用了,这也是 AP 特性的一种体现;
网友评论