当前位置: 首页 > news >正文

04-详解Eureka注册中心的作用,具体配置,服务注册和服务发现

Eureka注册中心的作用

Eureka架构

远程调用的两个问题

  • 服务的ip地址和端口号写死: 生产环境中服务的地址可能会随时发生变化,如果写死每次都需要重新修改代码
  • 多实例问题: 在高并发的情况下一个服务可以有多个实例形成一个集群,此时如果采用硬编码的方式只能访问服务的一个实例地址

在Eureka架构中,微服务角色分为EurekaServer和EurekaClient两类

  • EurekaServer(服务端): 可以记录服务的注册信息(包含服务名称及其相关实例地址), 对所有的服务心跳监控
  • EurekaClient(客户端): Provider(服务提供者)和consumer(服务消费者)
    在这里插入图片描述

服务提供者与消费者

在服务调用关系中包含服务的提供者和服务的消费者,这两种角色的定义并不是绝对的,因为在不同业务中有些服务既可以是服务提供者也可以是服务消费者

  • 服务提供者:一次业务中被其他微服务调用的服务(暴露接口给其他微服务)
  • 服务消费者:一次业务中调用其他微服务的服务(调用其他微服务提供的接口)

服务消费者在发起远程调用的时候,确定服务提供者实例的ip地址和端口号的过程,注意服务消费者也需要把自己注册到Eureka服务端后才能使用其提供的服务

  • 第一步服务注册: 服务提供者实例启动后会将自己的信息注册到eureka-server(Eureka服务端)
  • 第二步服务映射:Eureka服务端将所有服务提供的名称和其对应的服务实例地址的映射关系保存到Map集合当中
  • 第三步服务发现: 服务消费者根据服务提供者的名称从eureka中拉取对应信息,一个服务可能有多个服务提供者所以最终会得到一个服务实例地址列表
  • 第四步负载均衡: 服务消费者从实例地址列表中利用负载均衡算法选中一个实例地址并发起远程调用

服务消费者如何感知服务提供者健康状态即判断服务提供者是否宕机

  • 第一步: 服务提供者会每隔一段时间(默认30秒)向EurekaServer服务端发送心跳请求用来报告自己的健康状态
  • 第二步:eureka通过检查心跳请求更新服务提供者的列表信息, 发现心跳不正常就从服务列表中剔除, 这样服务消费者就可以拉取到服务提供者最新的信息

配置Eureka注册中心

搭建注册中心(EurekaServer)

第一步创建子模块: 在父工程cloud-demo中创建子模块eureka-server,然后引入SpringCloud为Eureka提供的starter服务端依赖

<!--eureka服务端依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

第二步编写启动类: 在eureka-server模块中编写一个启动类并添加@EnableEurekaServer注解,这样eureka-server服务就具有了作为注册的中心功能

  • 所有的微服务包括eureka-server服务自己都会去注册中心注册自己的信息(包含服务的名称及其相关实例地址)
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class);}
}

第三步编写配置文件: 在eureka-server服务中将它自己的服务名称和相关的实例地址信息注册到eureka-server服务上,便于和其他eureka集群之间的通信

server:port: 10086 # 服务端口
spring:application:name: eureka-server # eureka的服务名称
# eureka服务将自己的信息注册到Eureka服务端    
eureka:client:service-url: # eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka

第四步:启动微服务然后在浏览器访问http://localhost:10086/

在这里插入图片描述

服务注册

第一步引入依赖: 在user-service,order-service模块的pom.xml文件中引入Eureka的客户端依赖spring-cloud-starter-netflix-eureka-client

<!--eureka客户端依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

第二步服务注册: 在user-service,order-service模块的application.yml中配置自己的服务的名称eureka-server服务的地址信息

spring:application:name: userservice # 服务名称
# userservice服务将自己的信息注册到Eureka服务端      
eureka:client:service-url: # eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka       spring:application:name: orderservice # 服务名称
# orderservice将自己的信息注册到Eureka服务端    
eureka:client:service-url: # eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka

第三步模拟多实例部署: 在IDEA中复制一份user-service实例的配置重新设置Name同时配合VM选项修改端口号-Dserver.port=8082多次启动

在这里插入图片描述

第四步: 查看Eureka服务端注册的服务及其相关的所有实例

在这里插入图片描述

服务调用

服务发现

第一步引入依赖: 服务发现和服务注册统一都封装在Eureka的客户端依赖中,如果注册时已经引入了该依赖就不用重复引入了

<!--eureka客户端依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

第二步服务发现:只要orderservice服务注册到eureka-server服务中就可以拉取userservice服务的实例地址列表

  • orderservice模块的启动类中给注册的RestTemplate这个Bean上添加一个负载均衡的注解@LoadBalanced
  • order-service模块OrderService类中的queryOrderById方法中远程调用的访问路径中使用服务名(userservice)代替服务实例的ip和端口
  • Spring会自动帮我们从Eureka服务端根据userservice这个服务名称获取对应的实例地址列表,然后利用负载均衡算法选中一个实例地址并发起远程调用
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 2.调用userservice服务远程查询User,使用服务的名称代替服务的IP地址和端口//String url = "http://localhost:8081/user/" + order.getUserId();String url = "http://userservice/user/" + order.getUserId();User user = restTemplate.getForObject(url, User.class);// 3.存入查询到的user对象order.setUser(user);// 4.返回return order;
}

相关文章:

04-详解Eureka注册中心的作用,具体配置,服务注册和服务发现

Eureka注册中心的作用 Eureka架构 远程调用的两个问题 服务的ip地址和端口号写死: 生产环境中服务的地址可能会随时发生变化,如果写死每次都需要重新修改代码多实例问题: 在高并发的情况下一个服务可以有多个实例形成一个集群,此时如果采用硬编码的方式只能访问服务的一个实…...

数据分析基础之《matplotlib(3)—散点图》

一、常见图形种类及意义 1、matplotlib能够绘制折线图、散点图、柱状图、直方图、饼图。我们需要知道不同的统计图的意义&#xff0c;以此来决定选择哪种统计图来呈现我们的数据 2、折线图plot 说明&#xff1a;以折线的上升或下降来表示统计数量的增减变化的统计图 特点&…...

Flask 动态路由、请求数据接收、视图函数返回值详解

一、动态路由 在前面的博客中&#xff0c;我们学习了如何创建基本的 Flask 应用&#xff0c;并定义了一些简单的路由。但有时候&#xff0c;我们需要更加灵活的路由&#xff0c;能够根据用户请求的不同来动态生成响应。Flask 提供了动态路由的功能&#xff0c;使我们能够轻松处…...

Transformer 简介

Transformer 是 Google 在 2017 年底发表的论文 Attention Is All You Need 中所提出的 seq2seq 模型。Transformer 模型的核心是 Self-Attention 机制&#xff0c;能够处理输入序列中的每个元素&#xff0c;并能计算其与序列中其他元素的交互关系的方法&#xff0c;从而能够更…...

LLVM学习笔记(64)

4.4.3.3.3. 设置寄存器类对类型的行为 1679行调用computeRegisterProperties()来计算寄存器类的衍生属性。TargetLoweringBase的容器RegisterTypeForVT、RegClassForVT以及NumRegistersForVT用于记录原生支持每个ValueType目标机器寄存器类的信息&#xff0c;即类型对应的寄存…...

深度学习TensorFlow2基础知识学习前半部分

目录 测试TensorFlow是否支持GPU&#xff1a; 自动求导&#xff1a; 数据预处理 之 统一数组维度 定义变量和常量 训练模型的时候设备变量的设置 生成随机数据 交叉熵损失CE和均方误差函数MSE 全连接Dense层 维度变换reshape 增加或减小维度 数组合并 广播机制&#…...

Linux系统---简易伙伴系统

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、题目要求 1.采用C语言实现 2.伙伴系统采用free_area[11]数组来组织。要求伙伴内存最小为一个页面&#xff0c;页面大小为4KB…...

Redis使用Lua脚本

Lua脚本 redis可以支持lua脚本&#xff0c;可以使用lua脚本来将几个命令整合为一个整体来执行&#xff0c;这样可以使得多个命令原子操作&#xff0c;且可以减少网络开销 Lua的数据类型 Lua是一个动态类型的语言&#xff0c;一个变量可以存储任何类型的值&#xff0c;类型有&am…...

macos安装metal 加速版 pytorch

categories: [Python] tags: Python MacOS 写在前面 试试 m3 的 metal 加速效果如何 Mac computers with Apple silicon or AMD GPUsmacOS 12.3 or laterPython 3.7 or laterXcode command-line tools: xcode-select --install 安装 Python: conda-forge brew install minif…...

【学习笔记】lyndon分解

摘抄自quack的ppt。 这部分和 s a sa sa的关联比较大&#xff0c;可以加深对 s a sa sa的理解。 Part 1 如果字符串 s s s的字典序在 s s s以及 s s s的所有后缀中是最小的&#xff0c;则称 s s s是一个 lyndon \text{lyndon} lyndon串。 lyndon \text{lyndon} lyndon分解&a…...

21、命令执行

文章目录 一、命令执行概述1.1 基本定义1.2 原理1.3 两个条件1.4 命令执行漏洞产生的原因1.5 管道符号和通用命令符 二、远程命令执行2.1 远程命令执行相关函数2.2 远程命令执行漏洞的利用 三、系统命令执行3.1 相关函数3.2 系统命令执行漏洞利用 四、命令执行漏洞防御 一、命令…...

Qexo博客后台管理部署

Qexo博客后台管理部署 个人主页 个人博客 参考文档 https://www.oplog.cn/qexo/本地部署 采用本地Docker部署管理本地Hexo 下载代码包 若无法下载使用科学工具下载到本地在上传到服务器 wget https://github.com/Qexo/Qexo/archive/refs/tags/3.0.1.zip# 解压 unzip Qexo…...

最小生成树prim

最小生成树&#xff08;三&#xff09;Prim算法及存储结构_哔哩哔哩_bilibili⁤ 311 最小生成树 Prim 算法_哔哩哔哩_bilibili #include <iostream> #include <queue> #include <string> #include <stack> #include <vector> #include <set…...

实用篇 | 一文学会人工智能中API的Flask编写(内含模板)

----------------------- &#x1f388;API 相关直达 &#x1f388;-------------------------- &#x1f680;Gradio: 实用篇 | 关于Gradio快速构建人工智能模型实现界面&#xff0c;你想知道的都在这里-CSDN博客 &#x1f680;Streamlit :实用篇 | 一文快速构建人工智能前端展…...

Si24R03—低功耗 SOC 芯片(集成RISC-V内核+2.4GHz无线收发器)

Si24R03是一款高度集成的低功耗SOC芯片&#xff0c;其集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC等丰…...

C# Winform 日志系统

目录 一、效果 1.刷新日志效果 2.单独日志的分类 3.保存日志的样式 二、概述 三、日志系统API 1.字段 Debug.IsScrolling Debug.Version Debug.LogMaxLen Debug.LogTitle Debug.IsConsoleShowLog 2.方法 Debug.Log(string) Debug.Log(string, params object[]) …...

【Java 基础】27 XML 解析

文章目录 1.SAX 解析器1&#xff09;什么是 SAX2&#xff09;SAX 工作流程初始化实现事件处理类解析 3&#xff09;示例代码 2.DOM 解析器1&#xff09;什么是 DOM2&#xff09;DOM 工作流程初始化解析 XML 文档操作 DOM 树 3&#xff09;示例代码 总结 在项目开发中&#xff0…...

地图服务 ArcGIS API for JavaScript基础用法全解析

地图服务 ArcGIS API for JavaScript基础用法全解析 前言 在接触ArcGIS之前&#xff0c;开发web在线地图时用过Leaflet来构建地图应用&#xff0c;作为一个轻量级的开源js库&#xff0c;在我使用下来Leaflet还有易懂易用的API文档&#xff0c;是个很不错的选择。在接触使用Ar…...

docker学习(八、mysql8.2主从复制遇到的问题)

在我配置主从复制的时候&#xff0c;遇到了一直connecting的问题。 起初可能是我ip配置的不对&#xff0c;slave_io_running一直connecting。&#xff08;我的环境&#xff1a;windows中安装了wsl&#xff0c;是ubuntu环境的&#xff0c;在wsl中装了miniconda&#xff0c;mini…...

React-hook-form-mui(三):表单验证

前言 在上一篇文章中&#xff0c;我们介绍了react-hook-form-mui的基础用法。本文将着重讲解表单验证功能。 react-hook-form-mui提供了丰富的表单验证功能&#xff0c;可以通过validation属性来设置表单验证规则。本文将详细介绍validation的三种实现方法&#xff0c;以及如何…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

LTR-381RGB-01RGB+环境光检测应用场景及客户类型主要有哪些?

RGB环境光检测 功能&#xff0c;在应用场景及客户类型&#xff1a; 1. 可应用的儿童玩具类型 (1) 智能互动玩具 功能&#xff1a;通过检测环境光或物体颜色触发互动&#xff08;如颜色识别积木、光感音乐盒&#xff09;。 客户参考&#xff1a; LEGO&#xff08;乐高&#x…...