一、Eureka简介
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
1.Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询负载算法的负载均衡器。
2.在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
3.Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
二、Eureka一些特性及配置过程时需要注意的问题
1.Eureka能够保证AP,即当Eureka中的某个节点挂掉后,剩余的节点继续仍然可以提供服务的发现与注册服务。而Eureka的客户端在向某个Eureka或者发现了当前的Eureka不可用时,会自动切换到其他的节点,也就是说Eureka的节点是平等的,只要有一台Eureka服务器在,就能保证服务的可以继续被使用。
2.Eureka的自我保护机制,我们在注册服务时,如发生断网的情况,Eureka不能接收到当前服务的任何心跳请求,Eureka会在默认的90s后,将该服务进行强制剔除,这样就能保证到网络故障时,虽然失去了部分节点,但不会像zookeeper那样会使整个注册服务瘫痪。当网络稳定时,新的实例会同步到其他节点中。
3.相关配置问题
服务端的配置如下,不注册自身:
security:
basic:
enabled: true
user:
name: user
password: password123
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://user:password123@localhost:8761/eureka
如果我们需要使用ip地址来配置的话,先添加一行:
eureka.instance.prefer.IpAddress=true;
如果我们想要关闭保护机制,则设置以下代码:
eureka.server.enable-self-preservation:=false
设置eureka剔除服务的时间间隔:
eureka.server.eviction-interval-timer-in-ms:=3000
需要注意的是要在应用类的头上添加@EnableEurekaServer来启用Eureka服务器。
接下来:访问Eureka,Url为:http://localhost:8761/
可以发现eureka注册中心就启动了!!!
在这里解释一下register-with-eureka=fasle和fetch-registry的用法,如果不指定该属性,服务端会将自身作为一个服务注册到注册中心去,因此我们需要在服务端启动前,指定这两个属性值为false。
假如我们把以下代码给注释掉,指定一个应用名,重新启动eureka-server端:
security:
basic:
enabled: true
user:
name: user
password: password123
server:
port: 8888
eureka:
instance:
hostname: 192.168.43.246
prefer-ip-address: true
instance-id: ${eureka.instance.hostname}:${server.port}
client:
# register-with-eureka: false
# fetch-registry: false
service-url:
defaultZone: http://user:password123@${eureka.instance.hostname}:${server.port}/eureka
spring:
application:
name: eureka-server
注:
如果使用ip地址来注册时,一定要添加以下两行代码:
第一种方式: ,使用参数占位符来引用已经配置好的信息:
eureka.instance.prefer-ip-adderss:true
eureka.instance.instance-id:${eureka.instance.hostname}:${server.port}
第二种方式: 使用springcloud来自动获取ip地址:
eureka.instance.hostname=${spring.cloud.client.ip-address} eureka.instance.instance-id=${eureka.instance.hostname}:${server.port}
eureka客户端的配置添加上这两行代码,可以发现,添加以上两行代码的服务是以ip地址形式来注册的,没有添加的则以默认的方式来进行注册,即使用的主机名的方式来注册:
附上使用ip地址注册服务的完整配置:
eureka服务端:
security:
basic:
enabled: true
user:
name: user
password: password123
server:
port: 8888
eureka:
instance:
hostname: 192.168.43.246
# 使用ip地址的方式进行注册
# prefer-ip-address: true
# instance-id: ${eureka.instance.hostname}:${server.port}
client:
# 不注册自身
# register-with-eureka: false
# fetch-registry: false
service-url:
defaultZone: http://user:password123@${eureka.instance.hostname}:${server.port}/eureka
spring:
application:
name: eureka-server
eureka客户端:
security:
basic:
enabled: true
user:
name: user
password: password123
server:
port: 9999
spring:
application:
name: eurekaClient
eureka:
instance:
hostname: 192.168.43.246
prefer-ip-address: true
instance-id: ${eureka.instance.hostname}:${server.port}
client:
service-url:
defaultZone: http://user:password123@${eureka.instance.hostname}:8888/eureka
此处的server-url的端口号要为服务端的端口号。
附:使用指定的ip去注册
客户端配置如下,如果你在pom文件中添加了如下依赖,客户端可以不用在启动类上面添加@EnableEurekaClient注解。只需要在applicantion.properties文件中添加配置即可:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>