2

Eureka集群(Eureka详解)

 1 year ago
source link: https://blog.51cto.com/u_15939406/6004086
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

上篇文章,我们已经搭建了微服务的框架,使用了SOA(服务治理)Eureka
参考: Eureka注册中心
这篇文章教大家,如何使用IDEA搭建SpringCloud的集群,Spring拥有最简单的搭建集群方法

一、使用IDEA

Eureka集群(Eureka详解)_服务提供者

选择新建+

Eureka集群(Eureka详解)_Server_02

写上你配置的名字,01,02区分就好,以及要集群那个模块

Eureka集群(Eureka详解)_Eureka集群_03

三、端口号

-Dserver.port=10087

-D是修改,必须写

Eureka集群(Eureka详解)_Eureka详解_04

四、启动项目

至此,两个Eureka项目就搭建好了

Eureka集群(Eureka详解)_生产环境_05

因为我们yaml配置

Eureka集群(Eureka详解)_Eureka详解_06

所以Eureka并不会显示有服务注册

Eureka集群(Eureka详解)_Server_07

两个都改为true,或者删除,改掉后重启:

Eureka集群(Eureka详解)_服务提供者_08

五、客户端注册服务到集群

因为EurekaServer不止一个,因此注册服务的时候,service-url参数需要变化:

eureka:
  client:
    service-url: # EurekaServer地址,多个地址以','隔开
      defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka

5.1 服务提供者

服务提供者要向EurekaServer注册服务,并且完成服务续约等工作。

服务提供者在启动时,会检测配置属性中的:eureka.client.register-with-erueka=true参数是否正确,事实上默认就是true。如果值确实为true,则会向EurekaServer发起一个Rest请求,并携带自己的元数据信息,Eureka Server会把这些信息保存到一个双层Map结构中。第一层Map的Key就是服务名称,第二层Map的key是服务的实例id。

Eureka集群(Eureka详解)_Server_09

在注册服务完成以后,服务提供者会维持一个心跳(定时向EurekaServer发起Rest请求),告诉EurekaServer:“我还活着”。这个我们称为服务的续约(renew);

有两个重要参数可以修改服务续约的行为:

eureka:
  instance:
    lease-expiration-duration-in-seconds: 90
    lease-renewal-interval-in-seconds: 30
Eureka集群(Eureka详解)_服务提供者_10
  • lease-renewal-interval-in-seconds:服务续约(renew)的间隔,默认为30秒
  • lease-expiration-duration-in-seconds:服务失效时间,默认值90秒

也就是说,默认情况下每隔30秒服务会向注册中心发送一次心跳,证明自己还活着。如果超过90秒没有发送心跳,EurekaServer就会认为该服务宕机,会从服务列表中移除,这两个值在生产环境不要修改,默认即可。

但是在开发时,这个值有点太长了,经常我们关掉一个服务,会发现Eureka依然认为服务在活着。所以我们在开发阶段可以适当调小。

eureka:
  instance:
    lease-expiration-duration-in-seconds: 2 # 2秒即过期
    lease-renewal-interval-in-seconds: 1 # 1秒一次心跳

先来看一下服务状态信息:

在Eureka监控页面,查看服务注册信息:

在status一列中,显示以下信息:

  • UP(1):代表现在是启动了1个示例,没有集群
  • DESKTOP-2MVEC12:user-service:8081:是示例的名称(instance-id),
    • 默认格式是:${hostname} + ${spring.application.name} + ${server.port}
    • instance-id是区分同一服务的不同实例的唯一标准,因此不能重复。

我们可以通过instance-id属性来修改它的构成:

eureka:
  instance:
    instance-id: ${spring.application.name}:${server.port}

重启服务再试试看:

Eureka集群(Eureka详解)_Server_11

6.4.4.服务消费者

获取服务列表

当服务消费者启动是,会检测eureka.client.fetch-registry=true参数的值,如果为true,则会从Eureka Server服务的列表只读备份,然后缓存在本地。并且每隔30秒会重新获取并更新数据。我们可以通过下面的参数来修改:

eureka:
  client:
    registry-fetch-interval-seconds: 5

生产环境中,我们不需要修改这个值。

但是为了开发环境下,能够快速得到服务的最新状态,我们可以将其设置小一点。

6.4.5.失效剔除和自我保护

有些时候,我们的服务提供方并不一定会正常下线,可能因为内存溢出、网络故障等原因导致服务无法正常工作。Eureka Server需要将这样的服务剔除出服务列表。因此它会开启一个定时任务,每隔60秒对所有失效的服务(超过90秒未响应)进行剔除。

可以通过eureka.server.eviction-interval-timer-in-ms参数对其进行修改,单位是毫秒,生成环境不要修改。

这个会对我们开发带来极大的不便,你对服务重启,隔了60秒Eureka才反应过来。开发阶段可以适当调整,比如10S

我们关停一个服务,就会在Eureka面板看到一条警告:

Eureka集群(Eureka详解)_Server_12

这是触发了Eureka的自我保护机制。当一个服务未按时进行心跳续约时,Eureka会统计最近15分钟心跳失败的服务实例的比例是否超过了85%。在生产环境下,因为网络延迟等原因,心跳失败实例的比例很有可能超标,但是此时就把服务剔除列表并不妥当,因为服务可能没有宕机。Eureka就会把当前实例的注册信息保护起来,不予剔除。生产环境下这很有效,保证了大多数服务依然可用。

但是这给我们的开发带来了麻烦, 因此开发阶段我们都会关闭自我保护模式:

在eureka的yml文件中配置

eureka:
  server:
    enable-self-preservation: false # 关闭自我保护模式(缺省为打开)
    eviction-interval-timer-in-ms: 1000 # 扫描失效服务的间隔时间(缺省为60*1000ms)

原理图

Eureka集群(Eureka详解)_Eureka详解_13

下一篇文章 负载均衡

祝你幸福
送你一首歌: 《夢灯籠》 RADWIMPS 附一版MV  《你的名字》MV 新海诚
附图:《你的名字》

Eureka集群(Eureka详解)_生产环境_14

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK