1.Eureka服务注册与发现
什么是Eureka
●Eureka:怎么读?
●Netflix 在设计Eureka时,遵循的就是AP原则
●Eureka是Netlix的一 个子模块,也是核心模块之一。Eureka是一 个基于REST的服务,用于定位服务,以实现
云端中间层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册
中心,比如Zookeeper;
原理
●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是一 个ava客户端,用于简化EurekaServer的交互, 客户端同时也具备一 个内置的,使用轮
询负载算法的负载均衡器。在应用启动后,将会向EurekaServer发送心跳(默认周期为30秒)。如果
Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个
服务节点移除掉(默认周期为90秒)
●三大角色
。Eureka Servelr:提供服务的注册于发现。
。Service Provider:将自身服务注册到Eureka中,从而使消费方能够找到。
。Service Consumer:服务消费方从Eureka中获取注册服务列表,从而找到消费服务。
自我保护机制
-句话总结:某时刻某-一个微服务不可以用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存!
●默认情况下,如果EurekaServer在一 定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该
实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka之间无法正常通行,以上行为可能变得非
常危险了-因为微服务本身其实是健康的,此时本不应该注销这个服务。Eureka通过自我保护机制来解决这
个问题--当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会
进入自我保护模式。一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中
的数据(也就是不会注销任何微服务)。当网络故障恢复后,该EurekaServer节 点会自动退出自我保护模
式。
●在自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数
重新恢复到阈值以上时,该EurekaServer节 点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误
的服务注册信息,也不盲目注销任何可能健康的服务实例。-句话:好死不如赖活着
●综上,自我保护模式是一 种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的
微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka
集群更加的健壮和稳定
●在SpringCloud中, 可以使用eureka. server. enable-self-preservation = false禁用自我保护模式
[不推荐关闭自我保护机制]
注册中心代码
application.yml:eureka注册中心的配置
server:
port: 7001
#eureka的配置
eureka:
instance:
hostname: localhsot #eureka 服务端的实例名称
client:
register-with-eureka: false #是否向eureka注册中心注册自己,false表示自己不注册到注册中心
fetch-registry: false #fetch-registry如果为false表示自己为注册中心
service-url: #监控页面地址配置,也是注册中心地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
pom.xml:配置eureka-server
<dependencies>
<!--spring-cloud-starter-eureka-server 配置 注意-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
启动类:使用@EnableEurekaServer:开启eureka的注册中心服务
@SpringBootApplication
@EnableEurekaServer //开启eureka的注册中心服务
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
需要注册的微服务配置
application.yml:eureka注册中心的配置
#eureka服务注册
eureka:
instance:
instance-id: springcloud-provider-dept-8001 #修改实例名
client:
service-url:
defaultZone: http://localhost:7001/eureka/ #注册中心的url
pom.xml:配置eureka-server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
启动类:使用@EnableEurekaServer:开启eureka的注册中心服务
@SpringBootApplication
@EnableCaching//开启缓存
@EnableEurekaClient//开启服务注册到eureka的注册中心
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
自己提供微服务清单
//获取一些配置信息,得到具体的微服务清单
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/dept/discovery")
private Object getDiscovery(){
//得到具体的微服务清单
List<String> services = discoveryClient.getServices();
System.out.println("services------->"+services.toString());
return services;
}