认识SpringCloud(一) 注册中心Eureka

news/2024/11/18 1:46:11/

  Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理。在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。

如何使用

  在springboot项目中使用Eureka十分简单,只需要以下几步就可以启动一个server了。
  pom文件中添加依赖:

      <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>

  修改yml文件

server:port: 8610spring:application:name: datax-eurekaeureka:instance:lease-renewal-interval-in-seconds: 20lease-expiration-duration-in-seconds: 60# 设置使用IPprefer-ip-address: true# 设置外网IP号ip-address: localhostclient:register-with-eureka: falsefetch-registry: falseinstance-info-replication-interval-seconds: 40service-url:defaultZone: http://${eureka.instance.ip-address}:${server.port}/eureka/

  启动类添加@EnableEurekaServer注解


@EnableEurekaServer
@SpringBootApplication
public class DemoEurekaApplication {public static void main(String[] args) {SpringApplication.run(DataxEurekaApplication.class, args);}}

  浏览器访问http://127.0.0.1:8610/可以看到一个简单的EurekaServer已经搭建成功了
在这里插入图片描述
  过了一段时间出现了提示:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
   出现这个错误的原因是因为Eureka进入自我保护模式

自我保护模式

  默认情况下,如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障(比如网络故障或频繁的启动关闭客户端),Eureka Server自动进入自我保护模式。不再剔除任何服务,当网络故障恢复后,该节点自动退出自我保护模式。

  可以使用eureka.server.enable-self-preservation=false来禁用自我保护模式,生产环境不建议这么做。

  还有一种方式是把阈值因子eureka.server.renewalPercentThreshold调低,默认是0.85,如果阈值比最小值大,则自我保护模式开启

eureka:server:enable-self-preservation: true#eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒eviction-interval-timer-in-ms: 60000#阈值更新的时间间隔,单位为毫秒,默认为15 * 60 * 1000renewal-threshold-update-interval-ms: 15 * 60 * 1000#阈值因子,默认是0.85,如果阈值比最小值大,则自我保护模式开启renewal-percent-threshold: 0.85#清理任务程序被唤醒的时间间隔,清理过期的增量信息,单位为毫秒,默认为30 * 1000delta-retention-timer-interval-in-ms: 30000

客户端健康检查

  默认情况下,Eureka使用客户端心跳来确定客户端是否已启动。在成功注册后,Eureka始终宣布应用程序处于“UP”状态,这就引发一个问题,客户端虽然是启动的,但是可能由于某种原因(比如数据库宕机)无法提供正确的服务。为了解决这个问题,需要引入健康检查机制。

  前置条件:启动一个server(本文端口为8610),下面开始创建client(端口为8611)

  Eureka的健康检查依赖于Springboot-actuator的/health,需要在pom.xml中引入​​spring-boot-starter-actuator​​模块的依赖

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
</dependencies>

   在eureka客户端中的​​application.properties​​或yml文件中配置:​​eureka.client.healthcheck.enabled=true​​,就可以改变eureka server对客户端健康检测的方式,改用actuator的/actuator/health端点来检测。

# 注册中心配置
eureka:instance:lease-renewal-interval-in-seconds: 20# 设置使用IPprefer-ip-address: true# 设置外网IP号ip-address: localhostclient:healthcheck:enabled: trueregister-with-eureka: truefetch-registry: trueinstance-info-replication-interval-seconds: 30registry-fetch-interval-seconds: 3service-url:defaultZone: http://localhost:8610/eureka# 暴露监控端点
management:endpoints:web:exposure:include: '*'endpoint:health:show-details: always

  新建HealthIndicatorImpl 并实现HealthIndicator,自定义监控的逻辑。

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;@Component
public class HealthIndicatorImpl implements HealthIndicator {private boolean up = true;@Overridepublic Health health() {if (up) {return new Health.Builder().withDetail("status", "up").up().build();  //自定义监控内容} else {return new Health.Builder().withDetail("error", "client is down").down().build();}}public boolean isUp() {return up;}public void setUp(boolean up) {this.up = up;}
}

  在启动类上添加注解@EnableDiscoveryClient 或@EnableEurekaClient(@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心)

  客户端启动后,sever端显示客户端服务状态为UP
在这里插入图片描述
   访问http://127.0.0.1:8611/actuator/health 查看客户端状态

{"status": "UP","components": {"configServer": {"status": "UP","details": {"repositories": [{"name": "app","profiles": ["default"],"label": null}]}},"discoveryComposite": {"status": "UP","components": {"discoveryClient": {"status": "UP","details": {"services": ["datax-config"]}},"eureka": {"description": "Remote status from Eureka server","status": "UP","details": {"applications": {"DATAX-CONFIG": 1}}}}},"diskSpace": {"status": "UP","details": {"total": 107373129728,"free": 6842404864,"threshold": 10485760,"exists": true}},"healthIndicatorImpl": {"status": "UP","details": {"status": "up"}},"hystrix": {"status": "UP"},"ping": {"status": "UP"},"refreshScope": {"status": "UP"}}
}

  为了方便模拟,创建个controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HealthController {@Autowiredprivate HealthIndicatorImpl myHealthChecker;@RequestMapping("/up")public String up(@RequestParam("up") Boolean up) {myHealthChecker.setUp(up);return myHealthChecker.isUp() ? "UP" : "DOWN";}
}

  访问http://127.0.0.1:8611/up?up=false更改客户端状态, server端可以看到状态由UP变为DOWN了。
在这里插入图片描述

Eureka 工作流程

  1. Eureka Server 启动成功,等待服务端注册
  2. Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务
  3. Eureka Client 会每 30 秒向 Eureka Server 发送一次心跳,证明客户端服务正常
  4. 当 Eureka Server90 秒内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例
  5. 单位时间内 Eureka Server 统计到大量的 Eureka Client 没有发送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有发送心跳的客户端
  6. 当 Eureka Client 心跳恢复正常后,Eureka Server 自动退出自我保护机制
  7. Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存在本地
  8. 服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存
  9. Eureka Client 获取到目标服务器信息,发起服务调用
    10.Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中剔除

http://www.ppmy.cn/news/76425.html

相关文章

【CMU 15-445】学习笔记与Lab汇总

又来开新坑啦&#xff01;本门课程为CMU的数据库原理课程15-445&#xff0c;我学习的版本为Fall2022&#xff0c;教授为Andy&#xff08;上课有DJ&#xff09;。准备跟着课程的Schedule来做&#xff0c;就是先看配套教材的相应章节&#xff08;Database-System-Concept-7th&…

Python 3.10.11 liunx系统安装

官网下载 https://www.python.org/downloads/source/ 将tar包上传服务器安装 安装基础功能软件 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel 解压安装 tar -z…

流程控制语句

流程控制 程序三大结构: 顺序结构:程序由上往下执行 遇到报错就终止 选择结构:通过不同条件走向不同分支结果 循环结构:通过判断条件是否满足,从而把一段代码重复执行 代码块权限 在Python中代码块的权限是通过缩进来表示 一级: 二级 二级 二级 在JavaScript中代码块权限是…

setContentHuggingPriority和setContentCompressionResistancePriority的使用

需求&#xff1a; 两个label并排显示&#xff0c;文字内容由服务器返回&#xff0c;label宽度以文字内容自适应&#xff0c;label之间间距大于等于10. 需要考虑以下情况&#xff1a; 当两个label的宽度和 < 屏幕宽度时&#xff0c;各自设置约束&#xff0c;无需处理&#…

八锁现象——synchronized关键字实战详解

八锁现象 目录 八锁现象哪八种锁&#xff1f;八锁第一锁和第二锁第一锁第二锁第一、二锁解释 八锁第三锁第三锁解释 八锁第四锁第四锁解释 八锁第五锁第五锁解释 八锁第六锁第六锁解释 八锁第七锁第七锁解释 八锁第八锁第八锁解释八锁总结&#xff1a; 羡慕案例中使用sleep方法…

【小菜鸡刷题记】---栈与队列篇

【小菜鸡刷题记】---栈与队列篇 用两个栈模拟一个队列用两个队列实现栈剑指 Offer 58 - I. 翻转单词顺序剑指 Offer 59 - I. 滑动窗口的最大值剑指 Offer 30. 包含min函数的栈剑指 Offer 59 - II. 队列的最大值&#xff08;max函数的队列&#xff09; 特此声明&#xff1a;本篇…

【数据库复习整理】数据库为什么要进行分库和分表以及水平分表和垂直分表

分库和分表原因 数据库进行分库和分表是为了解决大规模数据存储和高并发访问的需求&#xff0c;以提高系统的性能、可扩展性和可用性。以下是分库和分表的主要原因和好处&#xff1a; **分库的原因和好处&#xff1a;** 1. **数据隔离&#xff1a;** 分库将数据划分到不同的…

使用 CameraX 在 Jetpack Compose 中构建相机 Android 应用程序

使用 CameraX 在 Jetpack Compose 中构建相机 Android 应用程序 CameraX 是一个 Jetpack 库&#xff0c;旨在帮助简化相机应用程序的开发。 [camerax官方文档] https://developer.android.com/training/camerax CameraX的几个用例&#xff1a; Image CaptureVideo CapturePrev…