【SpringCloud组件——Eureka】
前置准备:
分别提供订单系统(OrderService)和用户系统(UserService)。订单系统主要负责订单相关信息的处理,用户系统主要负责用户相关信息的处理。
一、微服务当中的提供者和消费者
1.1、概念
服务提供者:
一次业务中,被其它微服务调用的服务。(提供接口给其他微服务)
服务消费者:
一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
思考:服务A调用服务B,服务B又调用服务C,那么服务B是什么角色?
A调用B时,B是提供者;B调用C时,B又是消费者。这就说明,B的角色是相对的,即相对谁而言决定B的角色。在这个案例当中,B既是消费者又是提供者。
1.2、案例讲解
访问订单系统,查询订单编号为XXX的订单,并返回订单当中的用户信息。我们知道每张订单都会记录该订单支付者的信息,一般是支付者账号信息。根据该信息调用用户系统当中的根据账户查询用户的接口即可。
1.2.1、订单系统:
①、订单查询接口
@RestController
@RequestMapping("order")
public class OrderController {@Autowiredprivate OrderService orderService;@GetMapping("{orderId}")public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {// 根据id查询订单并返回return orderService.queryOrderById(orderId);}
}
②、生成远程调用实例对象
//在SpringBoot启动类当中添加如下代码@Bean@LoadBalanced//负载均衡public RestTemplate restTemplatest(){return new RestTemplate();}
③、订单查询服务实现类
@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById2(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);//2.利用RestTemplate发送http请求,查询用户//2.1、url路径String url = "http://localhost:8088/user/" + order.getUserId();//2.2、发送http请求,实现远程调用User user = restTemplate.getForObject(url, User.class);//3.封装user到orderorder.setUser(user);// 4.返回return order;}
1.2.2、用户系统:
①、用户查询接口
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User queryById(@PathVariable("id") Long id) {return userService.queryById(id);}}
②、用户查询实现类
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User queryById(Long id) {return userMapper.findById(id);}
}
二、Eureka注册中心
我们先分析上述代码远程调用的弊端:
①、userService服务为了应对高并发,可能存在多个实例
②、userService服务可能有不同的环境配置,例如开发环境端口为8088,测试环境为8089等
③、在多实例情况下,orderService如何选择userService?
④、在多实例情况下,orderService如何知道选择的实例的健康状态?
这些弊端就足以说明我们上述硬编码方式的弊端了-》不够灵活。
2.1、Eureka的作用

当user-service:8081、user-service:8082、user-service:8083启动时会向Eureka注册中心进行登记,Eureka则会记录该服务的这些信息,同理,order-Service也会注册到Eureka当中,当orderService需要远程调用userService时,此时就会向Eureka获取该服务的注册列表,拿到注册列表后根据负载均衡原理挑选出一个服务实例进行调用。还有一个问题没有解决,Eureka如何知道某服务实例的健康状态呢?当服务实例注册到Eureka之后,会每隔30s向Eureka发送一个心跳续约,告知Eureka本实例的状态,当不发送时,Eureka则认为该实例挂掉了,则会从服务列表剔除该实例,下次当消费者再次获取实例列表时将不再推送该实例信息。智能吧?在Nacos面前这就是弟弟~
总结:
![]()
2.2、搭建Eureka注册中心
2.2.1、创建独立的服务
2.2.2、导入依赖
<dependency><groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.2.3、启动类添加注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class,args);}
}
2.2.4、编写配置文件
server:port: 10086 #服务端口
spring:application:name: eurekaserver #服务名称
eureka:client:service-url: #eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka
2.3、 服务注册
2.3.1、在微服务模块导入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.3.2、在微服务配置文件添加配置
spring:application:name: XXXXservice
eureka:client:service-url: #eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka
2.4、 基于Eureka远程调用
2.3完成了服务注册,下面进行后续的步骤:
2.4.1、服务列表拉取
修改访问的url路径,用服务名代替ip、端口:
String url = "http://userservice/user/" + order.getUserId();
当我们启动多个实例后 ,获取到的访问地址是该服务的实例列表,经过负载均衡算法处理过后会得到准确的访问地址。
2.4.2、做负载均衡
@Bean@LoadBalanced//负载均衡public RestTemplate restTemplatest(){return new RestTemplate();}
相关文章:
【SpringCloud组件——Eureka】
前置准备: 分别提供订单系统(OrderService)和用户系统(UserService)。订单系统主要负责订单相关信息的处理,用户系统主要负责用户相关信息的处理。 一、微服务当中的提供者和消费者 1.1、概念 服务提供…...
JVM面试题(一)
JVM内存分哪几个区,每个区的作用是什么? java虚拟机主要分为以下几个区: JVM中方法区和堆空间是线程共享的,而虚拟机栈、本地方法栈、程序计数器是线程独享的。 (1)方法区: a. 有时候也成为永久代,在该区内…...
c# 无损压缩照片大小,并且设计了界面,添加了外部Ookii.Dialogs.dll,不一样的选择文件夹界面,并且可以把外部dll打包进exe中
c# 无损压缩照片大小,并且设计了界面,添加了外部Ookii.Dialogs.dll,不一样的选择文件夹界面,并且可以把外部dll打包进exe中 using System; using System.Collections; using System.Collections.Generic; using System.ComponentM…...
《统计学习方法》——隐马尔可夫模型(上)
引言 这是《统计学习方法》第二版的读书笔记,由于包含书上所有公式的推导和大量的图示,因此文章较长,正文分成三篇,以及课后习题解答,在习题解答中用Numpy实现了维特比算法和前向后向算法。 《统计学习方法》——隐马…...
ElasticSearch删除索引【真实案例】
文章目录 背景分析解决遇到的问题 - 删除超时报错信息解决办法1:调大超时时间解决办法2:调大ES堆内存参考背景 项目中使用了ELK技术栈实现了日志管理,但是日志管理功能目前并没有在生产上实际使用。 但ELK程序依然在运行,导致系统磁盘发生告警,剩余可用磁盘不足10%。 所以…...
基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集设计(三)连续多段触发存储及传输逻辑设计
本章将完成数据速率为 80MHz 、位宽为 12bits 的 80 路并行采样数据的连续多 段触发存储。首先,给出数据触发存储的整体框架及功能模块划分。然后,简介 MIG 用户接口、设置及读写时序。最后,进行数据跨时钟域模块设计,内存…...
对 Iterator, Generator 的理解?
Iterator Iterator是最简单最好理解的。 简单的说,我们常用的 for of 循环,都是通过调用被循环对象的一个特殊函数 Iterator 来实现的,但是以前这个函数是隐藏的我们无法访问, 从 Symbol 引入之后,我们就可以通过 Sy…...
C++基础
文章目录 C命名空间定义命名空间using指令不连续的命名空间嵌套的命名空间 面向对象类类成员的访问权限及类的封装对象类成员函数类访问修饰符构造函数和析构函数类的构造函数带参数的构造函数使用初始化列表来初始化字段类的析构函数拷贝构造函数 友元函数内联函数this指针指向…...
软件测试全流程
软件测试全流程 一、制定测试策略二、制定测试方案三、编辑测试用例四、执行测试用例五、输出问题单六、回归测试七、测试文件归档 一、制定测试策略 1、测试目的测试范围 2、用什么测试方法工具(例如功能测试用黑盒测试) 3、测试优先级(功能…...
【软件测试】支付模块测试攻略,这些测试方法和注意事项你掌握了么?
对于大部分人而言,支付模块或许是日常生活中最为关注和使用的功能之一,因此,对于支付模块的质量控制也显得尤为重要。 但考虑到支付涉及到金钱流转等敏感信息,一旦出现问题可能带来非常严重后果。因此,在支付模块测试…...
刷完这个笔记,17K不能再少了....
大家好,最近有不少小伙伴在后台留言,得准备面试了,又不知道从何下手!为了帮大家节约时间,特意准备了一份面试相关的资料,内容非常的全面,真的可以好好补一补,希望大家在都能拿到理想…...
知识变现创业指南-《知识变现秘籍》
《知识变现秘籍》 知识变现创业者指南 读完将改变你的认知 开阔你的知识变现思路 系统掌握知识变现的要点 知识付费创业方法 帮你利用知识赚到你弟一桶金 如果你有一技之长,想变现 如果你有一身才华,想变现 如果你在某个领域有绝活 如果你是&am…...
springboot+java博物馆文物管理系统
用户前台进入系统可以进行首页、文物信息、论坛交流、文物资讯、留言反馈、我的、跳转到后台等springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最…...
Ansible 自动化运维工具(二)——Ansible 的脚本(playbook 剧本)
Ansible 自动化运维工具—Ansible 的脚本playbook 剧本 playbooks 概述以及实例操作playbooks 的组成操作示例一:编写yaml文件也就是playbook修改配置文件并放入/opt/目录下运行playbook 操作实例二:定义、引用变量操作示例三:指定远程主机su…...
阿里云镜像服务下载并安装Go环境
【阿里云镜像】下载并安装Go环境 一、参考链接 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) golang镜像-golang下载地址-golang安装教程-阿里巴巴开源镜像站 (aliyun.com) GO语言安装以及国内镜像 - DbWong_0918 - 博客园 (cnblogs.com) 二、Go介绍 Gol…...
工作线程快速优雅退出方式探讨
本文我们不用定时器。定时器会阻塞消息循环。先看需求: 我们先看第一种,有一个任务,要求每1秒钟执行一次,最常见的写法如下两种 bool bExitThread false; DWORD WorkThread1(LPVOID param) {while (false bExitThread){//// to…...
甘特图控件DHTMLX Gantt教程:用PHP:Laravel实现Gantt(上)
DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术&am…...
ffmpeg-命令大全03
ffplay/mpv 查看所有的解码器 ffplay -decoders >>decoders.txt ffplay无延时无缓存播放 ffplay -fflags nobuffer -i "%1" ffplay指定size播放 ffplay -x 480 -y 270 -i "%1" ffplay指定解码器 ffplay -vcodec hevc_cuvid "%1" […...
MATLAB中太赫兹时域光谱的最大似然参数估计
目录 一、引言 二、最大似然估计的基本原理 三、MATLAB中的最大似然估计实现 四、太赫兹时域光谱的最大似然参数估计 五、结论 六、参考文献 一、引言 太赫兹波(Terahertz wave)是电磁谱中介于微波与光波之间的一段频率范围,频率大约在…...
详解MySQL的并发控制
目录 1.概述 2.事务 2.1.什么是事务 2.2.事务的隔离级别 2.2.1.三种数据一致性问题 2.2.2.四种隔离级别 2.3.如何设置隔离级别 3.锁 3.1.锁与事务的关系 3.2.分类 3.3.表锁 3.3.1.概述 3.3.2.读锁 3.3.3.写锁 3.3.4.保护机制 3.4.行锁 3.4.1.概述 3.4.2.什么…...
Qwen3-0.6B-FP8对比实测:轻量级模型部署体验,vLLM+Chainlit方案真香
Qwen3-0.6B-FP8对比实测:轻量级模型部署体验,vLLMChainlit方案真香 1. 轻量级模型部署新选择 在AI应用快速落地的今天,如何在有限的计算资源上高效部署语言模型成为开发者面临的核心挑战。传统大模型动辄数十GB的显存需求让许多中小企业和个…...
基于GTE-Base-ZH的长短期记忆(LSTM)文本分类模型优化
基于GTE-Base-ZH的长短期记忆(LSTM)文本分类模型优化 最近在做一个文本分类的项目,试了各种方法,发现一个挺有意思的思路。直接用大模型吧,效果好是好,但推理起来慢,成本也高;用传统…...
【GD32开发】深入解析GD32F103 TIMER0 PWM死区时间配置与优化
1. PWM死区时间基础概念与GD32特性 PWM死区时间是电机控制和电源转换系统中的关键参数。简单来说,它就是在互补PWM信号切换时插入的一个短暂延迟,防止上下桥臂同时导通造成短路。想象一下十字路口的红绿灯切换时,会设置几秒的全红灯时间避免车…...
影刀RPA实战:Chrome多用户环境批量管理与自动化登录
1. 为什么需要Chrome多用户环境 做过电商运营的朋友都知道,管理多个平台账号是件特别头疼的事。我去年帮一个做跨境电商的客户优化流程,他们每天要登录十几个亚马逊、eBay账号,手动切换不仅效率低,还经常因为cookie冲突导致账号异…...
C#索引器练习题
索引器是一种特殊的属性,允许类或结构的实例像数组一样通过索引进行访问。它提供了使用 [] 运算符访问对象中元素集合的便捷方式。一、考察索引器的定义与使用 难度:⭐定义一个 StudentClass 班级类,该类中包含一个集合用于存储学生姓名。…...
【国家级AI安全合规指南】:基于GB/T 44503-2024标准的6层对齐验证体系实战拆解
第一章:大模型工程化安全与对齐策略的顶层范式演进 2026奇点智能技术大会(https://ml-summit.org) 大模型工程化已从单点能力验证阶段,跃迁至以系统性安全治理与价值对齐为内核的范式重构期。这一演进并非技术栈的线性叠加,而是安全目标、对…...
2026届最火的六大降AI率方案横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网于近期推出的AIGC检测服务,其目的在于识别学术文本里由人工智能生成的内容&a…...
单亲宝爸带6岁“小魔王”累到崩溃,幸好有蕙兰瑜伽……
每天被儿子折腾到筋疲力尽,直到我遇见了蕙兰瑜伽“爸爸,我们来打仗吧!”儿子举着玩具剑,眼睛里闪着兴奋的光。“宝贝,让爸爸休息五分钟……”我瘫在沙发上,连抬手的力气都没有。这是我和6岁儿子的日常。我是…...
Phi-4-mini-reasoning实操手册:WebShell日志分析技巧与常见报错解决方案
Phi-4-mini-reasoning实操手册:WebShell日志分析技巧与常见报错解决方案 1. 模型简介与部署验证 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员,它特别强化…...
Android权限延时动态声明机制和可行的解决方案
Android权限延时动态声明机制和可行的解决方案核心结论Android系统权限无法真正做到"运行时动态声明",但可以通过以下方案实现类似效果:方案一:动态功能模块(官方推荐)原理说明┌─────────────…...
