【Spring Cloud】深入理解 Eureka 注册中心的原理、服务的注册与发现

文章目录

  • 前言
  • 一、微服务调用出现的问题
    • 1.1 服务消费者如何获取服务提供者的地址信息?
    • 1.2 如果有多个服务提供者,消费者该如何选择?
    • 1.3 消费者如何得知服务提供者的健康状态?
  • 二、什么是 Eureka
    • 2.1 Eureka 的核心概念
    • 2.2 Eureka 的解决微服务调用问题的方案
  • 三、Eureka 的原理
    • 3.1 Eureka 的核心组件
      • 3.1.1 eureka-server
      • 3.1.2 eureka-client
    • 3.2 Eureka 的工作流程
  • 四、搭建 Eureka 服务
  • 五、注册服务
    • 5.1 注册 `user-service` 服务
    • 5.2 注册 `order-service` 服务
    • 5.3 同一个服务启动多个实例
  • 六、服务的发现


前言

在微服务架构中,服务的注册与发现是至关重要的一环。为了实现这一目标,Eureka 注册中心应运而生。在本篇文章中,我们将深入理解 Eureka 注册中心的原理,以及探讨服务的注册与发现机制。

在微服务的协作中,服务之间的远程调用是常见的需求。然而,使用传统的 RestTemplate 远程调用方式存在一些问题,例如耦合度高、维护困难等。为了解决这些问题,我们将探讨如何利用 Eureka 注册中心来优雅地进行服务的注册与发现,从而更好地构建微服务架构。

接下来,我们将逐步深入探讨 Eureka 注册中心的原理、搭建 Eureka 服务、服务的注册与发现等关键内容。希望通过阅读本文,可以帮助我们更全面地理解微服务架构中 Eureka 的作用以及如何灵活运用它来构建高效可靠的分布式系统。

一、微服务调用出现的问题

在微服务架构中,服务之间的远程调用是常见的需求。然而,随着系统的复杂性增加,服务调用也带来了一些问题和挑战。

1.1 服务消费者如何获取服务提供者的地址信息?

在微服务架构中,服务提供者的地址信息通常是动态的,可能随时发生变化,例如服务的扩容、缩容、迁移等情况。因此,服务消费者需要一种机制来获取服务提供者的地址信息,以确保能够正确地发起远程调用。

解决方案:服务注册与发现

  • 服务提供者在启动时将自己的地址信息注册到服务注册中心,包括主机名、端口号等信息。
  • 服务消费者通过查询服务注册中心来获取服务提供者的地址信息,从而可以动态地发起调用。

1.2 如果有多个服务提供者,消费者该如何选择?

在实际应用中,可能会存在多个提供相同服务的服务提供者,这时服务消费者需要选择一个合适的提供者来发起调用。选择的依据可以包括负载均衡、性能指标、健康状态等因素。

解决方案:负载均衡

  • 负载均衡是一种策略,用于在多个服务提供者之间分配请求,以达到均衡负载的目的。
  • 常见的负载均衡策略包括轮询、随机、加权轮询、加权随机等,不同策略适用于不同的场景。

1.3 消费者如何得知服务提供者的健康状态?

在微服务架构中,服务提供者的健康状态对于服务消费者是非常重要的信息。如果一个服务提供者出现了故障或不可用,服务消费者需要避免向其发起请求,以确保系统的稳定性和可靠性。

解决方案:健康检查与容错机制

  • 健康检查是一种监测服务提供者健康状态的机制,通常由服务注册中心来执行。
  • 服务消费者可以根据健康检查的结果来判断服务提供者是否可用,从而决定是否发起调用。
  • 容错机制可以帮助服务消费者处理远程调用时可能出现的故障,例如超时、重试、降级等。

其中,Eureka 就是是一种服务注册与发现的解决方案,它通过服务注册中心来解决了微服务调用中的一些关键问题。

二、什么是 Eureka

Eureka 是 Netflix 提供的一款开源的服务注册与发现框架,用于构建基于微服务架构的分布式系统。它解决了在微服务架构中,服务的动态注册、发现和负载均衡的问题,是构建可伸缩和高可用性微服务的重要工具之一。

2.1 Eureka 的核心概念

  • 服务注册

在微服务架构中,服务提供者在启动时将自己的信息注册到 Eureka 注册中心,包括服务名称、网络地址等。这样,Eureka 注册中心就知道了系统中有哪些服务是可用的。

  • 服务发现

服务消费者可以通过查询 Eureka 注册中心获取可用服务的信息,从而决定向哪些服务发起调用。Eureka 注册中心维护了一个服务实例列表,包括每个服务的网络地址。

  • 心跳与健康检查

Eureka 注册中心会定期向服务提供者发送心跳请求,以检测服务是否仍然可用。如果一个服务在一定时间内未发送心跳,Eureka 将其标记为不可用。这就实现了对服务健康状态的监控。

  • 负载均衡

Eureka 客户端集成了 Ribbon 负载均衡器,可以在多个服务提供者之间实现负载均衡。通过使用 Ribbon,服务消费者可以选择一个合适的服务提供者来发起调用。

Eureka 的优势

  1. 简化了服务调用: Eureka 提供了简洁的 API,使得服务的注册、发现和调用变得非常容易。

  2. 高可用性: Eureka 支持服务注册中心的集群部署,通过相互注册来保证注册中心的高可用性。

  3. 负载均衡: 集成了 Ribbon 负载均衡器,可实现对多个服务提供者的请求分配,提高系统的性能和稳定性。

  4. 动态扩展: Eureka 支持服务的动态注册和注销,适应服务实例的动态变化。

  5. 健康检查: 通过心跳和健康检查,Eureka 能够及时发现不可用的服务实例,确保服务的高可用性。

总体而言,Eureka 是一个功能强大的服务注册与发现框架,为构建微服务架构提供了可靠的基础设施支持。

2.2 Eureka 的解决微服务调用问题的方案

  1. 服务消费者如何获取服务提供者的地址信息?

    • Eureka 注册中心: 服务提供者在启动时将自己的地址信息注册到 Eureka 注册中心。服务消费者可以通过查询 Eureka 注册中心获取服务提供者的地址信息。
  2. 如果有多个服务提供者,消费者该如何选择?

    • 负载均衡: Eureka 支持负载均衡,服务消费者可以使用负载均衡策略来选择一个合适的服务提供者。Eureka 客户端集成了 Ribbon 负载均衡器,可方便地实现负载均衡。
  3. 消费者如何得知服务提供者的健康状态?

    • 健康检查: Eureka 注册中心会定期对服务提供者进行健康检查,如果一个服务提供者出现故障,Eureka 将其标记为不可用。服务消费者在查询服务列表时可以过滤掉不可用的服务提供者,确保只选择健康的服务。

综上所述,Eureka 提供了服务注册与发现的机制,同时集成了负载均衡和健康检查等功能,有效地解决了微服务调用中的关键问题。通过使用 Eureka,微服务架构中的服务调用变得更加灵活、可靠、具有高可用性。

三、Eureka 的原理

Eureka 是一个由 Netflix 提供的服务注册与发现框架,通过 eureka-servereureka-client 两部分协同工作,实现了微服务架构中服务的动态注册、发现、负载均衡和健康检查等功能。下面我们将深入了解 Eureka 的工作原理。

3.1 Eureka 的核心组件

3.1.1 eureka-server

  • 服务注册中心: eureka-server 充当服务的注册中心,负责接收服务提供者注册信息并维护注册表。

  • 服务注册表: 服务提供者在启动时向 eureka-server 注册自己的信息,包括服务名称、网络地址等,形成服务注册表。

  • 健康检查: eureka-server 定期向服务提供者发送心跳,通过健康检查来维护服务的健康状态。

3.1.2 eureka-client

  • 服务提供者: 微服务中的各个服务模块通过 eureka-clienteureka-server 注册自己的服务。

  • 服务消费者: 微服务中的服务消费者通过 eureka-clienteureka-server 获取可用服务的信息,实现服务的发现。

  • 负载均衡: eureka-client 集成了 Ribbon 负载均衡器,可以在多个服务提供者之间实现负载均衡,提高系统的性能和可靠性。

3.2 Eureka 的工作流程

Eureka 的工作流程可用下图表示:

Eureka 的工作流程

  1. 服务注册阶段:

    • 服务提供者启动时,通过 eureka-clienteureka-server 注册自己的服务信息。

    • 注册包括服务名称、网络地址等,服务提供者成为服务注册表的一部分。

  2. 服务发现阶段:

    • 服务消费者通过 eureka-clienteureka-server 发送服务发现请求。

    • eureka-server 返回可用服务的信息,包括服务名称和对应的网络地址。

    • 服务消费者根据负载均衡策略选择一个服务提供者。

  3. 健康检查与维护:

    • eureka-server 定期向服务提供者发送心跳,检查服务的健康状态。

    • 如果一个服务提供者长时间未发送心跳,eureka-server 将其标记为不可用。

    • 不可用的服务将在服务注册表中被移除,保持服务注册表的准确性。

通过上述流程,Eureka 实现了服务的动态注册与发现,保障了微服务架构的高可用性和弹性扩展能力。Eureka 的原理设计使得微服务之间的调用更加灵活和可靠。

四、搭建 Eureka 服务

在 Spring Cloud Demo 代码中搭建 Eureka 服务的步骤如下:

  1. 创建项目,引入spring-cloud-starter-netflix-eureka-server的依赖
<!-- eureka 服务端-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  1. 编写启动类,添加@EnableEurekaServer注解
@EnableEurekaServer // 开启 EurekaServer 自动装配
@SpringBootApplication
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}
  1. 添加application.yml文件,编写下面的配置
server:port: 10086
spring:application:name: eurekaservice # 服务的名称
eureka:client:service-url: # eureka 的地址信息defaultZone: http://127.0.0.1:10086/eureka/ # eureka 也是一个微服务,因此启动的时候也会将自己注册进 eureka 中(为集群起作用)

完成上述所有的步骤之后就可以运行EurekaApplication 启动类了,然后就可以访问地址:http://localhost:10086/

如果此时出现的页面如下,就说明搭建 Eureka 服务成功了:

其中Instances currently registered with Eureka 下显示的就是当前在 Eureka 中注册的服务。

五、注册服务

5.1 注册 user-service 服务

user-service 服务注册到 EurekaServer 中的步骤如下:

  1. user-service 项目的pom.xml中引入spring-cloud-starter-netflix-eureka-client依赖
 <!-- eureka 客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
  1. application.yml文件,编写下面的配置
spring:application:name: userservice
eureka:client:service-url: defaultZone: http://127.0.0.1:10086/eureka/ 

此时我们发现这个配置和上面搭建 EurekaServer 时的配置基本相同,其原因就是 Eureka 在启动的时候也会将自己注册到 EurekaServer 中,而这个配置的作用就是将指定的服务(通过application name 区分)注册到defaultZone 对应地址的 EurekaServer 中。

5.2 注册 order-service 服务

  1. order-service 项目的pom.xml中引入spring-cloud-starter-netflix-eureka-client依赖
 <!-- eureka 客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
  1. application.yml文件,编写下面的配置
spring:application:name: orderservice
eureka:client:service-url: defaultZone: http://127.0.0.1:10086/eureka/ 

此时,启动user-serviceorder-service 服务,再次访问http://localhost:10086/就可以发现成功将服务注册到 EurekaServer 中了:

5.3 同一个服务启动多个实例

另外,在IDEA中,我们可以同时启动一个服务的多个实例,只需要保证不同实例的端口号不要发生冲突即可。

例如,此时我还想增加两个user-service 服务的实例,步骤如下:

  1. 右键点击 UserApplication ,然后选择 Copy Configuration 进行复制

  2. 然后进行如下设置

    -Dserver.port=8082表明为这个配置重新设置端口号为 8082,可以按照相同的方式,再复制一个配置。

启动这两个实例,然后再次访问http://localhost:10086/


此时就可以发现user-service 新增的两个实例的服务也成功注册到了 EurekaServer 中。

六、服务的发现

把服务注册到 EurekaServer 之后,要做的就是实现服务的拉取了,EurekaServer 中服务的拉取是基于服务名称来获取服务的列表,然后再对服务列表做负载均衡选择出一个服务。

此时我们想要 order-service 能够拉取到 EurekaServer 中注册的 user-service 服务,需要进行以下操作:

  1. 修改 order-service 的代码,修改访问的 url 路径,用服务名代替 IP和端口
public Order queryOrderById(Long orderId) {// 1. 查询订单Order order = orderMapper.findById(orderId);// 2. 查询用户// 2.1 构建查询用户的 urlString url = "http://userservice/user/" + order.getUserId();// 2.2 使用 RestTemplate 远程调用查询用户User user = restTemplate.getForObject(url, User.class);// 3. 封装 user 信息order.setUser(user);// 4.返回return order;
}

此处就使用 userservice 服务名来代替 user-service 服务的 IP 和端口号了。

  1. order-service 服务的启动类OrderApplication中的 RestTemplate 添加@LoadBalanced负载均衡注解
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}/*** 创建 RestTemplate 并注册到 Spring 容器*/@LoadBalanced // 负载均衡@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}

至此,重新启动 order-service 服务,便能成功从 EurekaServer 中访问到 user-service 提供的服务了。

此时清空三个 user-service服务实例的日志记录,然后在浏览器中连续查询三次订单信息:



由此可得知,三个实例各种承担了一次服务的请求,说明此时负载均衡所采用的策略是轮询的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/145553.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言数据结构之排序整合与比较(冒泡,选择,插入,希尔,堆排序,快排及改良,归并排序,计数排序)

前言&#xff1a;排序作为数据结构中的一个重要模块&#xff0c;重要性不言而寓&#xff0c;我们的讲法为下理论掌握大致的算法结构&#xff0c;再上代码及代码讲解&#xff0c;助你一臂之力。 一&#xff0c;冒泡 冒泡排序应该是大家学习以来第一个认识的排序方法&#xff0…

buuctf-[WUSTCTF2020]CV Maker

打开环境 随便登录注册一下 进入到了profile.php 其他没有什么页面&#xff0c;只能更换头像上传文件&#xff0c;所以猜测是文件上传漏洞 上传一句话木马看看 <?php eval($_POST[a]);?>回显 搜索一下 添加文件头GIF89a。上传php文件 查看页面源代码&#xff0c;看…

Leetcode---364场周赛

题目列表 2864. 最大二进制奇数 2865. 美丽塔 I 2866. 美丽塔 II 2867. 统计树中的合法路径数目 一、最大二进制奇数 这题只要你对二进制有了解(学编程的不会不了解二进制吧)&#xff0c;应该问题不大&#xff0c;这题要求最大奇数&#xff0c;1.奇数&#xff1a;只要保证…

谷歌扩展下载

Chrome 扩展下载安装网站推荐 # 1. 极简插件优质crx应用 ●地址&#xff1a;https://chrome.zzzmh.cn ●推荐&#xff1a;★★★★★ 一个非常良心 & 干净 & 简洁的 Chrome 扩展下载网站&#xff0c;体验非常不错&#xff01; 侧边栏可以通过类型对扩展进行筛选和排序&…

Android LiveData 介绍

Android LiveData 介绍 系列文章目录前言一、LiveData是什么&#xff1f;二、简单使用依赖测试数据准备1.创建可观察的livedata2.观察它3.更新它 总结 系列文章目录 Android LiveData 介绍&#xff08;本文&#xff09; 前言 本系列根据官网介绍Jetpack中的数据通信组件&…

大数据Doris(三):Doris编译部署篇

文章目录 Doris编译部署篇 一、Doris编译

侯捷 C++ STL标准库和泛型编程 —— 4 分配器 + 5 迭代器

4 分配器 4.1 测试 分配器都是与容器共同使用的&#xff0c;一般分配器参数用默认值即可 list<string, allocator<string>> c1;不建议直接用分配器分配空间&#xff0c;因为其需要在释放内存时也要指明大小 int* p; p allocator<int>().allocate(512,…

图像处理: 马赛克艺术

马赛克 第一章 马赛克的历史渊源 1.1 马赛克 艺术中的一种表面装饰&#xff0c;由紧密排列的、通常颜色各异的小块材料&#xff08;如石头、矿物、玻璃、瓷砖或贝壳&#xff09;组成。与镶嵌不同的是&#xff0c;镶嵌是将要应用的部件放置在已挖空以容纳设计的表面中&#xff0…

babel.config.js配置文件详解

文章目录 一、前言三、babel 详解四、拓展阅读 一、前言 项目开发阶段&#xff0c;使用可选链操作符 ?. 出现以下编译报错问题&#xff1a; 分析&#xff1a;由于可选链操作符 ?. 是ES2020&#xff08;即ES11&#xff09;中推出的新语法&#xff0c;允许我们不需要校验当前属…

imgui开发笔记<1>、ubuntu环境下快速应用

去这个链接下载imgui源码&#xff08;在此之前需要安装opengl glfw3等等&#xff09;&#xff1a; sudo apt-get install libglfw3-dev https://github.com/ocornut/imgui 我这里源码下载到/home/temp/imgui目录下&#xff0c;咱们不需要编译源码成库&#xff0c;而是直接将下…

网页采集工具-免费的网页采集工具

在当今数字化时代&#xff0c;网页采集已经成为了众多领域的必备工具。无论是市场研究、竞争情报、学术研究还是内容创作&#xff0c;网页采集工具都扮演着不可或缺的角色。对于许多用户来说&#xff0c;寻找一个高效、免费且易于使用的网页采集工具太不容易了。 147SEO工具的强…

使用prometheus监控java服务

在prometheus官方下载页面没有看到jvm_exproter的下载地址但是官方页面是有推荐下载地址的 访问 Prometheus - Monitoring system & time series database prometheus官方网址 官方推荐地址下载是在github网络访问不方便的可以用下面的网址 wget https://repo1.maven…

SpringCloud Gateway--Predicate/断言(详细介绍)中

&#x1f600;前言 本篇博文是关于SpringCloud Gateway–Predicate/断言&#xff08;详细介绍&#xff09;中&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以…

51单片机数字电压表仿真设计_LCD显示(仿真+程序+原理图+PCB+设计报告+讲解)

51单片机数字电压表仿真设计_LCD显示&#xff08;仿真程序原理图PCB设计报告讲解&#xff09; 原理图&#xff1a;Altium Designer 仿真版本&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0006 51单片机数…

【新版】系统架构设计师 - 未来信息综合技术

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 未来信息综合技术考点摘要信息物理系统CPS的体系架构CPS 的技术体系CPS应用场景 人工智能分类关键技术机器学习 机器人发展分类机器人4.0 边缘计算概念与特点边云协同安全应用场景 数字孪生关键技…

1 论文笔记:Efficient Trajectory Similarity Computation with ContrastiveLearning

2022CIKM 1 intro 1.1 背景 轨迹相似度计算是轨迹分析任务&#xff08;相似子轨迹搜索、轨迹预测和轨迹聚类&#xff09;最基础的组件之一现有的关于轨迹相似度计算的研究主要可以分为两大类&#xff1a; 传统方法 DTW、EDR、EDwP等二次计算复杂度O(n^2)缺乏稳健性 会受到非…

紫光同创FPGA图像视频采集系统,基于OV7725实现,提供工程源码和技术支持

目录 1、前言免责声明 2、设计思路框架视频源选择OV7725摄像头配置及采集动态彩条HDMA图像缓存输入输出视频HDMA缓冲FIFOHDMA控制模块HDMI输出 3、PDS工程详解4、上板调试验证并演示准备工作静态演示动态演示 5、福利&#xff1a;工程源码获取 紫光同创FPGA图像视频采集系统&am…

Linux 网络编程

套接字&#xff08;Socket&#xff09;&#xff1a; 通过网络实现跨机通信 作用&#xff1a;一种文件描述符传输层的文件描述符 整个编程中&#xff0c;需要着重注意htonl/htons、ntohl/ntohs、inet_addr等 TCP的C/S实现 循环服务器模型 TCP服务器实现过程 1.创建套接字&a…

Docker安装MS SQL Server并使用Navicat远程连接

思维导航 MS SQL Server简介 Microsoft SQL Server(简称SQL Server)是由微软公司开发的关系数据库管理系统,它是一个功能强大、性能卓越的企业级数据库平台,用于存储和处理大型数据集、支持高效查询和分析等操作。SQL Server 支持广泛的应用程序开发接口(API),包括 T-S…

大规模语言模型--中文 LLaMA和Alpaca

中文LLaMA 尽管 LLaMA 和 Alpaca 在 NLP 领域取得了重大进展&#xff0c; 它们在处理中文语言任务时&#xff0c; 仍存在一些局限性。这 些原始模型在字典中仅包含数百个中文 tokens (可以理解为单词)&#xff0c;导致编码和解码中文文本的效率受到了很大 影响。 之前已经对…