网站首页 > 博客文章 正文
一、Eureka基础
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。Eureka包含两个组件:Eureka Server和Eureka Client。在Eureka Client应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
服务治理产生的原因?
传统的rpc远程调用框架中,要进行每个服务之间的依赖管理是比较复杂的,所以需要服务治理来管理服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务的发现与注册。springCloud封装了Netflix公司的Eureka模块来实现服务治理。
什么是服务注册与发现?
Eureka采用了cs客户-服务设计模式,Eureka Server作为服务注册功能的服务器,它是服务注册中心。而系统中的其他服务,则使用Eureka的客户端连接到Eureka Server并维持心跳。这样系统的维护人员就可以通过Eureka Server来监控系统中各个服务模块的运行状况。当服务启动的时候会把自己的服务器信息注册到Eureka Server注册中心,这就是服务注册。当调用方用服务别名去获取和查找服务信息这就是服务发现。注册中心拥有管理服务之间依赖关系的能力,这就是服务治理的概念。在任何rpc远程调用框架中,都会有一个注册中心用于存放微服务模块相关的地址信息(服务在注册中心是以键值对形式存在的,key为服务名,value为调用地址),当服务调用者需要调用某个服务时,就用该服务的别名去注册中心查找,获取对应的调用地址(获取后可能会缓存该地址,会根据配置定时更新地址),获得调用地址后底层利用httpclient技术实现远程调用。
Eureka的架构模式:Eureka服务注册中心可以有多个形成集群,服务提供者也可以有多个形成集群,而消费者可以只有一个,他们的架构关系如下图。
二、单机Eureka-Server注册中心构建
按照Maven项目模块的创建方式,依次进行建立模块、修改POM、编写yml配置文件、编写主启动类的顺序完成服务模块的编写。编写完成启动该模块后访问ip+port即可显示一个服务监控界面,如下图。
编写主启动类时,在启动类上加入@EnableEurekaServer注解,以表示该模块是服务注册中心。
编写POM时,引入Eureka-server包和图形监控包,如下所示:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId><br></dependency><br><dependency><br> <groupId>org.springframework.boot</groupid><br> <artifactId>spring-boot-starter-actuator</artifactId><br></dependency>
编写yml文件时,在resources文件夹下创建application.yml文件,并写入如下代码:
server:
port:8765
eureka:
client:
register-with-eureka: false #false表示不向服务注册中心注册自己
fetch-registry: false #false表示自己就是注册中心,不需要去检索服务
service-url: #与Eureka-server交互的地址查询服务和注册服务,都需要使用这个地址
default-zone: http://eurekaServer:8765/eureka/eureka
instance:
hostname: main-service #eureka服务端的实例名称
三、Eureka将服务模块注册到注册中心成为服务提供者
同样按照Maven项目模块的创建方式,依次进行建立模块、修改POM、编写yml配置文件、编写主启动类的顺序完成服务模块的编写。
编写主启动类时,在启动类上加入@EnableEurekaClient注解,以表示该模块是服务提供者。
编写POM时,引入Eureka-client包,如下所示:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
编写yml文件时,在resources文件夹下创建application.yml文件,并写入如下代码server:
port:8088
spring:
application:
name:service-name #表示服务模块的名称,当服务注册到注册中心后,可以在监控界面显示该名称,以定位该服务。
eureka:
client:
register-with-eureka: true #true表示向服务注册中心注册自己
fetch-registry: true #true表示检索服务,单节点可以不设置,集群节点必须设置为true才能配合ribbon使用负载均衡
service-url: #这是服务注册中心地址,表示该服务要注册到哪一个注册中心
default-zone: http://eurekaServer:8765/eureka/eureka
instance:<br> instance-id:servicename #服务名称<br> prefer-ip-address:true #访问路径显示ip地址<br> lease-renewal-interva1-in-seconds: 20 #EurekaClient向服务端发送心跳的时间间隔,单位为秒(默认是30秒)<br> lease-expiration-duration-in-seconds: 60 #EurekaServer在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
当该服务启动后,可以在注册中心监控界面查看到该服务的信息,如图所示:
四、Eureka注册中心负载均衡集群理论
1.注册中心集群:多个注册中心相互注册,形成相互守望,对外暴露出这些注册中心地址,使用负载均衡服务来访问这些地址。
2.服务提供者集群:注册中心可以集群,服务提供者也可以集群,实现服务提供者集群需完成以下两件事情:
a.当服务提供者集群以后,就不能使用端口的形式(http://ip:port)来调用服务提供者,调用消费者需使用微服务名称来调用提供者(http://cloud-servername),原因是集群状态下服务提供者端口不止一个。
b.消费者通过微服务名称来调用提供者时,因为集群会有多个相同的微服务名称,会出现调用不明确的情况而报错,因此需要赋予RestTemplate负载均衡能力,具体实现是在消费者的ApplicationContextConfig配置文件的getRestTemplet()下增加@LoadBalanced注解。(RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。)
3.服务模块需要同时注册到每个集群的注册中心:其注册方式为在yml配置文件中的defaultzone下使用","逗号来分割这些注册中心地址。
五、服务发现Discovery
微服务自身要向外提供服务功能,就需要向外部提供微服务的信息,服务本身可以向外暴露一个discovery()方法,消费者可以通过调用该方法获得服务的说明信息。在eureka组件中,通过DiscoveryClient类来实现,该类可以获取已经在注册中心注册成功的所有微服务的信息。微服务要向外提供信息,需要在主启动类上增加@EnableDiscoveryClient注解,同时需要给DiscoveryClient类增加注解@resource注解。
六、Eureka的自我保护机制
保护模式主要用于一组客户端和EurekaServer之间存在网络分区时的保护,EurekaServer将尝试保护其注册表中的信息,不再删除服务注册表中的数据,也不会注销任何微服务。如果在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不会立即清理,依旧会对该服务的信息进行保存。这是CAP理论中的AP理论。为什么会产生自我保护机制?这是为了防止Eureka可以正常运行,但与EurekaServer之间网络不通时造成误删。
什么是自我保护模式?默认情况下,如果EurekaServer在一定时间内没有收到某服务的心跳,EurekaServer会将其注销(默认90秒),但是当EurekaServer与服务模块之间网络存在延时、卡顿、拥挤时,他们之间无法正常发送心跳,此时微服务本身是健康的,不应该被注销。Eureka就通过"自我保护模式"来解决,自我保护模式的思想是当检测到短时间内偶尔没有收到心跳时(可能发生了网络分区故障),不会立即删除微服务。
如何禁止自我保护?在EurekaServer的application.yml配置文件中server节点下增加如下配置:
server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 2000 #心跳间隔时间
xxxxxxxxxxbr server: br enable-self-preservation: false #关闭自我保护机制br eviction-interval-timer-in-ms: 2000 #心跳间隔时间
关闭自我保护模式后,刷新注册中心页面主页,则会出现THE SELF PRESERVATION MODE IS TURNED FFNCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.提示。
七、Eureka停止更新的说明
Netflix官网公告了Eureka已经停止更新,进入维护模式,除非已经在项目中使用该组件,新项目建议使用其他替代组件,比如Zookeeper、Consul、Nacos等。
猜你喜欢
- 2024-10-10 挤爆服务器,北大法律大模型ChatLaw火了:直接告诉你张三怎么判
- 2024-10-10 在PS Cloud中生产订单的查询(ps订单从哪接)
- 2024-10-10 Google Cloud宣布在AWS首尔区域支持“BigQuery Omni”解决方案
- 2024-10-10 流程引擎activiti5、activiti6、activiti7对比分析
- 2024-10-10 MySQL单表数据量过千万,采坑优化记录,完美解决方案
- 2024-10-10 金蝶K3_Cloud财务操作流程明细-应收款管理操作规程(一)
- 2024-10-10 距 CloudQuery v1.5.0 发版仅剩2天
- 2024-10-10 Spring Boot跟踪微服务日志(springboot 微服务架构)
- 2024-10-10 一、微服务技术-SpringCloud-互联网网站架构演变过程
- 2024-10-10 influxdb内存消耗分析及性能优化「追踪篇」
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)