SpringCloud笔记(一)——Eureka

服务注册中心—初识Eureka

    • Eureka服务注册中心的组成结构
      • Eureka Server配置
      • 提供方(Provider Client)配置
      • 消费方(Consumer Client)配置
    • 消费方(Consumer)调用服务
    • 自我保护机制

Eureka作为Springboot微服务架构中的服务注册中心,主要用于服务的注册与发现,但目前已经停止版本更新,最终版本为2.x,之所以来学习Eureka的使用,是因为还有一部分企业在系统中使用Eureka,面试的时候经常会被问到Eureka的相关问题点。

Eureka服务注册中心的组成结构

Eureka服务注册中心主要有三部分构成:

  1. Eureka Server ,服务注册中心服务器,接受客户端注册以及维护注册列表信息,客户端和服务器端的通信机制采用Http协议下的Rest请求;
  2. 服务提供方(Eureka Client) ,微服务提供方,服务器启动后向注册中心登记服务(Register),并且需要每30秒发送一次心跳来向服务器续租(Renew),更新通知Eureka服务器实例仍然是活动的。如果服务器在90秒内没有看到更新,它将从其注册表中删除实例;
  3. 服务消费方(Eureka Client) ,Eureka客户端从服务器获取注册表信息并将其缓存在本地,通过获取上一个获取周期和当前获取周期之间的增量更新,可以定期(每30秒)更新此信息。由于Eureka服务器上的有效负载缓存会定期刷新以反映新信息,更改传播到所有Eureka客户机可能需要2分钟。当客户端获取服务列表信息之后,通过服务ID获取可用服务节点信息,包括服务的远程地址和端口,但不包括服务接口名;

Eureka Server配置

  1. 向Springboot启动类中添加 @EnableEurekaServer 注解;
  2. 当Server为多台组成的集群情况时,可以配置多台之间互相拉取同步服务列表信息;
  3. application.properties文件中部分配置信息如下:
#Eureka服务器的应用名,多台集群的情况下,要保持应用名一致
spring.application.name=Server应用名

#是否将自己注册到其他Eureka Server,默认为true 需要
eureka.client.register-with-eureka=true

#是否从eureka server获取注册信息, 需要
eureka.client.fetch-registry=true

#设置服务注册中心的URL,用于client和server端交流
#此节点应向其他节点发起请求
eureka.client.serviceUrl.defaultZone=http://xxx.xxx.xxx.xxx:8001/eureka/

#主机名,必填
eureka.instance.hostname=xxx.xxx.xxx.xxx

#web端口,服务是由这个端口处理rest请求的
server.port=8001

提供方(Provider Client)配置

  1. 2.0版本不再需要向Springboot启动类中添加注解;
  2. application.properties文件中添加如下信息:
#应用名,多台集群的情况下,要保持应用名一致
spring.application.name=提供方应用名

#设置服务注册中心的URL,用于注册服务
eureka.client.serviceUrl.defaultZone=http://xxx.xxx.xxx.xxx:8001/eureka/

#web端口,服务是由这个端口处理rest请求的
server.port=9001
  1. application.properties文件中还可以添加自定义元数据,如下信息:
#自定义元数据,客户端可以从节点信息中获取到这些自定义元数据信息
eureka.instance.metadata-map.xxxx=XXXXXXXX
eureka.instance.metadata-map.yyyy=YYYYYYYY

消费方(Consumer Client)配置

  1. 2.0版本不再需要向Springboot启动类中添加注解;
  2. application.properties文件中添加如下信息:
#应用名,多台集群的情况下,要保持应用名一致
spring.application.name=消费方应用名

#设置服务注册中心的URL,用于注册服务
eureka.client.serviceUrl.defaultZone=http://xxx.xxx.xxx.xxx:8001/eureka/
#将本机ip注册到EurekaServer上。默认false,表示将操作系统的hostname注册到EurekaServer
eureka.instance.prefer-ip-address=true
#多网卡情况指定允许访问的Ip
eureka.instance.ip-address= 实际能访问到的Ip

#web端口,服务是由这个端口处理rest请求的
server.port=7001

#是否将自己注册到其他Eureka Server,默认为true
eureka.client.register-with-eureka=false

#是否从eureka server获取注册信息
eureka.client.fetch-registry=false

消费方(Consumer)调用服务

Springboot启动类中添加RestTemplate的Bean实例

    @Bean
	@LoadBalanced
	RestTemplate getRestTemplate() {
		return new RestTemplate();
	}

@LoadBalanced是启用Ribbon进行客户端负载均衡,默认采用轮询策略
在Controller中如下简单调用:

    @Autowired
	RestTemplate template;
	
	@GetMapping("port")
	public String port() {
	    String uri = "http://提供方应用名/接口名";
		return rt.getForObject(uri , String.class);
	}
	

根据以上步骤即可搭建完成简单的Eureka注册中心,并实现集群间的负载均衡。

自我保护机制

Eureka在CAP理论当中是属于AP , 也就说当产生网络分区时,Eureka保证系统的可用性,但不保证系统里面数据的一致性

默认开启,服务器端容错的一种方式,即短时间心跳不到达仍不剔除服务列表里的节点
默认情况下,Eureka Server在一定时间内,没有接收到某个微服务心跳,会将某个微服务注销(90S)。但是当网络故障时,微服务与Server之间无法正常通信,上述行为就非常危险,因为微服务正常,不应该注销。

Eureka Server通过自我保护模式来解决整个问题,当Server在短时间内丢失过多客户端时,那么Server会进入自我保护模式,会保护注册表中的微服务不被注销掉。当网络故障恢复后,退出自我保护模式。

思想:宁可保留健康的和不健康的,也不盲目注销任何健康的服务。

自我保护触发条件:
客户端每分钟续约数量小于客户端总数的85%时会触发保护机制

自我保护机制的触发条件: (当每分钟心跳次数( renewsLastMin ) 小于
numberOfRenewsPerMinThreshold 时,并且开启自动保护模式开关(
eureka.server.enable-self-preservation = true ) 时,触发自我保护机制,不再自动过期租约。)
numberOfRenewsPerMinThreshold = expectedNumberOfRenewsPerMin * 续租百分比(
eureka.server.renewalPercentThreshold, 默认0.85 )
expectedNumberOfRenewsPerMin = 当前注册的应用实例数 x 2

为什么乘以 2: 默认情况下,注册的应用实例每半分钟续租一次,那么一分钟心跳两次,因此 x 2 。

服务实例数:10个,期望每分钟续约数:10 * 2=20,期望阈值:20*0.85=17,自我保护少于17时 触发。

你可能感兴趣的:(SpringCloud)