Eureka作为Springboot微服务架构中的服务注册中心,主要用于服务的注册与发现,但目前已经停止版本更新,最终版本为2.x,之所以来学习Eureka的使用,是因为还有一部分企业在系统中使用Eureka,面试的时候经常会被问到Eureka的相关问题点。
Eureka服务注册中心主要有三部分构成:
#Eureka服务器的应用名,多台集群的情况下,要保持应用名一致
spring.application.name=Server应用名
#是否将自己注册到其他Eureka Server,默认为true 需要
eureka.client.register-with-eureka=true
#是否从eureka server获取注册信息, 需要
eureka.client.fetch-registry=true
#设置服务注册中心的URL,用于client和server端交流
#此节点应向其他节点发起请求
eureka.client.serviceUrl.defaultZone=http://xxx.xxx.xxx.xxx:8001/eureka/
#主机名,必填
eureka.instance.hostname=xxx.xxx.xxx.xxx
#web端口,服务是由这个端口处理rest请求的
server.port=8001
#应用名,多台集群的情况下,要保持应用名一致
spring.application.name=提供方应用名
#设置服务注册中心的URL,用于注册服务
eureka.client.serviceUrl.defaultZone=http://xxx.xxx.xxx.xxx:8001/eureka/
#web端口,服务是由这个端口处理rest请求的
server.port=9001
#自定义元数据,客户端可以从节点信息中获取到这些自定义元数据信息
eureka.instance.metadata-map.xxxx=XXXXXXXX
eureka.instance.metadata-map.yyyy=YYYYYYYY
#应用名,多台集群的情况下,要保持应用名一致
spring.application.name=消费方应用名
#设置服务注册中心的URL,用于注册服务
eureka.client.serviceUrl.defaultZone=http://xxx.xxx.xxx.xxx:8001/eureka/
#将本机ip注册到EurekaServer上。默认false,表示将操作系统的hostname注册到EurekaServer
eureka.instance.prefer-ip-address=true
#多网卡情况指定允许访问的Ip
eureka.instance.ip-address= 实际能访问到的Ip
#web端口,服务是由这个端口处理rest请求的
server.port=7001
#是否将自己注册到其他Eureka Server,默认为true
eureka.client.register-with-eureka=false
#是否从eureka server获取注册信息
eureka.client.fetch-registry=false
Springboot启动类中添加RestTemplate的Bean实例
@Bean
@LoadBalanced
RestTemplate getRestTemplate() {
return new RestTemplate();
}
@LoadBalanced是启用Ribbon进行客户端负载均衡,默认采用轮询策略
在Controller中如下简单调用:
@Autowired
RestTemplate template;
@GetMapping("port")
public String port() {
String uri = "http://提供方应用名/接口名";
return rt.getForObject(uri , String.class);
}
根据以上步骤即可搭建完成简单的Eureka注册中心,并实现集群间的负载均衡。
Eureka在CAP理论当中是属于AP , 也就说当产生网络分区时,Eureka保证系统的可用性,但不保证系统里面数据的一致性
默认开启,服务器端容错的一种方式,即短时间心跳不到达仍不剔除服务列表里的节点
默认情况下,Eureka Server在一定时间内,没有接收到某个微服务心跳,会将某个微服务注销(90S)。但是当网络故障时,微服务与Server之间无法正常通信,上述行为就非常危险,因为微服务正常,不应该注销。
Eureka Server通过自我保护模式来解决整个问题,当Server在短时间内丢失过多客户端时,那么Server会进入自我保护模式,会保护注册表中的微服务不被注销掉。当网络故障恢复后,退出自我保护模式。
思想:宁可保留健康的和不健康的,也不盲目注销任何健康的服务。
自我保护触发条件:
客户端每分钟续约数量小于客户端总数的85%时会触发保护机制
自我保护机制的触发条件: (当每分钟心跳次数( renewsLastMin ) 小于
numberOfRenewsPerMinThreshold 时,并且开启自动保护模式开关(
eureka.server.enable-self-preservation = true ) 时,触发自我保护机制,不再自动过期租约。)
numberOfRenewsPerMinThreshold = expectedNumberOfRenewsPerMin * 续租百分比(
eureka.server.renewalPercentThreshold, 默认0.85 )
expectedNumberOfRenewsPerMin = 当前注册的应用实例数 x 2
为什么乘以 2: 默认情况下,注册的应用实例每半分钟续租一次,那么一分钟心跳两次,因此 x 2 。
服务实例数:10个,期望每分钟续约数:10 * 2=20,期望阈值:20*0.85=17,自我保护少于17时 触发。