前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >spring cloud注册中心之Eureka

spring cloud注册中心之Eureka

作者头像
丁D
发布于 2022-08-12 13:41:29
发布于 2022-08-12 13:41:29
82700
代码可运行
举报
文章被收录于专栏:老铁丁D老铁丁D
运行总次数:0
代码可运行

什么是注册中心?

随着微服务的盛行,越来越多的应用,开始拆成一个一个的服务,服务之间相互依赖,那么内部的服务是怎么相互调用的。 例如:服务A部署在3个服务器上,3个实例有不同的ip地址。然后服务B依赖服务A,需要调用服务A。

在没有注册中心的情况下。我们可能是服务A前面架设了一个nginx

这样做服务B就可以只访问nginx的地址,然后转发到3个实例。

但是随着docker容器的盛行。ip地址已经不在固定,经常发生变化。这样的话我们就需要部署的时候手工去修改nginx的配置文件,或者使用脚本去更新配置文件,然后reload。

现在我们引入注册中心,只需要将服务注册到注册中心,然后网关等从注册中心获取实例的信息,实现动态路由

注册中心需要的功能

服务注册

理论上来说 服务在启动的时候,就应该调用eureka server的api(register方法)进行注册。 对于java 服务可以使用 eureka client封装的api去调用server的api进行注册 对于spring cloud的应用 基于spring boot的自动配置,已经自动帮我们注册服务了

服务下线

Cancel(服务下线);Eureka client 会发送 下线请求给 Eureka server ,Eureka server 就会将 这个 client 的实例从注册列表中剔除;发送下线请求代码如下: DiscoveryManager.getInstance().shutdownComponent()

服务剔除

正常来说服务在关系应用的时候,应该通过钩子或者生命周期的回调方法去调用eureka server的de-register来删除自身的信息。 但是为了解决服突然挂掉或其他情况没有及时删除自身的信息,eureka server要求client定时发送心跳(30s),来证明服务还存活,如果超过一定时间没有进行续约(90s),server就会认为该服务不健康自动剔除。

服务租约

Eureka client 会向 Eureka server 每隔30秒发送心跳;续约的目的是通知 Eureka server 自己代表的实例是处于存活状态;如果 Eureka server 90 秒内 未收到 续约心跳,就会将这个实例从服务列表中剔除;官方建议是不要修改续约间隔,原因是服务器要使用这些信息去确认 Eureka server 与 Eureka client 之间的交流是否存在广泛传播的问题;

数据一致性问题

作为注册中心,是不可能是单点的,一定是集群化,那么集群中eureka每个节点是如何进行数据同步的? 一般来说:分布式系统中,数据副本的复制方式一般分为主从复制或对等复制(peer to peer) eureka使用的是对等复制 主从复制:就好像mysql主从,写都写在主节点,然后由主节点复制给其他从节点,这样主节点的写压力大,但是从节点可以分担读压力 对等复制:任何节点都可以接受写请求和读请求.然后副本间进行数据更新;但副本间数据同步时可能产生数据冲突;

Eureka Server也是一个Client,在启动时,通过请求其中一个节点(Server),将自身注册到Server上,并获取注册服务信息; 每当Server信息变更后(client发起注册,续约,注销请求),就将信息通知给其他Server,来保持数据同步; 在执行同步(复制)操作时,可能会有数据冲突,是通过lastDirtyTimestamp,最近一次变更时间来保证是最新数据;

客户端维护这一个Eureka Server不可用列表和可用列表,当有请求的时候,会从可用列表中获取一个地址,进行请求,失败按顺序换下一个地址 为了防止每个Eureka client按配置文件配置的顺序来请求,导致请求server不均衡,client有个定时任务,每隔5分钟重新刷新并随机化Eureka Server的列表。

peer-peer复制不一定成功,所以server之间还可以通过hearbeat来修复

AP优于CP

分布式系统中有3个特性(CAP) Consistency:数据一致性,多个副本的情况下,可能由于网络,机器故障等问题导致,有的副本写入成功,有的失败,造成副本之间数据不一致,满足一致性要求对数据更新操作成功之后,多个副本要保持一致。

Availability:在任何时候对集群进行读写,集群要能正常响应,在一定的延时内完成

Partition Tolerance:分区容忍性,整个集群被分割多个无法相互通信的分区是,集群要仍然可用。

由于网络是不可控的,所以网络分区是客观存在,不可避免的。所以系统需要具备分区容忍性。在这个前提下设计只能在AP和CP之间选择。

zookeeper可以说是cp的 但是也不能说是强一致性的,,因为客户端提交一个写请求,只要过半的节点写成功就返回,这时有个读请求刚好读到没有同步的节点, 这个时候就读不到新的数据,如果需要强一致性,需要读取数据的时候先执行一下sync,即先向主节点同步一下数据。。 但是在网络分区的情况下,主节点,不在non-quorum分区,这个分区的读写请求都会报错,不可用无法满足Availability的特性 而且在选主节点的时候zk集群不可用

eureka选择满足Availability,所以他是ap的,节点之间并不是强一致性的,设计者认为注册中心,保留可用及过期的数据总比丢掉可用的数据好。

自我保护

为了防止,偶尔的网络抖动或者,短暂的网络不可用,造成误判,导致清空服务实例的注册信息,这会严重影响Eureka的可用性(availability),所以引入了自我保护策略

eureka client和server端之前有个租约,client要定时发送心跳维持这个租约,表示自己还活着,eureka通过当注册的实例数,去计算每分钟应该从应用接收到的心跳数,如果1分钟接收的心跳数小于指定的阈值,就禁止定时任务剔除失效的实例。

eureka.server.enable-self-preservation = false 阈值可以通过eureka.server.renewal-percent-threshold来设置 。设置小于0.5 即0.49默认是0.85

常见问题

为什么服务下线了,eureka server接口返回的信息还会存在? 情况一: 应用异常挂掉,没有告诉eureka server要下线该服务的实例信息,这就需要靠定时清除任务去剔除(evictionTask)

调整evictionTask的调度频率。。默认是1分钟调整为5s

情况二: 应用告诉了eureka server要下线该服务的实例信息,,但是由于eureka server的rest api有 response cache。因此需要等待缓存过期才能呢更新

response cache的问题,可以根据情况禁止readonlyCacheMap或者调整过期时间

情况三: 开启了自我保护,导致不会因过期而被剔除。

为什么服务上线了,eureka client不能及时获取到? 针对新服务上线client获取不及时,在测试环境可以适当提供client端拉取server注册信息的频率,比如将默认的30s改成5s

Eureka高可用

多台Eureka相互注册即可

实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.ding; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; 
//服務註冊中心 
@SpringBootApplication 
@EnableEurekaServer 
public class EurekaApplication { 
public static void main(String[] args) { 
SpringApplication.run(EurekaApplication.class, args); 
} 
} 
server: 
port: 10088 
eureka: 
instance: 
hostname: localhost 
client: 
registerWithEureka: false #自己就是注册中心,不用注册自己 
fetchRegistry: false #要不要去注册中心获取其他服务的地址 
serviceUrl: 
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ 
spring: 
application: 
name: cloud-eurka 
<?xml version="1.0"?> 
<project 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<modelVersion>4.0.0</modelVersion> 
<parent> 
<groupId>spring-cloud</groupId> 
<artifactId>cloud-parent</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
</parent> 
<groupId>spring-cloud</groupId> 
<artifactId>cloud-eureka</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<name>cloud-eureka</name> 
<url>http://maven.apache.org</url> 
<dependencies> 
<!-- eureka-server依賴 --> 
<dependency> 
<groupId>org.springframework.cloud</groupId> 
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> 
</dependency> 
</dependencies> 
</project> 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringCloud学习1-服务注册与发现(Eureka)
前言 Oracle转让Java,各种动态语言的曝光率上升,Java工程师的未来在哪里?我觉得Spring Cloud让未来有无限可能。拖了半年之久的Spring Cloud学习就从今天开始了。中文教材不多,而且大多都是简单的离散的信息,想要找到企业级的一体化解决方案很少。不过,对于入门来说,简单就够了,等到用的时候自然而然的汇总起来。 目标是把springcloud的子项目过一遍。 Component Edgware.SR2 Finchley.M7 Finchley.BUILD-SNAPSHOT
Ryan-Miao
2018/03/14
2.5K0
SpringCloud学习1-服务注册与发现(Eureka)
Spring-Cloud-Netflix-Eureka注册中心
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现
JokerDJ
2023/11/27
2380
Spring-Cloud-Netflix-Eureka注册中心
Spring Cloud Eureka集群
Spirng Cloud Eureka使用Netflix Eureka来实现服务注册与发现。它既包含了服务端组件,也包含了客户端组件,并且服务端与客户端均采用java编写,所以Eureka主要适用于通过java实现的分布式系统,或是JVM兼容语言构建的系统。Eureka的服务端提供了较为完善的REST API,所以Eureka也支持将非java语言实现的服务纳入到Eureka服务治理体系中来,只需要其他语言平台自己实现Eureka的客户端程序。目前.Net平台的Steeltoe、Node.js的eureka-js-client等都已经实现了各自平台的Ereka客户端组件。
全栈程序员站长
2022/08/18
4370
Spring Cloud Eureka集群
Spring Cloud Netflix 系列:Eureka 经典实战案例和底层原理解析
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2024/11/04
4794
Spring Cloud Netflix 系列:Eureka 经典实战案例和底层原理解析
Spring Cloud 系列之注册中心 Eureka
  Netflix Eureka 是由 Netflix 开源的一款基于 REST 的服务发现组件,包括 Eureka Server 及 Eureka Client。2012 年 9 月在 GitHub 上发布 1.1.2 版本,目前 Netflix 以宣布闭源,所以市面上还是以 1.x 版本为主。Eureka 提供基于 REST 的服务,在集群中主要用于服务管理。Eureka 提供了基于 Java 语言的客户端组件,客户端组件实现了负载均衡的功能,为业务组件的集群部署创造了条件。使用该框架,可以将业务组件注册到 Eureka 容器中,这些组件可进行集群部署,Eureka 主要维护这些服务的列表并自动检查它们的状态。Spring Cloud Netflix Eureka 是 Pivotal 公司为了将 Netflix Eureka 整合于 Spring Cloud 生态系统提供的版本。   Eureka 包含两个组件:Eureka Server 和 Eureka Client, Eureka Server 提供服务注册服务。各个微服务节点通过配置启动后,会在 EurekaServer 中进行注册,这样 EurekaServer 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。EurekaClient 通过注册中心进行访问。它是一个 Java 客户端,用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向 Eureka Server 发送心跳(默认周期为30秒)。如果 Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,EurekaServer 将会从服务注册表中把这个服务节点移除(默认90秒)
Demo_Null
2020/11/04
3620
Spring Cloud 系列之注册中心 Eureka
Spring Cloud Eureka详解
服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。
全栈程序员站长
2022/09/14
7560
Spring Cloud Eureka详解
【Spring Cloud】004-Eureka服务注册与发现
Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是基于REST的服务,用于定位服务,以实现云端中间件层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务注册与发现,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper;
訾博ZiBo
2025/01/06
1140
【Spring Cloud】004-Eureka服务注册与发现
Eueka注册中心学习!(什么是注册中心,注册中心是什么)
注册中心可以说是微服务架构中的“通讯录”,它记录了服务和服务地址的映射关系.在分布式架构中,服务会注册到这里,当服务需要调用其他服务的时候,就到这里找到服务的地址,进行调用;
默 语
2024/11/20
1100
Eueka注册中心学习!(什么是注册中心,注册中心是什么)
Spring Eureka 初探及集群搭建
Eureka 主要是用于进行服务的注册和发现,今天就来学习一下如何使用 Eureka
Java技术编程
2020/05/21
3730
Spring Cloud Eureka 详述(一)
服务治理: Spring Cloud Eureka一、简介二、 功能概述服务治理Netflix Eureka搭建服务注册中心注册服务提供者高可用配置中心服务发现与消费
cxuan
2019/06/03
9370
快速学习-Eureka注册中心
在刚才的案例中,user-service对外提供服务,需要对外暴露自己的地址。而consumer(调用者)需要记录服务提供者的地址。将来地址出现变更,还需要及时更新。这在服务较少的时候并不觉得有什么,但是在现在日益复杂的互联网环境,一个项目肯定会拆分出十几,甚至数十个微服务。此时如果还人为管理地址,不仅开发困难,将来测试、发布上线都会非常麻烦,这与DevOps的思想是背道而驰的。
cwl_java
2020/02/11
6060
SpringCloud之Eureka注册中心与Robbin负载均衡
随着互联网的发展,网站应用的规模不断扩大,需求的剧增,带来了系统架构不断的演进、升级和迭代。
陶然同学
2023/02/27
9410
SpringCloud之Eureka注册中心与Robbin负载均衡
Spring Cloud 升级之路 - 2020.0.x - 4. 使用 Eureka 作为注册中心
Eureka 目前的状态:Eureka 目前 1.x 版本还在更新,但是应该不会更新新的功能了,只是对现有功能进行维护,升级并兼容所需的依赖。 Eureka 2.x 已经胎死腹中了。但是,这也不代表 Eureka 就是不能用了。如果你需要一个简便易于部署的注册中心,Eureka 还是一个很好的选择。云服务环境中,基本上所有实例地址和微服务名称都在不断变化,也并不太需要 Eureka 所缺少的持久化特性。当你的集群属于中小规模的时候(节点小于 1000 个), Eureka 依然是一个不错的选择。当你的集群很大的时候,Eureka 的同步机制可能就限制了他的表现。
干货满满张哈希
2021/06/10
5350
Spring Cloud 升级之路 - 2020.0.x - 4. 使用 Eureka 作为注册中心
SpringCloud的入门学习之深入理解Eureka注册中心
  答:a、Eureka Server,注册中心,通过 Register、Get、Renew 等接口提供服务的注册和发现。     b、Application Service (Service Provider),服务提供方,把自身的服务实例注册到 Eureka Server中。     c、Application Client (Service Consumer),服务调用方,通过 Eureka Server获取服务列表,消费服务。
别先生
2019/11/18
8590
SpringCloud的入门学习之深入理解Eureka注册中心
SpringCloud入门系列之Eureka注册中心
Eureka Register Service(注册中心服务端)、Provider Service(服务提供者,客户端)、Consumer Service(服务消费者,客户端)
AI码真香
2022/09/13
2780
Spring Cloud Eureka
注-第一个服务启动的时候存在java.net.ConnectException: Connection refused (Connection refused)的错误信息,不用理睬,只要最后服务端口显示就表示服务起来了。出现这个错误的原因是另一个服务还没起来,无法去对方服务进行注册,如果另一个服务起来之后,不存在问题了。
迹_Jason
2019/05/28
6920
二、Spring Cloud之注册中心 Eureka
算是正式开始学习 spring cloud 的项目知识了,大概的知道Springcloud 是由众多的微服务组成的,所以我们现在一个一个的来学习吧。
程序员爱酸奶
2020/02/29
5210
Spring Cloud Eureka 总结
它主要记录各个微服务和微服务地址的映射关系,各个微服务都将自己注册到这个注册中心上面,当微服务之间需要互相调用时,就可以从注册中心上面去发现微服务和进行调用。
EalenXie
2020/09/21
6540
Spring Cloud Eureka 总结
SpringCloud:Ribbon与Feign
上一篇使用了Eureka与Ribbon组件做了最简单的的服务注册与发现,我们知道Eureka是实现服务治理中心的组件,但是上一篇Eureka没有实现集群,这样没有保证到Eureka Server的高可用。
烂猪皮
2023/09/04
4120
SpringCloud:Ribbon与Feign
Spring Cloud微服务技术栈(二):搭建高可用Eureka Server、服务注册与发现
在微服务架构中,服务治理是最为基本、最为核心的模块,它主要用来实现各个微服务实例的自动注册与发现。在互联网时代初期,微服务还未盛行之时,构建的服务完全可以使用静态配置文件来维护服务实例清单,根据实例清单来完成服务的调用,随着业务逐渐繁杂,手动维护服务实例清单已经无法满足需求,那么就需要构建一套自动维护服务实例清单的系统,该系统支持动态维护服务实例清单,当服务实例发生变化时,能及时通知客户端来应对服务实例的变化,它围绕服务实例注册与发现,实现自动化管理。
itlemon
2020/04/03
7490
Spring Cloud微服务技术栈(二):搭建高可用Eureka Server、服务注册与发现
相关推荐
SpringCloud学习1-服务注册与发现(Eureka)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验