学 无 止 境 ,与 君 共 勉 。
版本控制
- Spring Cloud 基于 Hoxton.RELEASE
- Spring Boot 基于 2.2.5.RELEASE
介绍
服务发现是微服务体系结构的核心内容之一。Eureka
是NetFlix
的一个子模块,用于服务的发现和注册,只需要使用服务的标识,就可以访问服务,它遵循分布式事务的AP原则。功能类似Dubbo
的注册中心,比如Zookeeper
。它分为服务端和客户端,在Spring Cloud
中使用起来也很简单。
Eureka Server
主管服务注册,是服务注册中心,存储所有可用的服务节点信息。系统中的其他服务通过Eureka
客户端注册到服务中心,并维持心跳连接,Eureka Server
通过心跳连接来判断对应的服务节点是否可用。并且可以通过服务中心来发现其他服务进行调用。
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
yml配置
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
instance:
# eureka服务端实例名称
hostname: localhost
# 发送心跳间隔,默认30,官方不建议修改
lease-renewal-interval-in-seconds: 30
# 服务过期时间配置,超过这个时间没有接收到心跳EurekaServer就会将这个实例剔除,默认90
lease-expiration-duration-in-seconds: 90
client:
# 不向注册中心注册自己(自己就是服务中心)
register-with-eureka: false
# 不需要去检索注册表信息
fetch-registry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
# 关闭自我保护模式,生产环境建议开启
enable-self-preservation: false
引入Eureka服务注解:@EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
Eureka Client
每个客户端节点启动后会主动向EurekaServce
注册自己,并维持一个心跳链接。当需要和其他服务通信时,会向EurekaServce
询问目标服务的地址进行访问。
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
yml配置
server:
port: 8760
spring:
application:
name: eureka-client
eureka:
instance:
# 实例显示信息
instance-id: ${spring.cloud.client.ipaddress}:${server.port}
# 以IP地址注册到服务中心,相互注册使用IP地址
prefer-ip-address: true
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
引入Eureka客户端注解:@EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
Eureka Server集群
实际项目中往往有大量的微服务实例,如果注册中心出现异常将导致整体系统瘫痪,所以需要对Eureka Server
进行集群来达到高可用
修改本机host文件
因为在本机进行集群,所以通过修改host文件,修改EurekaServer
配置文件多次启动的方式来实现:
127.0.0.1 eureka1
127.0.0.1 eureka2
修改yml文件
Eureka Server 新增配置文件application-server1.yml
和application-server2.yml
# application-server1.yml
server:
port: 8761
eureka:
instance:
# eureka服务实例名称
hostname: eureka1
client:
# 不向注册服务中心注册自己(自己就是服务中心)
register-with-eureka: false
# 不需要去检索注册表信息
fetch-registry: false
serviceUrl:
defaultZone: http://eureka2:8762/eureka/
# application-server2.yml
server:
port: 8762
eureka:
instance:
# eureka服务实例名称
hostname: eureka2
client:
# 不向注册服务中心注册自己(自己就是服务中心)
register-with-eureka: false
# 不需要去检索注册表信息
fetch-registry: false
serviceUrl:
defaultZone: http://eureka1:8761/eureka/
Eureka Client修改yml的defaultZone
eureka:
client:
serviceUrl:
defaultZone: http://eureka1:8761/eureka/
启动Eureka Server指定
spring.profiles.active=server1
,再次启动,指定spring.profiles.active=server2
。启动Eureka Client服务,分别访问2个服务中心,可以看到各自的副本信息,并且2个服务中心都有了EUREKA-CLIENT
的注册信息。
自我保护机制
默认情况下,如果EurekaServer
超过90
秒没有接收到某个服务实例的心跳,将会注销该实例。但是,会存在由于网路波动而导致微服务实例和EurekaServer
无法正常通信,实际上这个实例是正常运行的,不应该去注销这个实例。针对这种情况Eureka
提供了自我保护机制的方案。当EurekaServer
节点在短时间内丢失过多客户端时(15分钟内超过85%的节点都没有正常的心跳),那么EurekaServer
就会认为客户端和注册中心出现了网络问题,这个EurekaServer
节点就会进入自我保护模式。一旦进入自我保护模式,EurekaServer
就会保护服务注册表中的信息,不再删除注册表中的信息。
自我保护模式中,EurekaServer
服务依旧提供注册功能,但是不再注销任何服务实例。当它收到心跳数重新恢复到阈值以上时,该EurekaServer
服务就会退出自我保护模式。宁可保留错误的服务信息,也不会盲目注销任何可能健康的服务。
它是一种应对网络异常的保护措施,生产环境建议开启。
可以通过
eureka.server.enable-self-preservation=false
来关闭自我保护机制
Eureka对比Zookeeper
CAP原则
- Consistency: 一致性;
- Availability: 可用性;
- Partition tolerance: 分区容错性;
CAP 原则指的是,在一个人分布式系统中这三个要素最多只能同时实现两点,不可能三者兼顾,其中P分区容错性是必须要满足的。
Zookeeper
Zookeeper满足CP。在Zookeeper中master因网络故障和其他节点失联的时候,剩余节点会重新选举leader,耗时较长。选举期间整个zk集群不可用,导致注册中心瘫痪 。
Eureka
Eureka满足AP。Eureka各个节点都是平等的,只要有一个节点正常运行就可以提供注册和查询服务(保证可用性A),只不过查到的信息可能不是最新的(不保证强一致性C)。eureka会首先保证可用性,在一定程度内再去进行一致性的同步。
访问源码
所有代码均上传至Github
日常求赞
创作不易,如果各位觉得有帮助,求点赞 支持
求关注
微信公众号: 俞大仙