Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目
spring-cloud-netflix
中,实现SpringCloud的服务发现功能。
各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里。
简介
Eureka包含两个组件:
Eureka Server
和Eureka Client
Eureka Server
提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息
Eureka Client
是一个java客户端,用于简化与Eureka Server的交互。客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
Eureka基本规则
服务启动时会生成服务的基本信息对象InstanceInfo,然后在启动时会register到服务治理中心。
注册完成后会从服务治理中心拉取所有的服务信息,缓存在本地。
之后服务会30s(可配置)发送一个心跳信息,续约服务。
如果服务治理中心在90s内没有收到一个服务的续约,就会认为服务已经挂了,会把服务注册信息删掉。
服务正常停止前,服务会主动发送一个停止请求,服务治理中心会删除这个服务的信息。
如果Eureka Server收到的统计心跳失败的比例在15分钟之内是否低于85%
(可配置,实际在生产环境上通常是由于网络不稳定导致)就会进入自我保护模式,
在这种模式下,Eureka Server不会删除任何服务信息。
同步:多个 Eureka Server 之间通过复制的方式完成服务注册表的同步,形成 Eureka 的高可用
识别:Eureka Client 会缓存 Eureka Server 中的信息
即使所有 Eureka Server 节点都宕掉,服务消费者仍可使用缓存中的信息找到服务提供者
续约:微服务会周期性(默认30s)地向 Eureka Server 发送心跳以Renew(续约)信息
续期:Eureka Server 会定期(默认60s)执行一次失效服务检测功能
它会检查超过一定时间(默认90s)没有Renew的微服务,发现则会注销该微服务节点
Eureka服务端开发
父工程pom.xml定义SpringCloud版本
<!--锁版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
eureka模块pom.xml引入eureka-server依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
添加application.yml
server:
port: 6868
eureka:
client:
fetch-registry: false #是否将自己注册到Eureka服务中,本身就是所以无需注册
register-with-eureka: false #是否从Eureka中获取注册信息
service-url: #Eureka客户端与Eureka服务端进行交互的地址
defaultZone: http://127.0.0.1:${server.port}/eureka/
#是否开启自我保护模式,默认为true
eureka.server.enable-self-preservation=true
#续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
eureka.server.eviction-interval-timer-in-ms=60000
编写启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
启动运行启动类,然后在浏览器地址栏输入 http://localhost:6868/
服务注册
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
每个微服务的application.yml,添加注册eureka服务的配置
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka/
instance:
prefer-ip-address: true # 设置微服务调用地址为IP优先(缺省为false)
# 再注册中心页面显示的微服务名
eureka.instance.instance-id=${spring.application.name}:${server.port}
# 心跳时间,即服务续约间隔时间(缺省为30s)
eureka.instance.lease-renewal-interval-in-seconds=30
# 发呆时间,即服务续约到期时间(缺省为90s)
eureka.instance.lease-expiration-duration-in-seconds=90
启动类添加注解
@EnableEurekaClient