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 分布式集群中的应用场景

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

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

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

相关文章

JDK8的lambda方式List多字段排序List.stream().sorted()

JDK8的lambda方式List多字段排序List.stream().sorted() 多字段排序 List<HumanDetailDownloadVO> collect dataList.stream().sorted(// 日期 倒序 Comparator.comparing(HumanDetailDownloadVO::getDate_str, Comparator.reverseOrder())// 仓id 倒序 .thenCompari…

【Java项目实战】牛客网论坛项目1 - Spring入门与初识SpringMVC

目录 Spring 入门SpringInitializrApplicationContextAwareControllerDAODAO 名称索引ServiceConfig自动装配 初识 SpringMVCHttp 请求GETPOSTHTML 渲染响应 JSON 数据 Spring 入门 SpringInitializr IDEA 专业版自带的功能&#xff0c;也可以直接搜索对应网站&#xff0c;通…

数据库概念

定义&#xff1a; 数据库&#xff08;Database 简称DB&#xff09;是持久存储有组织/可共享数据/的容器 数据库管理系统(MySQL、Oracle、DB2)是操作/和管理数据库/的软件 分类&#xff1a; 关系(型)数据库 (MySQL、Oracle、SQL Server、SQLite、DB2) 非关系(型)数据库 (Redis…

华为云 存在不支持迁移的外键解决方法

DRS 检测出源端存在不支持的外键引用操作 MySQL、GaussDB(for MySQL)为源的全量增量或增量迁移、同步场景&#xff0c;以及MySQL、GaussDB(for MySQL)为源灾备场景 表1 源端存在不支持的外键引用操作 预检查项 源端存在不支持的外键引用操作。 描述 同步对象中存在包含CASC…

git如何查看和修改用户名和邮箱

一、查看Git全局配置的用户名和邮箱 在Git中可以通过以下命令查看你的全局配置&#xff1a; git config --global user.namegit config --global user.email其中&#xff0c;git config是Git配置命令&#xff0c;--global是全局配置选项&#xff0c;user.name和user.email是我…

Unity物体查找方式

参考资料 cUnity中使用GameObject.Find、Transform.Find查找GameObject_思月行云的博客-CSDN博客 GameObject.Find 通过名字或路径查找游戏对象。 GameObject.Find("GameObject"); GameObject.Find("GameObject/ChildGameObject); 使用规范: 1.无法查找隐藏…

配置Jedis连接池

一、概述 Jedis本身是线程不安全的&#xff0c;并且频繁的创建和销毁连接会有性能损耗&#xff0c;因此推荐使用Jedis连接池代替Jedis的直连方式。 二、创建连接池 public class JedisConnectionFactory {private static final JedisPool jedisPool;static {//配置连接池Jedi…

Centos 7 通过Docker部署OnlyOffice

前言&#xff1a; 在本文中&#xff0c;我们将详细介绍如何使用 Docker 部署功能强大的协作办公套件 OnlyOffice。通过 Docker&#xff0c;您可以轻松构建、部署和管理 OnlyOffice&#xff0c;从而提高团队协作和企业办公的效率。 一、安装Docker 1、向系统添加Docker CE软件仓…

windows下运行springboot的jar包,修改替换class文件,修改配置文件application,打包

在windows下跑springboot的jar包&#xff0c;经常会用到一些命令行和操作。 1、修改配置文件&#xff08;以application.yml为例&#xff09; #提取文件 jar xvf mqtt-10.1.0.jar BOOT-INF/classes/application.yml#将文件装回jar包 jar uvf mqtt-10.1.0.jar BOOT-INF/classe…

Qt简易闹钟

配置文件 QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compi…

Json“牵手”当当网商品详情数据方法,当当商品详情API接口,当当API申请指南

当当网是知名的综合性网上购物商城&#xff0c;由国内著名出版机构科文公司、美国老虎基金、美国IDG集团、卢森堡剑桥集团、亚洲创业投资基金&#xff08;原名软银中国创业基金&#xff09;共同投资成立1。 当当网从1999年11月正式开通&#xff0c;已从早期的网上卖书拓展到网…

【JAVA】Object类与抽象类

作者主页&#xff1a;paper jie_的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和…

Linux安装nginx教程

目录 一、Nginx下载 二、安装步骤 1、在 /docker目录下新建 nginx 文件夹 2、将解压包移动到nginx目录下并解压到nginx目录 3、进入 nginx目录&#xff0c;找到 configure 4、运行 configure&#xff0c;命令 5、安装 6、查看根目录 7、进入Nginx目录下的conf文件夹…

i8080/TTL/LVDS/MIPI接口的差别

EYA-DISPLAY i8080、TTL、LVDS和MIPI都是用于数据传输的接口协议&#xff0c;但它们在传输数据类型和使用场景上存在一些差异。 i8080接口是一种并行数据接口&#xff0c;通常用于连接CPU和慢速外设。它最初被设计用于IBM的PC和AT计算机&#xff0c;现已被广泛用于各种计算机和…

VSCODE CMAKE C++ 工程调试, C++不以科学计数法输出并控制小数位数

1. VSCODE调试CMAKE工程配置1.1 修改CMakeLists.txt文件1.2. 程序中1.3. launch.json配置1.4 开始调试1.5 注意 2. C设置输出浮点数且保留位数固定 1. VSCODE调试CMAKE工程配置 1.1 修改CMakeLists.txt文件 加这一句 set(CMAKE_BUILD_TYPE "Debug")1.2. 程序中 在…

python分支结构的花样玩法(二)

除了上述的基本用法&#xff0c;还可以使用更复杂的条件表达式&#xff0c;包括使用 not 和 or 来组合条件&#xff0c;以及使用 in 和 not in 来检查元素是否在&#xff08;或不在&#xff09;某个集合中。 例如&#xff1a; pythonif not condition1 or not condition2: # …

Nginx 学习(五)Tomcat 服务器

1 案例1&#xff1a;安装部署Tomcat服务器 1.1 问题 本案例要求部署Tomcat服务器&#xff0c;具体要求如下&#xff1a; 安装部署JDK基础环境安装部署Tomcat服务器创建JSP测试页面 然后客户机访问此Web服务器验证效果&#xff1a; 使用火狐浏览器访问Tomcat服务器的8080端…

Web存储

目录 什么是 HTML5 Web 存储? 方法 cookie webStorage 会话存储 sessionStorage 本地存储localStorage 什么是 HTML5 Web 存储? 使用HTML5可以在本地存储用户的浏览数据。 早些时候,本地存储使用的是 cookie。但是Web 存储需要更加的安全与快速. 这些数据不会被保存在服…

下单时如何保证数据一致性?

原创 哪吒 哪吒编程 2023-09-07 08:03 发表于辽宁 收录于合集#Redis11个 &#xff08;给哪吒编程加星标&#xff0c;提高Java技能&#xff09; 大家好&#xff0c;我是哪吒。 在前几篇文章中&#xff0c;提到了Redis实现排行榜、Redis数据缓存策略&#xff0c;让我们对Redis…

Golang 获取本地 IP 地址方法

在 Golang 中&#xff0c;使用 net 包可以很方便地获取到本机IP地址。 借助 net.InterfaceAddrs 方法 简单示例代码如下&#xff1a; package mainimport ("fmt""net" )func main() {addrList, err : net.InterfaceAddrs()if err ! nil {panic(err)}for…