Eureka
1. 来源
Netflix公司开发,不是Spring公司
2.组件
EurekaServer(独立项目)用于定位服务,实现中间层服务器负载均衡和故障转移。 EurekaClient(微服务)和Server交互,简化交互,通过服务标识符获得服务
3. 关系
用来实现服务的注册与发现,C-S架构(客户端和服务端)
4. 使用小坑
2.0之前依赖的名称不一样
新版本的依赖如下:
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
注意:
这里我用的是springboot 2.0.2
spring clound 是Finchley.SR2
版本记得配套使用
5. 测试(只有核心和改动的代码)
1. 简单的Eureka注册完成
user、power、power中因为在yml中已经配置,可以注释
// @Bean
// public TomcatServletWebServerFactory tomcat(){
// TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
// tomcat.setPort(6000);
// return tomcat;
// }
Eureka服务中心配置yml(这里类名Eureka3000)
server:
port: 3000
eureka:
server:
# enable-self-preservation: false #关闭自我保护机制
# eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
instance:
hostname: localhost
client:
registerWithEureka: false #不把自己作为一个客户端注册到自己身上
fetchRegistry: false #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
启动项前加注解
@SpringBootApplication
@EnableEurekaServer
public class AppEureka3000 {
public static void main(String[] args) {
SpringApplication.run(AppEureka3000.class);
}
}
测试:访问网址localhost:3000看能否成功,我是成功了,接下去配置客户端
客户端(user、power、power1)yml
server:
port: 6000
eureka:
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka/ #eureka服务端提供的注册地址 参考服务端配置的这个路径
instance:
instance-id: power-0 #此实例注册到eureka服务端的唯一的实例ID
prefer-ip-address: true #是否显示IP地址
leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
spring:
application:
name: server-power #此实例注册到eureka服务端的name
server:
port: 6001
eureka:
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka/ #eureka服务端提供的注册地址 参考服务端配置的这个路径
instance:
instance-id: power-1 #此实例注册到eureka服务端的唯一的实例ID
prefer-ip-address: true #是否显示IP地址
leaseRenewalIntervalInSeconds: 1 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseExpirationDurationInSeconds: 3 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
spring:
application:
name: server-power #此实例注册到eureka服务端的name
server:
port: 5000
eureka:
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka #eureka服务端提供的注册地址 参考服务端配置的这个路径
instance:
instance-id: user-1 #此实例注册到eureka服务端的唯一的实例ID
prefer-ip-address: true #是否显示IP地址
leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
spring:
application:
name: client-user #此实例注册到eureka服务端的name
同时在每个user、power、power1启动项前加入注解
@EnableEurekaClient
如:
@SpringBootApplication
@EnableEurekaClient
public class AppUserClient {
public static void main(String[] args) {
SpringApplication.run(AppUserClient.class);
}
}
全部启动,先启动服务中心Eureka3000(注册中心)那个,访问网址
localhost:3000得到如下图
服务通信会有网络波动,从而引出自我保护机制
自我保护机制的工作机制是:如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:
-
Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
-
Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
-
当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。
但本次测试实现服务失效能自动移除,所以需要关闭自我保护机制。
服务端
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000),即服务端多久清理一下宕机的服务
客户端
leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒。即:客户端发送心跳后30秒后没有发送心跳就告诉服务端我凉了,可以踢我走了。最坏剔除时间 = leaseExpirationDurationInSeconds + 服务端的eviction-interval-timer-in-ms时间,因为客户端告诉服务端可以踢,但服务端每隔这么久(eviction-interval-timer-in-ms)才清理
大致意思
2. 集群服务注册
首先去C:\Windows\System32\drivers\etc修改host文件,在底部插入如下映射
127.0.0.1 eureka3000.com
127.0.0.1 eureka3001.com
127.0.0.1 eureka3002.com
我们先建立一个eureka集群eureka3000,eureka3001,eureka3002,和之前建立eureka3000一样,相当于副本,有一点点改动
serviceUrl:写除自己外的其他服务器,因为信息同步,所以可以不写
yml如下
server:
port: 3000
eureka:
server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
instance:
hostname: eureka3000.com
client:
# registerWithEureka: false #不把自己作为一个客户端注册到自己身上
# fetchRegistry: false #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
serviceUrl:
defaultZone: http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka
server:
port: 3001
eureka:
server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
instance:
hostname: eureka3001.com
client:
# registerWithEureka: false #不把自己作为一个客户端注册到自己身上
# fetchRegistry: false #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
serviceUrl:
defaultZone: http://eureka3000.com:3000/eureka,http://eureka3002.com:3002/eureka
server:
port: 3002
eureka:
server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
instance:
hostname: eureka3002.com
client:
# registerWithEureka: false #不把自己作为一个客户端注册到自己身上
# fetchRegistry: false #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
serviceUrl:
defaultZone: http://eureka3001.com:3001/eureka,http://eureka3000.com:3000/eureka
eureka客户端(userClient如下,powerServer,powerServer同理)
serviceUrl需全部注册
server:
port: 5000
eureka:
client:
serviceUrl:
defaultZone: http://eureka3000.com:3000/eureka,http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka #eureka服务端提供的注册地址 参考服务端配置的这个路径 全部注册保证有只要还有一个服务器可用就可以正常运行
instance:
instance-id: user-1 #此实例注册到eureka服务端的唯一的实例ID
prefer-ip-address: true #是否显示IP地址
leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
spring:
application:
name: client-user #此实例注册到eureka服务端的name
大致意思
补充
CAP定理三大指标
分区容错性(无法避免):由于网络波动,通信可能失败。如外地服务器和本地服务器通信失败
一致性:服务器数据一致。如用户向一台服务器a写数据,从另外一台服务器b读,如果要保证一致性,必须要等a向b同步数据完成后,才能给用户响应,不能满足可用性。
可用性 :只要收到用户请求必须给出回应。如用户向一台服务器a写数据,从另外一台服务器b读,如果要保证可用性,无论a向b同步数据同步是否完成,必须给用户响应,不能满足一致性。