前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Eureka集群(Eureka详解)

Eureka集群(Eureka详解)

作者头像
全栈程序员站长
发布2022-08-23 12:23:42
1.5K0
发布2022-08-23 12:23:42
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

前言

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

一、使用IDEA

在这里插入图片描述
在这里插入图片描述

选择新建+

在这里插入图片描述
在这里插入图片描述

二、配置

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

在这里插入图片描述
在这里插入图片描述

三、端口号

代码语言:javascript
复制
-Dserver.port=10087

-D是修改,必须写

在这里插入图片描述
在这里插入图片描述

四、启动项目

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

在这里插入图片描述
在这里插入图片描述

因为我们yaml配置

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

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

代码语言:javascript
复制
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。

在这里插入图片描述
在这里插入图片描述

服务续约

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

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

代码语言:javascript
复制
eureka:
  instance:
    lease-expiration-duration-in-seconds: 90
    lease-renewal-interval-in-seconds: 30
续约
续约
  • lease-renewal-interval-in-seconds:服务续约(renew)的间隔,默认为30秒
  • lease-expiration-duration-in-seconds:服务失效时间,默认值90秒

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

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

代码语言:javascript
复制
eureka:
  instance:
    lease-expiration-duration-in-seconds: 2 # 2秒即过期
    lease-renewal-interval-in-seconds: 1 # 1秒一次心跳

实例id

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

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

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

  • UP(1):代表现在是启动了1个示例,没有集群
  • DESKTOP-2MVEC12:user-service:8081:是示例的名称(instance-id), 默认格式是:{hostname} + {spring.application.name} +

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

代码语言:javascript
复制
eureka:
  instance:
    instance-id: ${ 
   spring.application.name}:${ 
   server.port}

重启服务再试试看:

在这里插入图片描述
在这里插入图片描述

6.4.4.服务消费者

获取服务列表

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

代码语言:javascript
复制
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会统计最近15分钟心跳失败的服务实例的比例是否超过了85%。在生产环境下,因为网络延迟等原因,心跳失败实例的比例很有可能超标,但是此时就把服务剔除列表并不妥当,因为服务可能没有宕机。Eureka就会把当前实例的注册信息保护起来,不予剔除。生产环境下这很有效,保证了大多数服务依然可用。

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

在eureka的yml文件中配置

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

原理图

在这里插入图片描述
在这里插入图片描述

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137970.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月5,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、使用IDEA
  • 二、配置
  • 三、端口号
  • 四、启动项目
  • 五、客户端注册服务到集群
    • 5.1 服务提供者
      • 6.4.4.服务消费者
        • 6.4.5.失效剔除和自我保护
        相关产品与服务
        微服务引擎 TSE
        微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档