Eureka简介
什么是Eureka?
Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含Server和Client两部分。Spring Cloud将它集成在子项目Spring Cloud Netflix中,从而实现服务的注册与发现
(注:Eureka的GitHub: https://github.com/Netflix/Eureka Netflix是一家在线影片租借提供商。)
Eureka的作用
Eureka包含两个组件:Eureka Server和Eureka Client,他们的作用如下:
Eureka Server提供服务发现的能力,各个微服务启动时,他们会向Eureka Server
注册自己的信息(例如IP、端口、微服务名称等),Eureka Server会存储这些信息。
Eureka Client是一个Java客户端,用于简化Eureka Server的交互。
微服务启动后,会周期性(默认30秒)地向Eureka Server发送心跳
以续约自己的“租期”。
如果Eureka Server在一定时间内没有接收到某个微服务示例的心跳,Eureka
Server将会注销该实例(默认90秒)。
默认情况下,Eureka Server同时也是Eureka Client。多个Eureka Server实例,
互相之间通过复制的方式,来实现服务注册表内的数据的同步。
Eureka Client会缓存服务注册表内的信息。这种方式有一定的优势————首先,微服务
每次请求都查询Eureka Server,从而降低了Eureka Server的压力;其次,即使Eureka
Server所有节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者并完成调用。
综上,Eureka通过心跳检查、客户端缓存等机制,提高了系统的灵活性、可伸缩性和可用性。
Eureka Server的高可用
Eureka Server并不适合线上生产环境。Eureka Server会定时连接Eureka Server,获取服务注册表
中的信息并缓存在本地。微服务在消费远程API时总是使用本地缓存的数据。因此,一般来说,即使
Eureka Server发生宕机,也不影响到服务之间的调用。但如果Eureka Server宕机时,某些微服务也
出现了不可用的情况,Eureka Client中缓存若不被更新,就可能会影响到微服务的调用,甚至影响到
整个应用的高可用性。因此,在生产环境中,通常会部署一个高可用的Eureka Server集群。
Eureka Server实例会彼此增量地同步信息,从而保存所有节点数据一致。
构建Eureka Server集群
1.复制项目eureka,蒋ArtifactId修改为eureka-x。
2.配置系统的hosts改为127.0.0.1 peer1 peer2
3.修改application.yml如下:让两个节点的Eureka Server相互注册。
spring:
application:
name: eureka-ha
---
spring:
cloud:
inetutils:
ignored-interfaces: #对于服务发现注册,忽略某些命名的网络接口是非常有用的,比如使用Docker容器的时候。可以通过一些规则设置来忽略这些网络接口 https://springcloud.cc/spring-cloud-dalston.html
- docker0 #忽略“docker0”的入口
- veth.* #忽略所有的入口以“veth.*”
profiles: peer1
server:
port: 8761 #指定该Eureka实例的端口
eureka:
server:
enableSelfPreservation: false #关闭自我保护
eviction-interval-timer-in-ms: 10000 #剔除已关停服务间隔(单位毫秒,默认是60*1000)
instance:
lease-expiration-duration-in-seconds: 30 #1
lease-renewal-interval-in-seconds: 10 #2
prefer-ip-address: true #3
#ip-address: 192.168.0.xxx //4
#指定当profiles=peer1,主机名是peer1
hostname: peer1
client:
register-with-eureka: false
fetch-registry: false
service-url:
#将自己注册到peer2这个Eureka上面去
defaultZone: http://peer2:8762/eureka/
---
spring:
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
service-url: http://peer1:8761/eureka/
将application.yml文件分为三段。第二段和第三段分别为spring.properties
指定一个值,该值表示他所在的那段内容应在哪个Profile里。第一段由于并未指定
spring.profiles,因此这段内容会对所有Profile生效。