1.Eureka
1.1 什么是Eureka
- Netflix在设计Eureka时,遵循的就是AP原则
- Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper;
1.2原理
Eureka的基本框架
- SpringCloud封装了NetFlix公司开发的Eureka模块来实现服务注册和发现(对比Zookeeper)
- Eureka采用了C-S的架构设计,EurekaServer作为服务注册功能的服务器,他是服务注册中心
- 而系统中的其他微服务。使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行,SpringCloud的一些其他模块(比如Zuul)就可以通过EurekaServer来发现系统中的其他微服务,并执行相关的逻辑;
- Eureka包含两个组件: Eureka Server和Eureka Client。
- Eureka Server提供服务注册服务,各个节点启动后,会在EurekaServer中进行注册,这样Eureka Server中的服务注册表中将会村粗所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
- Eureka Client是一个lava客户端,用于简化EurekaServer的交互,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器。在应用启动后,将会向EurekaServer发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除掉(默认周期为90秒)。
Eureka的三角色
- Eureka Server:提供服务的注册于发现。
- Service Provider:将自身服务注册到Eureka中,从而使消费方能够找到。
- Service Consumer:服务消费方从Eureka中获取注册服务列表,从而找到消费服务。
2.创建Eureka模块
2.1 创建一个module子模块springcloud-eureka-7001
2.2 编写application.yml配置文件
server:
port: 7001
#Eureka配置
eureka:
instance:
hostname: localhost #Eureka服务端的实例名称
client:
register-with-eureka: false #表示是否向eureka注册中心注册自己
fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
service-url:
defautZone: http://${eureka.instance.hostname}:${server.port}/eureka
2.3编写启动类
@SpringBootApplication
@EnableEurekaServer //服务端的启动类,可以接受别人注册进来
public class EurekaServer_7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer_7001.class,args);
}
}
测试访问7001端口之后得到如下页面
3.服务注册、信息配置及自我保护
3.1先在服务提供者8001里导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
3.2 在8001的application中添加下面的yml配置
##Eureka的配置,服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
3.3 在8001启动类中添加一个注解@EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient//在服务启动后自动注册到Eureka中。
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class,args);
}
}
之后重新启动我们的项目,先启动7001,再启动8001,此时输入localhost:7001可以得到下面的图。
3.4自我保护机制
一句话总结:某时刻某一个微服务不可以用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存!
- 默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka之间无法正常通行,以上行为可能变得非常危险了–因为微服务本身其实是健康的,此时本不应该注销这个服务。Eureka通过自我保护机制来解决这个问题–当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该EurekaServer节点会自动退出自我保护模式。
- 在自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该EurekaServer节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话:好死不如赖活着。
- 综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮和稳定。
- 在SpringCloud中,可以使用eureka.server.enable-self-preservation = false禁用自我保护模式【不推荐关闭白我保护机制】。
2.集群环境配置
2.1 在之前的基础上,在写两个注册中心,7002,7003.
2.2将注册中心里的配置复制粘贴到7002、7003,修改端口;然后添加主启动类,也可以复制!
为了在自己电脑上模拟,我们可以添加域名映射:C\System32\drivers\etc\host里面修改域名映射如下:
2.3将每个注册中心的配置文件里的hostname修改为我们映射的文件!再关联另外两个端口!其余两个类似!
配置成功后,三个之间的关系如下
此时,假如7001突然崩溃,7001会告诉请求去其他的端口访问!
2.4将8001里的Eureka配置修改,使其注册到三个注册中心
启动测试,先启动三个注册中心,再启动提供者8001.
假设此时访问7003,会出现下图所示。同样的访问其他的两个注册中心也会出现类似的!
同时三个集群里面都会包含我们的提供者8001
这样一来,某一个注册中心突然失效或者崩溃我们都可以通过关联域名去访问!