SpringCloud组件——Eureka

一.背景

1.问题提出

我们在一个父项目下写了两个子项目,需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源,具体实现的方法有很多,可以用HttpURLConnectionHttpClientOkhttpRestTemplate等。

举个例子,我们想要通过订单表中的商品Id来查询商品的详细信息,我们需要向商品所在的模块发送HTTP请求,通过请求获取商品的详细信息:

@Resource
RestTemplate restTemplate;@RequestMapping("/{orderId}")
public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId){OrderInfo orderInfo = orderMapper.selectByOrderId(orderId);String url="http://127.0.0.1:9090/product/"+orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;
}

上面的实现有一个问题:如果机器发生变故,url会跟着变更。url变来变去,我们写的代码就要进行修改,因此我们要想办法解决这个问题。

2.解决思路

注册中心可以解决这个问题。

服务启动或变更的时候,向注册中心报道,注册中心就存储着应用和IP的关系。

当我们想要调用方法的时候,只需要向注册中心去获取服务方的IP就行了。

那什么是注册中心?

注册中心(Service Registry) 是分布式系统(尤其是微服务架构)中的核心组件,主要用于解决服务实例的 自动发现、动态管理和路由调度 问题。它就像一个 “电话簿”,记录着所有服务实例的网络地址(IP、端口等信息),并实时更新这些信息,确保服务之间可以快速、可靠地通信。

注册中心有三种角色:服务提供者(Server)服务消费者(Client)服务注册中心(Registry)

它们之间的关系可以通过两个概念来描述:

服务注册服务提供者在启动的时候向服务注册中心(Registry)注册自身服务,并向服务注册中心(Registry)定期发送心跳汇报存好情况。

服务发现服务消费者注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。

3.CAP理论

Consistency,一致性:这里的一致性指的是强一致性,所有结点在同一时间具有相同的数据;

Availability,可用性:保证每个请求都有响应;

Partition Tolerance,分区容错性:分布式系统中的节点之间出现网络分区(即部分节点无法通信)时,系统仍能继续运行。

这个CAP是一个“不可能三角”,即这三个要求不能同时实现,要想实现CA就不能实现P,要实现AP就不能实现C。

在微服务系统中,P这一点是必须保证的,所有A和C只能实现一个。

二.Eureka

Eureka(尤里卡)曾是SpringCloud官方默认的注册中心,其符合CAP理论中的AP,即保证分布式系统的可用性。

1.搭建服务中心

1)创建项目;

2)pom加入Eureka的依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

3)配置文件,加入相关配置:

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/
logging:pattern:console: '%d{MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'

4)启动类,开启Eureka的功能:

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class,args);}
}

此时我们启动项目,在浏览器上输入:127.0.0.1:10010,如果出现以下页面说明成功了:

2.服务注册

1)加入Eureka依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2)修改配置信息:

配置服务的名称和eureka地址

spring:application:name: product-service
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka

3)启动程序

启动程序后出现下面的界面说明注册成功了:

注意红线圈出的部分,这个Application的名字与刚刚配置的名字是一样的:product-service。

3.服务发现

1)加入Eureka依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2)修改配置信息:

spring:application:name: order-service
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka

3)修改远程调用的代码

修改本篇文章一开始提出的问题代码:

@Resource
RestTemplate restTemplate;@Resource
DiscoveryClient discoveryClient;@RequestMapping("/{orderId}")
public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId){OrderInfo orderInfo = orderMapper.selectByOrderId(orderId);//从eureka中获取服务列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");//写法一:EurekaServiceInstance instance=(EurekaServiceInstance)instances.get(0);String url=instance.getUri()+"/product/"+orderInfo.getProductId();//写法二://String uri = instances.get(0).getUri().toString();//String url=uri+"/product/"+orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;
}

两种写法都可以。 

4)启动程序

如果出现下面界面就说明成功了:

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

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

相关文章

EAL4+与等保2.0:解读中国网络安全双标准

EAL4与等保2.0&#xff1a;解读中国网络安全双标准 在当今数字化时代&#xff0c;网络安全已成为各个行业不可忽视的重要议题。特别是在金融、政府、医疗等领域&#xff0c;保护信息的安全性和隐私性显得尤为关键。在中国&#xff0c;EAL4和等级保护2.0&#xff08;简称“等保…

FFmpeg+Nginx+VLC打造M3U8直播

一、视频直播的技术原理和架构方案 直播模型一般包括三个模块&#xff1a;主播方、服务器端和播放端 主播放创造视频&#xff0c;加美颜、水印、特效、采集后推送给直播服务器 播放端&#xff1a; 直播服务器端&#xff1a;收集主播端的视频推流&#xff0c;将其放大后推送给…

【Redis】缓存三剑客问题实践(上)

本篇对缓存三剑客问题进行介绍和解决方案说明&#xff0c;下篇将进行实践&#xff0c;有需要的同学可以跳转下篇查看实践篇&#xff1a;&#xff08;待发布&#xff09; 缓存三剑客是什么&#xff1f; 缓存三剑客指的是在分布式系统下使用缓存技术最常见的三类典型问题。它们分…

Flink 2.0 编译

文章目录 Flink 2.0 编译第一个问题 java 版本太低maven 版本太低maven 版本太高开始编译扩展多版本jdk 配置 Flink 2.0 编译 看到Flink2.0 出来了&#xff0c;想去玩玩&#xff0c;看看怎么样&#xff0c;当然第一件事&#xff0c;就是编译代码&#xff0c;但是没想到这么多问…

获取印度股票市场列表、查询IPO信息以及通过WebSocket实时接收数据

为了对接印度股票市场&#xff0c;获取市场列表、查询IPO信息、查看涨跌排行榜以及通过WebSocket实时接收数据等步骤。 1. 获取市场列表 首先&#xff0c;您需要获取支持的市场列表&#xff0c;这有助于了解哪些市场可以交易或监控。 请求方法&#xff1a;GETURL&#xff1a…

云原生--CNCF-1-云原生计算基金会介绍(云原生生态的发展目标和未来)

1、CNCF定义与背景 云原生计算基金会&#xff08;Cloud Native Computing Foundation&#xff0c;CNCF&#xff09;是由Linux基金会于2015年12月发起成立的非营利组织&#xff0c;旨在推动云原生技术的标准化、开源生态建设和行业协作。其核心目标是通过开源项目和社区协作&am…

【Rust 精进之路之第5篇-数据基石·下】复合类型:元组 (Tuple) 与数组 (Array) 的定长世界

系列&#xff1a; Rust 精进之路&#xff1a;构建可靠、高效软件的底层逻辑 作者&#xff1a; 码觉客 发布日期&#xff1a; 2025-04-20 引言&#xff1a;从原子到分子——组合的力量 在上一篇【数据基石上】中&#xff0c;我们仔细研究了 Rust 的四种基本标量类型&#xff1…

MongoDB 集合名称映射问题

项目场景 在使用 Spring Data MongoDB 进行开发时&#xff0c;定义了一个名为 CompetitionSignUpLog 的实体类&#xff0c;并创建了对应的 Repository 接口。需要明确该实体类在 MongoDB 中实际对应的集合名称是 CompetitionSignUpLog 还是 competitionSignUpLog。 问题描述 …

物联网 (IoT) 安全简介

什么是物联网安全&#xff1f; 物联网安全是网络安全的一个分支领域&#xff0c;专注于保护、监控和修复与物联网&#xff08;IoT&#xff09;相关的威胁。物联网是指由配备传感器、软件或其他技术的互联设备组成的网络&#xff0c;这些设备能够通过互联网收集、存储和共享数据…

PCB原理图解析(炸鸡派为例)

晶振 这是外部晶振的原理图。 32.768kHz 的晶振&#xff0c;常用于实时时钟&#xff08;RTC&#xff09;电路&#xff0c;因为它的频率恰好是一天的分数&#xff08;32768 秒&#xff09;&#xff0c;便于实现秒计数。 C25 和 C24&#xff1a;两个 12pF 的电容&#xff0c;用于…

Jupyter Notebook 中切换/使用 conda 虚拟环境的方式(解决jupyter notebook 环境默认在base下面的问题)

使用 nb_conda_kernels 添加所有环境 一键添加所有 conda 环境 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda in…

【JAVA】十三、基础知识“接口”精细讲解!(二)(新手友好版~)

哈喽大家好呀qvq&#xff0c;这里是乎里陈&#xff0c;接口这一知识点博主分为三篇博客为大家进行讲解&#xff0c;今天为大家讲解第二篇java中实现多个接口&#xff0c;接口间的继承&#xff0c;抽象类和接口的区别知识点&#xff0c;更适合新手宝宝们阅读~更多内容持续更新中…

基于MuJoCo物理引擎的机器人学习仿真框架robosuite

Robosuite 基于 MuJoCo 物理引擎&#xff0c;能支持多种机器人模型&#xff0c;提供丰富多样的任务场景&#xff0c;像基础的抓取、推物&#xff0c;精细的开门、拧瓶盖等操作。它可灵活配置多种传感器&#xff0c;提供本体、视觉、力 / 触觉等感知数据。因其对强化学习友好&am…

企业微信自建应用开发回调事件实现方案

目录 1. 前言 2. 正文 2.1 技术方案 2.2 策略上下文 2.2 添加客户策略实现类 2.3 修改客户信息策略实现类 2.4 默认策略实现类 2.5 接收事件的实体类&#xff08;可以根据事件格式的参数做修改&#xff09; 2.6 实际接收回调结果的接口 近日在开发企业微信的自建应用时…

Linux将多个块设备挂载到一个挂载点

在 Linux 系统中&#xff0c;直接将多个块设备挂载到同一个挂载点是不可能的。这是因为 Linux 的文件系统挂载机制设计为一个挂载点一次只能关联一个文件系统。如果尝试将多个块设备挂载到同一个挂载点&#xff0c;后一次挂载会覆盖前一次的挂载&#xff0c;导致只有最后挂载的…

Spark-SQL(四)

本节课学习了spark连接hive数据&#xff0c;在 spark-shell 中&#xff0c;可以看到连接成功 将依赖放进pom.xml中 运行代码 创建文件夹 spark-warehouse 为了使在 node01:50070 中查看到数据库&#xff0c;需要添加如下代码&#xff0c;就可以看到新创建的数据库 spark-sql_1…

野外价值观:在真实世界的语言模型互动中发现并分析价值观

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

el-select+vue-virtual-scroller解决数据量大卡顿问题

解决el-select中数据量过大时&#xff0c;显示及搜索卡顿问题&#xff0c;及正确的回显默认选中数据 粗略的封装了组件&#xff0c;有需要各种属性自定义的&#xff0c;自己添加设置下 环境 node 16.20.1 npm 8.19.4 vue2、element-ui "vue-virtual-scroller"…

Sqlite3交叉编译全过程

Sqlite3交叉编译全过程 一、概述二、下载三、解压四、配置五、编译六、安装七、验证文件类型八、移植8.1、头文件sqlite3.h8.2、动态链接库移植8.3、静态态链接库移植 九、验证使用9.1. 关键函数说明 十、触发器使用十一、sqlite表清空且恢复id值十二、全文总结 一、概述 SQLi…

软考软件设计师考试情况与大纲概述

文章目录 **一、考试科目与形式****二、考试大纲与核心知识点****科目1&#xff1a;计算机与软件工程知识****科目2&#xff1a;软件设计** **三、备考建议****四、参考资料** 这是一个系列文章的开篇 本文对2025年软考软件设计师考试的大纲及核心内容进行了整理&#xff0c;并…