《从零开始:Spring Cloud Eureka 配置与服务注册全流程》
关于Eureka的学习,主要学习如何搭建Eureka,将order-service和product-service都注册到Eureka。
1.为什么使用Eureka?
我在实现一个查询订单功能时,希望可以根据订单中productId去获取对应商品的详细信息,但是产品服务和订单服务是分布式的,所以如果要实现根据订单中的productId去获取商品的详细信息,就需要在订单服务中远程调用产品服务,如下图
但是这样有一个问题,就是远程调用产品服务时,这里的ip和端口号是写死的,如果ip地址发生变化,我们就需要修改对应的代码,而Eureka就是用解决这个问题的。
2.注册中心
Eureka是作为一个注册中心来解决这个问题的,当产品服务发生变更重新启动时,会先先向Eureka打报告,然后Eureka去记录服务和对应IP的关系,此时订单服务如果想远程调用产品服务,此时产品服务会先去Eureka获取产品服务的IP,然后再根据从Eureka中获取的IP去远程调用产品服务。
2.1 什么是注册中心?
在Spring Cloud Eureka中,注册中心是服务发现的核心组件,负责管理微服务的注册和发现。
2.2 注册中心的三种角色
注册中心主要有3中角色,分别是服务提供者(Server),服务消费者(Client)和服务注册中心(Registry)。
服务提供者(Server):一次业务中,被其他微服务调用的服务,也就是给其他微服务提供接口的微服务,如上面提到的产品服务就是服务提供者
服务消费者(Client):一次业务中,调用其他微服务的微服务,也就是调用其他微服务提供的接口的微服务,如上面提到的订单服务就是服务消费者
服务注册中心(Registry) :用于保存Server的注册信息,当Server节点发生更改时,Registry会同步变更。服务与注册中心使用一定机制通信,如果注册中心与某服务长时间无法通信,就会注销该实例。
三者之间的关系和工作内容,可以用两个概念来解释。
服务注册:服务提供者在启动时,向注册中心注册自身服务,并向注册中心定期发送心跳汇报存活状态。
服务发现: 服务消费者1从注册中心查询服务提供者的IP地址,并通过该IP地址远程调用服务提供者的接口。服务发现的一个重要作用就是提供给服务者一个可用的服务列表。
如下图
2.3 CAP理论
谈到注册中心,就避不开CAP理论,CAP理论是分布式系统设计中最基础,也是最为关键的理论。
一致性:CAP理论中的一致性,这里指的是强一致性,强一致性的意思是所有节点的对外提供的数据都是一致的。
可用性:保证每个请求都能有响应,响应的数据有可能是旧的数据。
分区容错性: 当出现网络分区后后,系统任然能够对外提供服务。
网络分区是指在分布式系统中,由于网络故障,导致分布式系统中部分节点无法进行通信,形成多个独立的子网络(即分区)
CAP理论告诉我们:一个分布式系统不可能同时满足数据一致性,服务可用性和分区容错性这三个基本需求,最多只能同时满足其中两个。
在分布式系统中,由于网络状态是不可预测的,我们即使出现网络分区的情况,我们的系统任然能够对外提供服务,所以我们一定保证分区容错性。
正常情况下
网络出现异常:
而一致性和可用性只能满足一个。
如果想要保证各个节点数据的强一致性,由于数据的同步更新是有一定时间延迟的,那么此时该节点的服务一定是有一段时间是停止对外提供服务的。
如果想要保证可用性,由于数据的同步更新是有一定时间延迟的,那么此时一定有一段时间一些节点的数据是来不及更新的,如果此时请求发送到给数据还没有同步更新的节点,那么得到的响应就是一个旧的数据。
所以,我们只能实现AP架构或者CP架构
AP架构:为了保证分布式系统对外的数据一致性,于是选择不返回任何数据
AP架构:为了保证分布式系统的可用性,即使该节点数据还没有关系,依旧会返回一个响应,这个响应中的数据是一个旧的数据。
y3.搭建Eureka Server
Eureka Server可以是一个单独的工程,也可以是一个子工程,下面的搭建Eureka Server是以子工程的方式搭建的。
第一步,创建一个子工程
第二步,在eureka-server工程中的pom文件引入eureka-server的依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
第三步,在在eureka-server工程中的pom文件引入项目构建插件
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
第四步,完善启动类,注意在在启动类加上@EnableEurekaServer注解
第五步,在配置文件中添加一下配置信息
# Eureka相关配置
# Eureka 服务
server:port: 10010
spring:application:name: eureka-server
eureka:instance:hostname: localhostclient:fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为falseregister-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.service-url:# 设置Eureka Server的地址,查询服务和注册服务都需要依赖这个地址defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
第六步,启动服务
启动服务后,如果能通过127.0.0.1:10010访问,说明Eureka搭建成功了,如下图
4.服务注册
将product-service服务注册到eureka server中
第一步,在product-service的pom文件中引入下面的依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
第二步,完善product-service的配置文件
添加服务名称和eureka地址
#Eureka Client
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/
第三部,启动product-service服务,启动之后,刷新注册中心界面,会发现注册中心中注册了product-service服务
5.服务发现
接下来我们修改orders-service,在远程调用时,从eureka-server拉去product-service的服务信息,实现服务发现。
第一步,在orders-service工程的pom文件中引入下面的依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
第二步,完善orders-service的配置文件,添加服务名称和eureka地址
添加的eureka地址的配置文件,添加服务名称根据自己工程的名字自己去添加即可。
#Eureka Client
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/
第三步,实现订单服务远程调用产品服务,代码如下
修改原来的service层代码
如果要从Eureka中获取注册的服务列表,要用到一个spring中提供的DiscoveryClient,通过getInstances方法来获取服务列表,getInstances是通过服务的Id来Eureka中获取对应的服务列表,这里的id其实就是服务的名称。
由于是一个服务列表,我们要从服务列表中获取对应的服务,由于我在Eureka中注册的product-service服务只有一个,所以从服务列表中取第一个服务就行了。
@Slf4j
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;public OrderInfo selectByOrderId(Integer id){OrderInfo orderInfo = orderMapper.selectByOrderId(id);/*String url = "http://127.0.0.1:9090/product/"+orderInfo.getProductId();*///根据应用名从eureka中获取对应的服务列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");String uri = instances.get(0).getUri().toString();log.info("远程调用的uri:{}",uri);String url = uri+"/product/"+orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}}
第四步,运行订单服务,启动orders-service服务,此时刷新Eureka页面,发现Eureka中也成功注册orders-service服务
远程调用product-service也成功了
注意:校验时,eureka-server,product-service和order-service都要启动
相关文章:

《从零开始:Spring Cloud Eureka 配置与服务注册全流程》
关于Eureka的学习,主要学习如何搭建Eureka,将order-service和product-service都注册到Eureka。 1.为什么使用Eureka? 我在实现一个查询订单功能时,希望可以根据订单中productId去获取对应商品的详细信息,但是产品服务和订单服…...
如何保证RabbitMQ消息的顺序性?
保证RabbitMQ消息的顺序性是一个常见的需求,尤其是在处理需要严格顺序的消息时。然而,默认情况下,RabbitMQ不保证消息的全局顺序,因为消息可能会通过不同的路径(例如不同的网络连接或线程)到达队列…...

FPGA学习知识(汇总)
1. wire与reg理解,阻塞与非阻塞 2. 时序取值,时钟触发沿向左看 3. ip核/setup debug 添加 ila 一、ila使用小技巧 二、同步复位、异步复位和异步复位同步释放 设计复位设计,尽量使用 异步复位同步释放;尽管该方法仍然对毛刺敏感…...
c语言 写一个五子棋
c语言 IsWin判赢 display 画 10 x 10 的棋盘 判断落子的坐标是否已有棋子 判断落子坐标范围是否超出范围 // 五子棋 #include <stdio.h> #include <stdlib.h>// 画棋盘 10 x 10的棋盘,len为行数 void display(char map[][10], int len) {system(&q…...

Redisson分布式锁-锁的可重入、可重试、WatchDog超时续约、multLock联锁(一文全讲透,超详细!!!)
本文涉及到使用Redis实现基础分布式锁以及Lua脚本的内容,如有需要可以先参考博主的上一篇文章:Redis实现-优惠卷秒杀(基础版本) 一、功能介绍 (1)前面分布式锁存在的问题 在JDK当中就存在一种可重入锁ReentrantLock,可重入指的是在同一线…...
Python爬虫实战:研究源码还原技术,实现逆向解密
1. 引言 在网络爬虫技术实际应用中,目标网站常采用各种加密手段保护数据传输和业务逻辑。传统逆向解密方法依赖人工分析和调试,效率低下且易出错。随着 Web 应用复杂度提升,特别是 JavaScript 混淆技术广泛应用,传统方法面临更大挑战。 本文提出基于源码还原的逆向解密方法…...
WordPress Relevanssi插件时间型SQL注入漏洞(CVE-2025-4396)
免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…...
Adobe Illustrator学习备忘
1.移动画板:需按住空格键加鼠标一块才能拖动 2.放大缩小画板:按住Alt键加鼠标滚轮 3.撤回:CtrlZ 4.钢笔练习网站:The Bzier Game...
C#中的dynamic与var:看似相似却迥然不同
在C#编程的世界里,var和dynamic这两个关键字常常让初学者感到困惑。它们看起来都在定义变量时省略了显式类型声明,但实际上它们的工作方式和应用场景有着天壤之别。今天,让我们一起揭开这两个关键字的神秘面纱。 var:编译时的类型…...
求职困境:开发、AI、运维、自动化
文章目录 问:我的技术栈是web全栈(js,css,html,react,typscript),C开发,python开发,音视频图像开发,神经网络深度学习开发,运维&#…...

语言模型:AM-Thinking-v1 能和大参数语言模型媲美的 32B 单卡推理模型
介绍 a-m-team 是北科 (Ke.com) 的一个内部团队,致力于探索 AGI 技术。这是一个专注于增强推理能力的 32B 密集语言模型。 a-m-team / AM-Thinking-v1 是其旗下的一个语言模型,采用低成本的方式能实现和大参数模型媲美。 DeepSe…...

ChatGPT:OpenAI Codex—一款基于云的软件工程 AI 代理,赋能 ChatGPT,革新软件开发模式
ChatGPT:OpenAI Codex—一款基于云的软件工程 AI 代理,赋能 ChatGPT,革新软件开发模式 导读:2025年5月16日,OpenAI 发布了 Codex,一个基于云的软件工程 AI 代理,它集成在 ChatGPT 中,…...
docker compose up -d 是一个用于 通过 Docker Compose 在后台启动多容器应用 的命令
docker compose 表示调用 Docker Compose 工具,用于管理基于 YAML 文件定义的多容器应用。 up 核心指令,作用是根据 docker-compose.yml 文件中的配置,创建并启动所有定义的服务、网络、卷等资源。 如果容器未创建,会先构建镜像&…...

智能视觉检测技术:制造业质量管控的“隐形守护者”
在工业4.0浪潮的推动下,制造业正经历一场以智能化为核心的变革。传统人工质检模式因效率低、误差率高、成本高昂等问题,逐渐难以满足现代生产对高精度、高速度的需求。智能视觉检测技术作为人工智能与机器视觉融合的产物,正成为制造业质量管控…...

利用html制作简历网页和求职信息网页
前言 大家好,我是maybe。今天下午初步学习了html的基础知识。做了两个小网页,一个网页是简历网页,一个网页是求职信息填写网页。跟大家分享一波~ 说明:我不打算上传图片。所以如果有朋友按照我的代码运行网页,会出现一个没有图片…...
Problem E: List练习
1.题目描述 运用List完成下面的要求: 1) 创建一个List,在List中增加三个工人,基本信息如下: 姓名 年龄 工资 Tom 18 3000 Peter 25 3500 Mark 22 3200 2) 插入一个工人,信息为:姓名:Robert࿰…...

卷积神经网络进阶:转置卷积与棋盘效应详解
【内容摘要】 本文深入解析卷积神经网络中的转置卷积(反卷积)技术,重点阐述标准卷积与转置卷积的计算过程、转置卷积的上采样作用,以及其常见问题——棋盘效应的产生原因与解决方法,为图像分割、超分辨率等任务提供理论…...
用 Kotlin 脚本(KTS)重塑 Android 工程效能:2000 字终极实践指南
一、KTS 核心优势解码 1.1 类型安全革命 对比 Groovy 的动态类型缺陷,KTS 的静态类型系统能在 编译期拦截 90% 的配置错误: // Groovy 的危险操作(运行时才会报错) dependencies {implementation "com.squareup.retrofit:…...

2025年5月13日第一轮
1.百词斩 2.安全状态和死锁 3.银行家算法和状态图 4.Vue运行 5.英语听力 6.词汇 7.英语 长篇:数学竞赛 8.数学 间断点类型和数量 The rapid development of artificial intelligence has led to widerspareasd concreasns about job displacemant.As AI technology conti…...
HarmonyOs开发之———使用HTTP访问网络资源
谢谢关注!! 前言:上一篇文章主要介绍HarmonyOs开发之———Video组件的使用:HarmonyOs开发之———Video组件的使用_华为 video标签查看-CSDN博客 HarmonyOS 网络开发入门:使用 HTTP 访问网络资源 HarmonyOS 作为新一代智能终端…...

小结:Android系统架构
https://developer.android.com/topic/architecture?hlzh-cn Android系统的架构,分为四个主要层次:应用程序层、应用框架层、库和运行时层以及Linux内核层。: 1. 应用程序层(Applications) 功能:这一层包…...
单物理机上部署多个TaskManager与调优 Flink 集群
单物理机上如何高效部署与调优 Flink 集群 一、硬件环境概述 单物理机,4CPU,16G 内存,旨在充分利用硬件资源,部署 Apache Flink 集群,实现高效的分布式流处理任务。 二、Flink 集群配置 (一)配置文件说明 进入$FLINK_HOME/conf目录。备份原始配置文件:cp flink-con…...

基于C#的MQTT通信实战:从EMQX搭建到发布订阅全解析
MQTT(Message Queueing Telemetry Transport) 消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点。 它被设计用于低带宽,不稳定或高延迟的…...
VUE3_ref和useTemplateRef获取组件实例,ref获取dom对象
旧写法 ref的字符串需要跟js中ref定义的变量名称一样 类型丢失,无法获取到ref定义的title类型 <template><div><h1 ref"title">Hello Vue3.5</h1></div> </template><script setup>import { ref, onMounted } …...

ISP中拖影问题的处理
有时候会出现如下的阴影问题该如何处理呢?本文将提供几个思路。 1、降低曝光时间 如果曝光时间过大,会统计整个曝光时间内的图像信息,就会导致拖影的产生,这个时候可以考虑降低一下曝光时间。 2、时域降噪过大 只要明白时域降噪…...
C++.备考知识点
C++备考知识点 1. 循环结构与等差数列求和1.1 逐天累加实现方法1.2 等差数列求和公式优化2.1 数字转字符串方法2.2 首尾字符交换实现2.3 去除前导零技巧3.1 异或运算基本性质3.2 找出出现奇数次的数问题分析示例代码输出结果扩展应用4.1 字符位移量计算问题分析示例代码输出结果…...

SQLMesh 模型管理指南:从创建到验证的全流程解析
本文全面介绍SQLMesh这一现代化数据转换工具的核心功能,重点讲解模型创建、编辑、验证和删除的全生命周期管理方法。通过具体示例和最佳实践,帮助数据工程师掌握SQLMesh的高效工作流程,包括增量模型配置、变更影响评估、安全回滚机制等关键操…...

HarmonyOS AVPlayer 音频播放器
鸿蒙文档中心:使用AVPlayer播放视频(ArkTS)文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-playback 这张图描述的是 HarmonyOS AVPlayer 音频播放器的状态流转过程,展示了 AVPlayer 在不同状态之间的切换条件和关键操作…...

⭐️白嫖的阿里云认证⭐️ 第二弹【课时1:提示词(Prompt)技巧】for 「大模型Clouder认证:利用大模型提升内容生产能力」
「大模型Clouder认证:利用大模型提升内容生产能力」这个认证目前在阿里云认证中心还是免费的,简单几步就可以申请考试,有两次的免费考试机会。而且,这个课程中的内容对于所有普通用户来说都非常实用,课程整体长度也就3节课,非常快速就能学完。心动不如行动,赶紧开始吧!…...

Filament引擎(一) ——渲染框架设计
filament是谷歌开源的一个基于物理渲染(PBR)的轻量级、高性能的实时渲染框架,其框架架构设计并不复杂,后端RHI的设计也比较简单。重点其实在于项目中材质、光照模型背后的方程式和理论,以及对它们的实现。相关的信息,可以参考官方…...