Eureka分为服务端和客户端
服务端可进行分组,每个组可进行集群,服务端可不向同组注册,但这样会提高维护成本,所以一般使用向同组进行注册
客户端每30秒向服务端发送一次心跳,进行续租,如果3次心跳都失败,那么将会剔除此客户端
客户端会从服务端中获得服务列表,而当某客户端更改后提交服务器,而此次更改传播到所有客户机上可能需要2分钟
通迅机制使用的Http协议下的Rest请求
自我保护机制:客户端每分钟续约小于客户端总数的85%时触发,触发后服务端将不在自动剔除客户端
宁可保留健康的和不健康的,也不盲目注销任何健康的服务,不想轻易的失去每一个服务提供者
原因是:Http的不可靠及网络抖动
这种机制,可提高高可用性,但同时降低了一致性,一般情况下都会开启,但会提高某些BUG的修复难度
eureka注册中心:
#设置服务注册中心的URL,用于client和server端交流
eureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/
#主机名
#hostname 是用来查找主机地址的,appname表示分组的
eureka.instance.hostname=euk1.com
#服务名称
spring.application.name=EnrekaServer
eureka.instance.metadata-map.main=sam
server.port=7001
service1服务提供者:
#设置服务注册中心的URL,用于client和server端交流
eureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/
server.port=8081
spring.application.name=service1
@GetMapping("getHi")
public String getHi() {
return "Hi";
}
service2调用:
eureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/
server.port=8080
spring.application.name=service2
@Autowired
private LoadBalancerClient lb;
@GetMapping("test")
public String test() {
// ribbon 完成客户端的负载均衡,过滤掉down了的节点
ServiceInstance instances = lb.choose("client");
String url = "http://" + instances.getHost() + ":" + instances.getPort() + "/getHi";
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(url, String.class);
}