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

Spring Cloud服务发现与注册的原理与实现

Spring Cloud服务发现与注册的原理与实现

  • 一、简介
    • 1 服务发现的定义
    • 2 服务发现的意义
  • 二、Spring Cloud服务注册与发现的实现
    • 1 Spring Cloud服务注册
      • 1.1 服务注册的基本框架
        • 1.2 服务注册的实现方式
    • 2 Spring Cloud服务发现
      • 2.1 服务发现的基本框架
      • 2.2 服务发现的实现方式
  • 三、Spring Cloud服务注册与发现的原理
    • 3.1 Eureka的原理
      • 3.1.1 Eureka的基本概念
      • 3.1.2 Eureka的工作原理
        • 注册中心
        • 服务实例
    • 3.2 Zookeeper的原理
      • 3.2.1 Zookeeper的基本概念
        • 数据模型
        • 会话
      • 3.2.2 Zookeeper的工作原理
    • 3.3 Consul的原理
      • 3.3.1 Consul的基本概念
        • 服务发现
        • 健康检查
      • 3.3.2 Consul的工作原理
  • 四、Spring Cloud服务注册与发现的应用场景
    • 4.1 微服务架构中的应用场景
    • 4.2 服务治理与负载均衡的应用场景
    • 4.3 分布式集群中的应用场景

一、简介

1 服务发现的定义

服务发现是指在一个分布式系统中,服务提供者将自己注册到系统中心,并且服务消费者可以从系统中心查询所有可用的服务的过程。

2 服务发现的意义

通过服务发现,服务消费者可以方便地获取可用的服务实例,而无需了解服务实例的具体位置和部署情况。同时,服务提供者也可以方便地将自己的服务注册到系统中心,让使用方更容易地找到服务。

二、Spring Cloud服务注册与发现的实现

1 Spring Cloud服务注册

1.1 服务注册的基本框架

服务注册的基本框架包括三部分:服务提供者、服务注册中心和服务消费者。其中,服务提供者将自己注册到服务注册中心,服务消费者从服务注册中心获取可用的服务列表。

1.2 服务注册的实现方式

Spring Cloud提供了几种服务注册的实现方式,包括:

  1. Eureka:Netflix公司开源的、最为流行的一种服务注册中心;
  2. Consul:由Hashicorp公司开发的一种服务发现组件,支持多数据中心;
  3. ZooKeeper:由Apache项目开发的一种分布式协调框架。

这里以Eureka为例,介绍Spring Cloud服务注册的实现方式。

首先需要在pom.xml文件中添加以下依赖:

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

接着,在启动类中加上@EnableEurekaServer注解,表明该服务作为Eureka Server运行:

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

在配置文件application.yml中指定服务端口、Eureka相关配置:

server:port: 8761eureka:instance:hostname: localhostclient:register-with-eureka: falsefetch-registry: false

至此,Eureka Server配置完成。

2 Spring Cloud服务发现

2.1 服务发现的基本框架

服务发现的基本框架也包括三部分:服务提供者、服务注册中心和服务消费者。其中,服务提供者将自己注册到服务注册中心,服务消费者从服务注册中心获取可用的服务列表。

2.2 服务发现的实现方式

同样以Eureka为例,介绍Spring Cloud服务发现的实现方式。

服务提供者需要在pom.xml文件中添加以下依赖:

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

在启动类中加上@EnableDiscoveryClient注解,表明该服务需要作为Eureka Client运行,并向Eureka Server注册:

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

同时,在配置文件application.yml中指定应用名称、Eureka相关配置:

spring:application:name: demp-serviceeureka:client:service-url:defaultZone: http://localhost:8761/eureka/

至此,服务提供者的配置完成。

服务消费者需要在pom.xml文件中添加以下依赖:

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

在需要调用服务的地方使用@LoadBalanced注解,让RestTemplate具有负载均衡的能力:

@Bean
@LoadBalanced
public RestTemplate restTemplate() {return new RestTemplate();
}

同时,在配置文件application.yml中指定应用名称、Eureka相关配置:

spring:application:name: demp-service-consumereureka:client:service-url:defaultZone: http://localhost:8761/eureka/

至此,服务消费者的配置完成。

通过以上配置,Spring Cloud可以实现服务注册和发现的功能。

三、Spring Cloud服务注册与发现的原理

3.1 Eureka的原理

3.1.1 Eureka的基本概念

注册中心:
Eureka server是Spring Cloud的核心组件之一,它提供了服务注册和发现的功能。即服务提供者将自己的服务注册到Eureka Server,服务消费者从Eureka Server中查找所需的服务并进行调用。

服务实例:
服务实例是指暴露出来的某个服务,可以是普通的Java服务、也可以是Web Service服务等。

3.1.2 Eureka的工作原理

注册中心

注册中心是一个基于REST的服务,主要实现服务注册、服务续约、服务下线以及查询功能。Eureka Server接收服务实例的注册请求,并将服务实例信息存储在内存中(HashMap)。当Eureka Server收到服务实例的续约请求时,会更新服务实例在内存中的信息,避免服务实例过期失效。也可以通过URL获取注册中心中所有可用的服务。

服务实例

服务实例启动后会向Eureka Server发送注册请求,告知Eureka Server自己的地址(ip:port)、服务名、健康状态以及一些元数据。同时服务实例会以心跳的方式向Eureka Server发送服务续约请求,在规定时间内没有接收到续约请求,则视为服务实例失效。

3.2 Zookeeper的原理

3.2.1 Zookeeper的基本概念

Zookeeper是一个分布式协调服务,主要应用于高可用场景下的协调任务。Zookeeper提供了数据地址、配置管理、同步等功能。

数据模型

Zookeeper所有的数据都保存在一个树形结构中,每个节点称为一个Znode。每个Znode都有名称和数据两个部分组成。数据通常是空字符串,但是也可以存储数据。

会话

不同的客户端需要连接到Zookeeper集群进行交互,这些客户端与Zookeeper服务器建立会话。Zookeeper会话与传统应用服务器会话的概念类似,但具有独特的特征,如一些会话变量和超时机制。

3.2.2 Zookeeper的工作原理

Zookeeper集群中的各个节点通过Zab协议来实现数据一致性。集群中的一个Zookeeper节点被选举为leader,所有其它follower节点负责数据复制。当leader节点失效时,follower中的某一个节点会被选举为新的leader。

3.3 Consul的原理

3.3.1 Consul的基本概念

Consul是一个分布式的高可用服务发现和配置管理系统。它提供了服务发现、健康检查、KV存储、安全服务等功能。

服务发现

Consul基于HTTP提供服务发现。服务消费者可以使用HTTP协议从Consul服务端获取服务提供者的地址和端口号。

健康检查

Consul通过健康检查确定哪些服务实例对外提供服务。Consul同时支持TCP、HTTP和Docker容器的健康检查方式。

3.3.2 Consul的工作原理

Consul集群实际上就是多个有状态的服务器管理和协调数据。这些节点中的一个被选为leader,所有其它follower节点负责数据复制。

四、Spring Cloud服务注册与发现的应用场景

4.1 微服务架构中的应用场景

在微服务架构中,服务之间可能会随时发生变化,例如某个服务重启、一台机器下线等,因此服务访问地址的获取需要具备高度灵活性和实时性。服务注册中心的出现就是为了解决这个问题,它可以自动进行服务注册和服务发现,大大提高了系统的可扩展性和可维护性。

4.2 服务治理与负载均衡的应用场景

服务金丝雀发布、分阶段上线、AB测试等操作,都离不开服务治理,而服务治理又需要服务注册中心来协同实现。在这些高级应用场景中,服务注册中心还可以和负载均衡器等组件配合,提供更加全面的服务治理和负载均衡功能。

4.3 分布式集群中的应用场景

在分布式系统中,节点数量大、拓扑图复杂,因此需要一个中心化的配置管理中心。服务注册中心可以实现系统配置的自动管理和更新,同时由于各个服务的名称是由它们自己注册到注册中心上的,因此它能够帮助开发人员快速获得系统内部服务之间的依赖关系。

相关文章:

Spring Cloud服务发现与注册的原理与实现

Spring Cloud服务发现与注册的原理与实现 一、简介1 服务发现的定义2 服务发现的意义 二、Spring Cloud服务注册与发现的实现1 Spring Cloud服务注册1.1 服务注册的基本框架1.2 服务注册的实现方式 2 Spring Cloud服务发现2.1 服务发现的基本框架2.2 服务发现的实现方式 三、Sp…...

FFmpeg入门之简单介绍

FFmpeg是什么意思: Fast Forward Moving Picture Experts Group ffmpeg相关文档: Documentation FFmpeg ffmpeg源码下载: https://git.videolan.org/git/ffmpeg.git https://github.com/FFmpeg/FFmpeg.git FFmpeg能做什么? 多种媒体格式的封装与解封装 : 1.多种音…...

新版DBeaver调整编辑窗口字体大小

网上有DBeave字体设置了&#xff0c;但看了下&#xff0c;目前最新版的已经更改了首选项分组&#xff0c;层级发生了变化&#xff0c;这里记录一下2022.08.21版的设置。 默认字体是10&#xff0c;比较小&#xff0c;改为11或更大会好看些。...

《vue3实战》运用push()方法实现电影评价系统的添加功能

目录 前言 电影评价系统的添加功能是什么&#xff1f; 电影评价系统的添加功能有什么作用&#xff1f; 一、push&#xff08;&#xff09;方法是什么&#xff1f;它有什么作用&#xff1f; 含义&#xff1a; 作用&#xff1a; 二、功能实现 这段是添加开始时点击按钮使…...

JavaScript学习笔记02

JavaScript笔记02 数据类型详解 字符串 在 JavaScript 中正常的字符串都使用单引号 或者双引号" "包裹&#xff1a;例&#xff1a; 转义字符 在 JavaScript 字符串中也可用使用转义字符&#xff08;参考&#xff1a;详解转义字符&#xff09;&#xff1a;例&…...

短信过滤 APP 开发

本文字数&#xff1a;7033字 预计阅读时间&#xff1a;42分钟 一直想开发一个自己的短信过滤 APP&#xff0c;但是一直没有具体实施&#xff0c;现在终于静下心来&#xff0c;边开发边记录下整体的开发过程。 01 垃圾短信样本 遇到的第一个问题是&#xff0c;既然要过滤垃圾短信…...

【计算机基础知识7】垃圾回收机制与内存泄漏

目录 前言 一、垃圾回收机制的工作原理 1. 标记-清除算法的基本原理 2. 垃圾回收器的类型及其工作方式 3. 垃圾回收的回收策略和触发机制 三、内存泄漏的定义和原因 1. 内存泄漏的概念和影响 2. 常见的内存泄漏情况及其原因 四、如何避免和处理内存泄漏 1. 使用合适…...

[学习笔记]CS224W

资料&#xff1a; 课程网址 斯坦福CS224W图机器学习、图神经网络、知识图谱【同济子豪兄】 斯坦福大学CS224W图机器学习公开课-同济子豪兄中文精讲 图的基本表示 图是描述各种关联现象的通用语言。与传统数据分析中的样本服从独立同分布假设不一样&#xff0c;图数据自带关联…...

华为云API对话机器人CBS的魅力—实现简单的对话操作

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI智能的问答管理、全面的对话管理、高效训练部署 1.IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts …...

精益制造、质量管控,盛虹百世慧共同启动MOM(制造运营管理)

百世慧科技依托在电池智能制造行业中的丰富经验&#xff0c;与盛虹动能达成合作&#xff0c;为其提供MOM制造运营管理平台&#xff0c;并以此为起点&#xff0c;全面提升盛虹动能的制造管理水平与运营体系。 行业困境 中国动力电池已然发展为全球最大的电池产业&#xff0c;但…...

【科研论文配图绘制】task7密度图绘制

【科研论文配图绘制】task7密度图绘制 task7 了解密度图的定义&#xff0c;清楚密度图是常用使用常见&#xff0c;掌握密度图绘制。 1.什么是密度图 密度图&#xff08;Density Plot&#xff09;是一种用于可视化数据分布的图表类型。它通过在数据中创建平滑的概率密度曲线…...

Python3 集合

Python3 集合 集合&#xff08;set&#xff09;是一个无序的不重复元素序列。 可以使用大括号 { } 或者 set() 函数创建集合&#xff0c;注意&#xff1a;创建一个空集合必须用 set() 而不是 { }&#xff0c;因为 { } 是用来创建一个空字典。 创建格式&#xff1a; parame …...

【山河送书第十期】:《Python 自动化办公应用大全》参与活动,送书两本!!

【山河送书第十期】&#xff1a;《Python 自动化办公应用大全》参与活动&#xff0c;送书两本&#xff01;&#xff01; 前言一书籍亮点二作者简介三内容简介四购买链接五参与方式六往期赠书回顾 前言 在过去的 5 年里&#xff0c;Python 已经 3 次获得 TIOBE 指数年度大奖&am…...

Java多线程——同步

同步是什么&#xff1f; 当两个线程同时对一个变量进行修改时&#xff0c;不同的访问顺序会造成不一样的结果&#xff0c;这时候就需要同步保证结果的唯一性。 未同步时 新建Bank类&#xff0c;transfer()用于在两个账户之间转账金额 class Bank {private double[] account…...

Vue+NodeJS实现邮件发送

一.邮箱配置 这里以QQ邮箱为例,网易邮箱类似. 设置->账号 二.后端服务搭建 index.js const express require(express) const router require(./router); const app express()// 使用路由文件 app.use(/,router);app.listen(3000, () > {console.log(server…...

Go语言网络编程(socket编程)TCP粘包

1、TCP粘包 服务端代码如下&#xff1a; // socket_stick/server/main.gofunc process(conn net.Conn) {defer conn.Close()reader : bufio.NewReader(conn)var buf [1024]bytefor {n, err : reader.Read(buf[:])if err io.EOF {break}if err ! nil {fmt.Println("read…...

【再识C进阶2(中)】详细介绍指针的进阶——函数指针数组、回调函数、qsort函数

前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;正在学习C&#xff0c;数据结构等&#x1f440; &#x1f493;作者主页&#xff1a;加油&#xff0c;旭杏的主页&#x1f440; ⏩本文收录在&#xff1a;再识C进阶的专栏&#x1…...

PaddleOCR学习笔记3-通用识别服务

今天优化了下之前的初步识别服务的python代码和html代码。 采用flask paddleocr bootstrap快速搭建OCR识别服务。 代码结构如下&#xff1a; 模板页面代码文件如下&#xff1a; upload.html : <!DOCTYPE html> <html> <meta charset"utf-8"> …...

9.8 校招 实习 内推 面经

绿泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 长安福特2024校园招聘正式启动 校招 | 长安福特2024校园招聘正式启动 2、2023校招总结--SLAM岗位 - 5 2023校招总结--SLAM岗位 - 5 3、校招&实习 | 格灵深瞳2024秋季校园招聘启…...

web前段与后端的区别优漫动游

要了解web前后端的区别&#xff0c;首先必须得清楚什么是web前端和web后端。 web前段与后端的区别 首先&#xff1a;web的本意是蜘蛛网和网的意思&#xff0c;在网页设计中我们称为网页的意思。现广泛译作网络、互联网等技术领域。表现为三种形式&#xff0c;即超文本(hyp…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...