Spring Cloud系列—Eureka服务注册/发现

上篇文章:

Spring Cloud系列—简介https://blog.csdn.net/sniper_fandc/article/details/149936339?fromshare=blogdetail&sharetype=blogdetail&sharerId=149936339&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

        在上篇文章中,代码有一些缺点:

        1.使用RestTemplate时候URL写死了,如果服务提供方修改ip,就需要改动代码。

        2.如果服务提供方多机部署,ip如何写。

        3.返回结果如何共用,不重复写代码,并且URL也容易写错,如何复用。

        4.服务提供方的接口实际上是开放的,存在一定风险,应该只对服务调用方开放。

        上述缺点可以使用服务注册/发现来解决:

1 服务注册/发现

        服务注册/发现包括三个角色:服务注册中心、服务消费者、服务提供者:

        服务注册中心:保存服务的注册信息(比如ip),服务节点变更会同步更新。使用相关通信机制保持和服务提供者之间的通信,如果服务提供者无法通信,就会注销服务实例。

        服务消费者:调用其它微服务接口的一方。

        服务提供者:被其它微服务调用接口的一方。

        服务发现是指服务消费者要调用服务提供方接口时,先去服务注册中心查询服务相关信息,比如地址等。

        服务注册是指服务提供方启动时主动向服务注册中心注册服务,并定期向注册中心发送心跳包,汇报自身存活状态。

2 CAP理论

        C:一致性(Consistency),指同一时间无论访问主节点还是从节点获得的数据是一致的(强一致性,弱一致性是主节点涉及修改后由于同步需要时间,因此存在一定时间的不一致)。

        A:可用性(Availability),指任何时候访问系统都有响应,无论响应的数据是否过时或错误。

        P:分区容错性(Partition Tolerance),指出现网络分区后(某节点故障),系统仍能提供服务。

        CAP理论是分布式系统最基础最关键的理论。但是一致性和可用性无法同时满足,因为要满足一致性,就需要数据同步时不能访问系统,这违背了可用性;如果要满足可用性,有可能访问过时数据(还未同步的从节点数据),这违背了一致性。因此C和A无法同时满足。

        P必须要满足,因此就出现了CP和CA两种组合,而常见的注册中心组件就是选择了两种组合中的一种:

Zookeeper

Eureka

Nacos

满足CP

满足CA

CP或CA(默认CA)

        实际上,为用户提供访问时,提供过时的数据胜过不提供响应。

3 Eureka

        Eureka分为Eureka Server和Eureka Client,Eureka Server供注册中心使用,Eureka Client供服务提供者使用。

3.1 搭建注册中心

        由于注册中心也相当于一个微服务,因此也需要创建一个项目并启动,这里还是采用父子项目的形式创建,仍然用前面创建的父项目:

        配置pom文件:

    <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

        由于这不需要进行SpringBoot Web开发,因此不需要SpringBoot Web相关依赖。配置SpringBoot配置文件:

server:port: 10010spring:application:name: eureka_servereureka: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/

        启动类:

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

        这里必须要加@EnableEurekaServer才能成功开启注册中心服务。运行代码结果如下(访问127.0.0.1:10010):

3.2 服务注册

        引入依赖:

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

        SpringBoot配置文件:

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

        启动项目,就可以发现该服务已经注册到Eureka中:

3.3 服务发现

        引入依赖:

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

        SpringBoot配置文件:

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

        修改远程调用代码:

@Servicepublic class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;public OrderInfo selectOrderById(Integer orderId) {OrderInfo orderInfo = orderMapper.selectOrderById(orderId);//旧方式//String url = "http://127.0.0.1:8081/product/" + orderInfo.getProductId();//ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);//新方式:通过注册中心进行服务发现List<ServiceInstance> productService = discoveryClient.getInstances("product-service");EurekaServiceInstance serviceInstance = (EurekaServiceInstance) productService.get(0);String url = serviceInstance.getUri() + "/product/" + orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}}

        运行代码,结果如下:

        可以发现,配置了注册中心后,关于服务之间的远程调用更加灵活方便。

4 Eureka与Zookeeper区别

        二者都是用于服务注册和服务发现的,但是也存在很大不同:

        1.Eureka是Netflix开源项目,Zookeeper是Apache开源项目。

        2.Eureka基于AP原则,保证高可用性;Zookeeper基于CP原则,保证数据一致性。

        3.集群环境下,Eureka每个节点地位均等;Zookeeper节点存在地位划分,主要是Leader、Follower或Observer,这就意味Leader节点故障需要进行重新选举Leader,存在一定时间的服务不可用。

下篇文章:

Spring Cloud系列—LoadBalance负载均衡https://blog.csdn.net/sniper_fandc/article/details/149938185?fromshare=blogdetail&sharetype=blogdetail&sharerId=149938185&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

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

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

相关文章

QUdpSocket 详解:从协议基础、通信模式、数据传输特点、应用场景、调用方式到实战应用全面解析

前言 在网络通信的世界里&#xff0c;UDP 协议以其独特的 “快准狠” 特性占据着一席之地。作为 Qt 框架中 UDP 协议的封装者&#xff0c;QUdpSocket 为开发者提供了便捷高效的网络编程接口。​ 一、UDP 协议基础&#xff1a;QUdpSocket 的 历史 要理解 QUdpSocket&#xff0c;…

vue中reactive()和ref()的用法

在 Vue 3 的 Composition API 里&#xff0c;reactive() 和 ref() 都是用来把「普通数据」变成「响应式数据」的函数。 一句话区别&#xff1a; reactive() 只能包裹对象/数组&#xff1b;ref() 可以包裹任何类型&#xff0c;但在 模板 里读取时&#xff0c;不需要 .value。 下…

【公考基础】----备考规划篇

公考 公考&#xff1a;国家公务员考试 即&#xff1a;国考和省考 或 参公考试 包括但不限于&#xff1a;国考、省考、事业单位招考、教师招聘考试、军队文职招考等&#xff0c;一切进入国家党政军事业单位的考试。 考公整体流程 备考前&#xff1a;准备备考资料&#xf…

STM32江科大学习笔记,全功能按键非阻塞式实现,按键点击,双击,长按

目录 一、前言 二、关于实现非阻塞的办法 2.1 中断类型的选择 2.2 定时器中断 二、程序流程图 2.1 状态S0空闲状态 2.2 状态S1按键判断长按还是其他的事件 2.3 状态S2按键判断双击或者单击 2.4 状态S3按键已双击状态 2.5 状态S4长按状态 三、编写代码 3.1 按键初始…

动态代理常用的两种方式?

口语化回答好的&#xff0c;面试官&#xff0c;动态常见的两种&#xff0c;一种是 jdk 动态代理&#xff0c;一种是 cglib 动态代理&#xff0c;两者的最主要区别是 jdk 动态代理主要是依赖于接口创建代理对象&#xff0c;cglib 是通过生成子类的方式&#xff0c;不需要接口&am…

StarRocks vs ClickHouse:2025 年 OLAP 引擎终极对比指南

StarRocks 与 ClickHouse&#xff1a;高性能 OLAP 引擎的两种选择在当今数据驱动的商业环境中&#xff0c;选择合适的分析型数据库对于企业数据战略至关重要。StarRocks 和 ClickHouse 作为两款领先的 OLAP&#xff08;在线分析处理&#xff09;引擎&#xff0c;各自拥有独特的…

RuoYi-Cloud 微服务本地部署详细流程实录(IDEA + 本地 Windows 环境)

本文以 RuoYi-Cloud 3.x 版本为例&#xff0c;开发工具用的是 IntelliJ IDEA&#xff0c;数据库为 MySQL 8.x&#xff0c;注册中心选用本地 Nacos 2.2.3&#xff0c;Redis 为 3.x/5.x 均可。亲测全流程可用&#xff0c;细节与官方文档略有不同&#xff0c;避免新手踩坑。 目录 …

2025年了,程序员转行还这么难?别愁!大模型这趟“顺风车”,你搭不搭?

在“大龄程序员的未来在何方”这篇文章里比较乐观地介绍了程序员保持竞争力的几个方向&#xff0c;但现实依然是残酷的&#xff1a;很多人将不得不离开软件开发工作&#xff0c;转型去从事其他职业。 当你要这么做时&#xff0c;就会感慨&#xff1a;想不到一切竟如此艰难&…

CEH、OSCP、CISP、CISSP 四大网络安全认证攻略

以下是 CEH、OSCP、CISP、CISSP 四大网络安全认证的详细对比&#xff0c;涵盖认证定位、考试难度、适用场景及职业方向&#xff0c;帮助你快速选择适合自己的证书&#xff1a;1. 核心区别速览认证发证机构定位 考试形式适合人群国际认可度CEHEC-Council道德黑客渗透测试基础选择…

SnapDevelop支持uni-app开发:跨平台与原生体验的完美融合

随着移动互联网的迅速发展&#xff0c;开发者面临着多平台需求和技术挑战。传统开发模式要求为每个平台编写独立代码&#xff0c;不仅浪费时间&#xff0c;还增加了维护难度。作为一款强大的低代码开发工具&#xff0c;SnapDevelop打破了这一局限&#xff0c;通过对uni-app的支…

海康威视相机,MVS连接成功,但无图像怎么办?

问题&#xff1a;准备一个常见的海康 相机去海康机器视觉官网下载MVS软件。打开软件&#xff0c;连接相机。显示连接成功&#xff0c;并能看到相机的信息。点击开始采集发现没有图像解决&#xff1a;右侧找到触发。1. 触发模式 ON2.选择 软触发3 启用自动触发点击采集有图像但一…

Linux systemd 系统管理:systemctl 控制服务与守护进程

Linux systemd 系统管理&#xff1a;systemctl 控制服务与守护进程系统启动过程 Linux 系统的启动过程遵循以下步骤&#xff1a; 开机自检&#xff1a;计算机启动后&#xff0c;BIOS/UEFI 进行硬件自检&#xff0c;确认硬件设备正常MBR 引导&#xff1a;从指定的启动设备读取主…

《Day2-PyTorch Tensor 从入门到实践:核心操作与避坑指南》

一、Tensor的创建 在Torch中张量以 "类" 的形式封装起来&#xff0c;对张量的一些运算、处理的方法被封装在类中&#xff0c;官方文档&#xff1a; torch — PyTorch 2.7 documentation 1. 基本创建方式 以下讲的创建tensor的函数中有两个有默认值的参数dtype和d…

两种格式数据介绍——bin 、 yuv文件

一、场景存储 通常指的是用于存储摄像头或传感器原始采集数据的文件格式&#xff0c;尤其是在自动驾驶、机器人、安防、工业视觉等需要记录真实世界场景的应用中。格式存储内容用途场景特点.binLiDAR点云、毫米波雷达数据、IMU、GPS、原始传感器帧自动驾驶仿真、SLAM建图、数据…

【网络运维】Linux:SELinux简介和配置

SELinux 介绍 SELinux 概述 文件权限控制了哪些用户或用户组可以访问哪些特定文件&#xff0c;但未限定用户访问文件的方式。 例如&#xff1a;对于文件的写入权限而言&#xff0c; 结构化数据文件是否应当设计为只能使用特定的程序写入&#xff0c;但其他编辑器仍可以打开和修…

GaussDB SQL执行计划详解

1 问题现象SQL执行计划是GaussDB性能分析及调优的核心&#xff0c;它输出三个关键信息&#xff1a;访问路径:扫描表数据的路径。连接顺序&#xff1a;多表连接顺序。连接方式&#xff1a;多表连接方式。2 技术背景GaussDB SQL语句执行计划是数据库为运行SQL语句而执行的操作步骤…

02.【数据结构-C语言】顺序表(线性表概念、顺序表实现:增删查、前向声明、顺序表实现通讯录项目:增删改查、通讯录数据导入及保存到本地文件)

目录 1. 线性表 2. 顺序表概念及分类 2.1 顺序表的概念 2.2 顺序表分类 2.3 动静态顺序表对比 3. 顺序表的实现&#xff08;附完整版代码&#xff09; 3.1 顺序表结构体声明 3.2 初始化&销毁 3.3 插入&#xff08;尾插、头插、指定位置之前插入&#xff09; 3.4 …

MyBatis核心配置深度解析:从XML到映射的完整技术指南

&#x1f527; MyBatis核心配置深度解析&#xff1a;从XML到映射的完整技术指南 &#x1f680; 引言&#xff1a;MyBatis作为Java生态中最受欢迎的持久层框架之一&#xff0c;其强大的配置体系是实现灵活数据访问的核心。本文将深入解析MyBatis的配置文件架构、映射机制以及高级…

OpenCV HSV与RGB颜色模型的区别

HSV与RGB颜色模型的区别 HSV&#xff08;Hue, Saturation, Value&#xff09;和 RGB&#xff08;Red, Green, Blue&#xff09;是两种不同的颜色表示方式&#xff0c;主要区别如下&#xff1a;对比项RGBHSV定义基于红、绿、蓝三原色的混合基于色相&#xff08;H&#xff09;、饱…

具有柔性关节的机械臂matlab仿真

柔性关节机械臂MATLAB仿真方案&#xff0c;包含动力学建模、控制器设计和可视化分析。该方案基于拉格朗日方程建立柔性关节模型&#xff0c;并实现了PD控制、滑模控制和自适应控制三种控制策略。 MATLAB仿真 %% 柔性关节机械臂仿真 - 完整系统 % 作者: MATLAB技术助手 % 日期: …