【Spring Cloud总结】13.Eureka深入理解

接上篇《12.覆写Feign的默认配置》  Spring Cloud版本为Finchley.SR2版

通过前面几篇的博文,我们搭建了Eureka Server注册中心,然后使用Ribbon做客户端的负载均衡,又学习了声明式的HttpClient组件Feign,本篇我们来继续探讨Eureka的高级应用。
本部分官方文档:https://cloud.spring.io/spring-cloud-static/Finchley.SR2/single/spring-cloud.html#spring-cloud-eureka-server

一、Eureka的元数据

什么是元数据?度娘的描述为:元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。其实说白了,元数据就是为了描述数据的情况的一系列数据。
对于接入Eureka的服务节点,除了组件提供的标准数据(如主机名。IP地址,端口号,状态页和健康检查),有时候需要对外界暴露一些额外的元数据,使得其他服务或者注册中心的管理人员,能够更加了解该服务节点的一些数据情况,所以Eureka提供了自定义元数据的功能。

那么如何添加自定义元数据呢?在官方文档中,有如下描述:
可以将附加元数据添加到实例注册中eureka.instance.metadataMap,并且可以在远程客户端中访问此元数据。通常,除非客户端了解元数据的含义,否则其他元数据不会更改客户端的行为。

意思就是我们可以通过eureka.instance.metadataMap来自定义一些元数据。

我们在microserver-provider-user工程的application.yml添加两个元数据:

eureka:
  client:
    serviceUrl:
      defaultZone: http://user:password123@eureka1:8761/eureka
  instance:
    prefer-ip-address: true
    metadata-map:
      business: Provide user-related information
      project team: java-team

这里我们在eureka下的instance下的metadata-map参数中添加两个键值对,一个是描述服务的业务,一个是描述服务的项目组名字。

然后我们启动user项目和eureka项目,在eureka的访问路径中,访问“eureka/apps/microserver-provider-user”即可看到元数据:
【Spring Cloud总结】13.Eureka深入理解_第1张图片
即想看到那个微服务的元数据,访问eureka的“eureka/apps/”服务,并在路径的最后拼接服务的实例名。这里我们看到了之前在metadata-map参数中设置的两个元数据信息。

注意,我们配置的元数据,如果不是Eureka的原有元数据(例如Zone),则不会更改客户端的任何行为,反之可能会影响一些行为。例如上面的management.port和jmx.port如果自定义的话,就会覆盖原有的正确数据,所以要慎重。

二、如何解决Eureka注册服务慢的问题

作为实例还涉及到与注册中心的周期性心跳,默认持续时间为30秒(通过serviceUrl)。在实例、服务器、客户端都在本地缓存中具有相同的元数据之前,服务不可用于客户端发现(所以可能需要3次心跳)。你可以使用eureka.instance.leaseRenewalIntervalInSeconds 配置,这将加快客户端连接到其他服务的过程。在生产中,最好坚持使用默认值,因为在服务器内部有一些计算,他们对续约做出假设。
出自:https://cloud.spring.io/spring-cloud-static/Finchley.SR2/single/spring-cloud.html#_why_is_it_so_slow_to_register_a_service

即如果我们需要修改客户端对Eureka注册中心续约的心跳周期,需要在application.yml中的eureka下的instance下的

eureka:
  instance:
    lease-renewal-interval-in-seconds: 15

这里我们修改了续约心跳周期的时间为15秒,可以加快新服务实例的注册时间。即15秒后服务端获取新实例,而客户端刷新服务列表后就会获得新的服务。但是官方提示最好别在生产中使用,因为内部有一些复杂计算。

三、高可用模式(对等机)

Eureka服务器没有后端存储,但是注册表中的服务实例都必须发送心跳以使其注册保持最新(这可以在内存中完成)。客户机也有一个内存中的Eureka注册缓存(所以他们不需要为每一个服务去注册一次)。

默认情况下,每个Eureka服务器也是一个Eureka客户机,需要(至少一个)服务URL来定位对等机。如果您不提供它,服务将运行并工作,但它会在日志中充满关于无法向对等机注册的大量警告。通过运行多个实例并要求它们相互注册,可以使Eureka更具弹性和高可用性。实际上这是Eureka要求的默认行为,因此要使其工作所需要做的就是serviceUrl向对等方添加有效内容,如以下示例所示:
application.yml (两个对等的Eureka Server). 

---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2/eureka/

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1/eureka/

在上面的示例中,使用一个YAML文件,可以在两个主机(peer1和peer2)上运行相同的服务器,方法是使用不同的Spring配置来运行它。在测试环境可以通过修改hosts来解析主机名来测试单个主机上的对等感知(在生产中执行此操作没有太大价值)。

您可以将多个对等体添加到系统中,并且只要它们通过至少一个边缘彼此连接,它们就会在它们之间同步注册。如果对等体在物理上是分开的(在数据中心内或在多个数据中心之间),那么系统原则上可以存在“裂脑”类型的故障。您可以向系统添加多个对等体,只要它们彼此直接连接,它们就会在它们之间同步注册。三个Eureka对等节点配置:

eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1/eureka/,http://peer2/eureka/,http://peer3/eureka/

---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2

---
spring:
  profiles: peer3
eureka:
  instance:
    hostname: peer3

出自:https://cloud.spring.io/spring-cloud-static/Finchley.SR2/single/spring-cloud.html#_why_is_it_so_slow_to_register_a_service

上面是文档的原文,机翻的有些不好理解,我们下面来解读一下。

这里说的主要是,Eureka默认提供了实现高可用的注册机制,我们可以部署多台Eureka Server集群,这些Eureka可以相互注册,而相互注册的Eureka称为对等机,作为被注册方,每个Eureka也可以被看做客户端。例如我们第一章放的那张图:

所以要想实现Eureka高可用,就必须至少给Eureka提供一个对等级的URL注册进去,如果我们不编写,虽然不影响Eureka的运行,但是会在日志中一直报找不到对等机的异常。
在我们日常开发过程中,很多时候都是单机Eureka,此时我们的eureka.client.serviceUrl配置的defaultZone就是自己本身。下面就是我们之前编写的microserver-discovery-eureka工程的配置,这里defaultZone就是这个服务自己。这样可以保证运行日志中不会报找不到对等机的异常:

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://user:password123@eureka1:8761/eureka

我们下面来再创建一个高可用的测试Eureka,来试验一下Eureka的相互注册的机制。
首先修改系统的hosts文件,为127.0.0.1添加“peer1”、“peer2”和“peer3”三个域名映射:

127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3

然后我们复制原来的microserver-discovery-eureka工程,更名为microserver-discovery-eureka-high-availability:
【Spring Cloud总结】13.Eureka深入理解_第2张图片
修改一下POM,把artifactId和name修改为microserver-discovery-eureka-high-availability,这里与我们测试不再引入安全密码,所以将之前的spring-boot-starter-security依赖去除。


  4.0.0
  
    com.microserver.cloud
    microserver-spring-cloud
    0.0.1-SNAPSHOT
  
  microserver-discovery-eureka-high-availability
  microserver-discovery-eureka-high-availability
  
 
    
        org.springframework.cloud
        spring-cloud-starter-netflix-eureka-server
    
  
  

去除依赖后,删除WebSecurityConfig.java类,因为没有依赖了,注解也不存在了(会报错),所以这个配置也没用了。修改后的工程结构:
【Spring Cloud总结】13.Eureka深入理解_第3张图片

然后修改application.yml为以下配置:

spring:
  application:
    name: EUREKA-HA
---
server:
  port: 8761
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/
---
server:
  port: 8762
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/
---
server:
  port: 8763
spring:
  profiles: peer3
eureka:
  instance:
    hostname: peer3
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/

这里我们将实例名命名为EUREKA-HA,然后在配置文件中配置了三种端口的启动配置(profiles分别为peer1、peer2和peer3),以及eureka实例的配置,每个端口启动的eureka server,分别将自己注册到另外两个eureka server,那么即是其中一台挂了,另外两台依然可以继续提服务,而且各个eureka之间的服务列表是实时同步的,保证每个eureka server的服务节点高度一致。

我们下面来按照3个不同端口来启动这三个eureka server服务节点。首先,我们启动8761端口的peer1服务,我们在编译器(Spring-Tool-Suite-3.9.8)中右键单击工程,选择“Run as->Run Configurations...”进入启动配置选项:
【Spring Cloud总结】13.Eureka深入理解_第4张图片
然后选择“Spring Boot App”选项,新建一个启动项:
【Spring Cloud总结】13.Eureka深入理解_第5张图片
在启动项参数中,添加microserver-discovery-eureka-high-availability工程的启动项,然后修改NAME:
【Spring Cloud总结】13.Eureka深入理解_第6张图片
然后重点就是启动项的Profile,这里设置为peer1。
然后再创建两个启动项,其它配置一样,除了NAME和Profile分别为“peer2”、“peer3”:

【Spring Cloud总结】13.Eureka深入理解_第7张图片
【Spring Cloud总结】13.Eureka深入理解_第8张图片
我们将三个工程都启动,等待心跳30秒后,分别访问三个eureka控制台首页,结果如下:
【Spring Cloud总结】13.Eureka深入理解_第9张图片

【Spring Cloud总结】13.Eureka深入理解_第10张图片

【Spring Cloud总结】13.Eureka深入理解_第11张图片
可以看到,每个eureka都将自己注册给了另外两个eureka,使得整个eureka server集群高可用。

那么还需要测试一下eureka server的服务节点高度一致的效果,是不是三个节点都能同步各自的服务节点。我们修改之前microserver-provider-user工程的application.yml,将其eureka的服务路径指向其中一个peer1的eureka:

eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/

启动microserver-provider-user工程,回来观察三个eureka控制台首页,结果如下:
【Spring Cloud总结】13.Eureka深入理解_第12张图片

【Spring Cloud总结】13.Eureka深入理解_第13张图片

【Spring Cloud总结】13.Eureka深入理解_第14张图片
可以看到,我们只注册了peer1的eureka服务,但是整个eureka server集群都同步刷新了这个服务节点的信息,至此我们验证了eureka server集群的高可用和服务一致性。

本部分参考源码下载:https://download.csdn.net/download/u013517797/11516879

下一篇我们继续讲解Eureka的常用配置详解。

参考:《51CTO学院Spring Cloud高级视频》

转载请注明出处:https://blog.csdn.net/acmman/article/details/99074062

你可能感兴趣的:(Spring,Cloud,Spring,Cloud全面入门学习)