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

Spring Boot 中的服务注册是什么,原理,如何使用

Spring Boot 中的服务注册是什么,原理,如何使用

Spring Boot 是一个非常流行的 Java 后端框架,它提供了许多便捷的功能和工具,使得开发者可以更加高效地开发微服务应用。其中,服务注册是 Spring Boot 微服务架构中非常重要的一环。在本文中,我们将深入探讨 Spring Boot 中的服务注册是什么,原理以及如何使用。

在这里插入图片描述

什么是服务注册?

服务注册是微服务架构中的核心概念之一,它允许服务提供者将自己的服务注册到注册中心,同时也允许消费者从注册中心获取可用的服务列表。在 Spring Boot 中,服务注册通常采用 Eureka 或 Consul 作为注册中心,这两种注册中心都提供了 RESTful API,用于服务提供者和服务消费者之间的交互。

Eureka 原理

Eureka 是 Netflix 提供的一种服务发现框架,它提供了服务注册和发现功能,支持动态增加和删除服务实例。Eureka 的核心组件包括 Eureka Server 和 Eureka Client。

Eureka Server 是服务注册中心,它负责维护所有可用的服务实例信息。当一个服务提供者启动时,它会向 Eureka Server 发送一个注册请求,Eureka Server 将会将这个服务实例注册到自己的服务实例列表中,同时也会将这个服务实例的信息缓存在本地缓存中。

Eureka Client 是服务提供者的客户端,它负责向 Eureka Server 发送心跳请求,以确保这个服务实例的健康状态。同时,Eureka Client 也会从 Eureka Server 获取可用的服务列表,并缓存在本地缓存中。当另一个服务消费者需要调用这个服务提供者时,它会向 Eureka Client 发送一个服务发现请求,Eureka Client 将会从本地缓存中获取可用的服务列表,并返回给服务消费者。

如何使用 Eureka?

下面我们来看一下如何在 Spring Boot 中使用 Eureka。为了演示简单,我们将创建两个微服务:服务提供者和服务消费者。

创建服务提供者

首先,我们需要创建一个服务提供者。我们可以使用 Spring Initializr 来快速生成一个 Spring Boot 项目,在项目中添加 Eureka 相关依赖。

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

然后,我们需要在配置文件中添加 Eureka 相关配置。

spring:application:name: service-provider
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/

在服务提供者的代码中,我们需要添加 @EnableDiscoveryClient 注解,以启用 Eureka Client 功能。

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(ServiceProviderApplication.class, args);}@RestControllerclass HelloController {@GetMapping("/hello")public String hello() {return "Hello, world!";}}}

创建服务消费者

接下来,我们需要创建一个服务消费者。同样地,我们可以使用 Spring Initializr 来快速生成一个 Spring Boot 项目,在项目中添加 Eureka 相关依赖。

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

然后,我们需要在配置文件中添加 Eureka 相关配置。

spring:application:name: service-consumer
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/

在服务消费者的代码中,我们需要添加 @EnableDiscoveryClient 注解,以启用 Eureka Client 功能。然后,我们可以使用 RestTemplate 来调用服务提供者的接口。

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceConsumerApplication {public static void main(String[] args) {SpringApplication.run(ServiceConsumerApplication.class, args);}@RestControllerclass HelloController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/hello")public String hello() {String url = "http://service-provider/hello";return restTemplate.getForObject(url, String.class);}}@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

在上面的代码中,我们使用 @Autowired 注解来注入 RestTemplate 对象,然后在 hello 方法中使用 RestTemplate 来调用服务提供者的接口。需要注意的是,我们使用了 @LoadBalanced 注解来启用负载均衡功能,这样当我们启动多个服务提供者实例时,服务消费者会自动选择一个可用的服务实例来调用。

启动服务

最后,我们需要启动 Eureka Server、服务提供者和服务消费者三个应用。首先,我们需要启动 Eureka Server:

mvn spring-boot:run -pl eureka-server

然后,我们需要分别启动服务提供者和服务消费者:

mvn spring-boot:run -pl service-provider
mvn spring-boot:run -pl service-consumer

启动完成后,我们可以访问服务消费者的接口来调用服务提供者的接口:

curl http://localhost:8080/hello

Consul 原理

除了 Eureka,还有另一种常用的服务注册中心——Consul,它同样提供了服务注册和发现功能,支持多数据中心和健康检查等高级特性。

Consul 的核心组件包括 Consul Server 和 Consul Client。

Consul Server 是服务注册中心,它负责维护所有可用的服务实例信息。当一个服务提供者启动时,它会向 Consul Server 发送一个注册请求,Consul Server 将会将这个服务实例注册到自己的服务实例列表中,同时也会将这个服务实例的信息缓存在本地缓存中。

Consul Client 是服务提供者的客户端,它负责向 Consul Server 发送心跳请求,以确保这个服务实例的健康状态。同时,Consul Client 也会从 Consul Server 获取可用的服务列表,并缓存在本地缓存中。当另一个服务消费者需要调用这个服务提供者时,它会向 Consul Client 发送一个服务发现请求,Consul Client 将会从本地缓存中获取可用的服务列表,并返回给服务消费者。

如何使用 Consul?

与使用 Eureka 类似,我们同样需要创建一个服务提供者和一个服务消费者,然后在配置文件中添加 Consul 相关配置。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
spring:application:name: service-providercloud:consul:host: localhostport: 8500discovery:instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}service-name: ${spring.application.name}
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
spring:application:name: service-consumercloud:consul:host: localhostport: 8500discovery:instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}service-name: ${spring.application.name}

需要注意的是,我们使用了 KaTeX parse error: Expected '}', got 'EOF' at end of input: …on.instance_id:{random.value}} 来为每个服务实例生成一个唯一的实例 ID,这样可以确保每个服务实例都有自己的注册信息。

在服务提供者和服务消费者的代码中,我们需要添加 @

相关文章:

Spring Boot 中的服务注册是什么,原理,如何使用

Spring Boot 中的服务注册是什么&#xff0c;原理&#xff0c;如何使用 Spring Boot 是一个非常流行的 Java 后端框架&#xff0c;它提供了许多便捷的功能和工具&#xff0c;使得开发者可以更加高效地开发微服务应用。其中&#xff0c;服务注册是 Spring Boot 微服务架构中非常…...

spring.factories文件在Spring工程中的说明

说明 spring.factories 是 Spring Boot 框架中一个特殊的配置文件&#xff0c;它用于定义自动配置的实现类以及要注册的其他组件信息。该文件通常位于 META-INF/spring.factories 目录下&#xff0c;Spring Boot 在启动时会自动加载它并读取其中的配置信息。 spring.factorie…...

常见的自动化测试架构有哪些?

目录 前言 常见的自动化架构包括如下。 1.数据驱动测试 2.模块驱动测试 3.关键字驱动测试 优点&#xff1a; 缺点&#xff1a; 总结&#xff1a; 前言 一个自动化测试架构就是一个集成体系&#xff0c;其中定义了一个特殊软件产品的自动化测试规则。这一体系中包含测试…...

Revit中用自适应创建简单的瓦片族和切换构件的材质?

一、Revit中使用自适应创建瓦片族 在我们的日常生活中&#xff0c;屋顶的瓦片是我们经常都能够见到的&#xff0c;瓦片能够挡风遮雨也能够使建筑物带来古香古色的气息&#xff0c;那我们今天来学习如何使用自适应创建简单的瓦片族。 1.首先&#xff1a;我们打开自适应公制常规模…...

Spring Boot实战:拦截器和监听器的应用指南

当使用Spring Boot时&#xff0c;我们可以通过拦截器&#xff08;Interceptor&#xff09;和监听器&#xff08;Listener&#xff09;来实现对请求和响应的处理。拦截器和监听器提供了一种可插拔的机制&#xff0c;用于在请求处理过程中进行自定义操作&#xff0c;例如记录日志…...

为什么要搭建数据仓库

数据是企业中最重要的资源之一&#xff0c;因此&#xff0c;随着企业数据量的不断增大和复杂度的提高&#xff0c;建立一个可靠和健全的数据仓库变得越来越重要。在数聚股份看来&#xff0c;一个数据仓库可以作为一个企业数据存储和管理系统&#xff0c;能够更有效地存储、管理…...

Sql Server 获取连续日期时间

获取连续日期时间 在项目中&#xff0c;有时候需要按日期/时间统计&#xff0c;例如2023-06-21至2023-06-28期间每一天的数据&#xff0c;如果某一天没有数据&#xff0c;也要查询出来&#xff0c;用NULL处理。 1.示例 2.连续日期效果SQL DECLARE StartDate DATE 2023-06-2…...

MIT 6.830数据库系统 -- lab two

MIT 6.830数据库系统 -- lab two 项目拉取Lab Two实现提示练习一 -- Filter and Join练习二 -- Aggregates练习三 -- HeapFile Mutability练习四 -- Insertion & deletion练习五 -- Page eviction练习六 -- Query walkthrough练习七 - 查询解析 项目拉取 原项目使用ant进行…...

React基础知识点(一)

React基础知识点 目标 能够说出React是什么能够说出React的特点能够掌握React的基本使用能够使用React脚手架 什么是React &#xff08;★★★&#xff09; React是一个用于构建用户界面的javaScript库&#xff0c;起源于facebook的内部项目&#xff0c;后续在13年开源了出…...

机器学习-进化算法

进化算法 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;crossovermutation 进化策略&#xff08;Evolutionary Strategies&#xff0c;ES&#xff09;基因编程&#xff08;Genetic Programming&#xff09;Multi-objective Evolutionary Algorithms 遗传算…...

leetcode 637. 二叉树的层平均值

2023.6.29 依旧是层序遍历的变体&#xff0c;在层序遍历的代码中的内层循环求个和&#xff0c;然后出循环之后取个平均值即可实现层平均值&#xff0c;下面上代码&#xff1a; class Solution { public:vector<double> averageOfLevels(TreeNode* root) {vector<doub…...

7-数组创建函数还有哪些?【视频版】

目录 问题视频解答 问题 视频解答 点击观看&#xff1a; 7-数组创建函数还有哪些&#xff1f;...

webrtc源码阅读之P2P流程分析

P2P从宏观原理上其实就是&#xff1a; 收集本地Candidates设置远程Candidates连通性测试及排序 本文我们从Offer端的角度进行源码分析&#xff0c;学习webrtc是如何进行P2P连接的。版本m98。 一、收集本地Candidates examples/peerconnection中&#xff0c;CreateOffer以后&…...

vscode 快速修复(quick fix) 快捷键(Ctrl + .)被占用问题解决方法

vscode 快速修复(quick fix) 快捷键(Ctrl .)被占用 微软拼音的中/英文标点切换的快捷键为Ctrl .&#xff0c;与 vscode 快速修复(quick fix)快捷键冲突。修复方法如下&#xff1a; 切换到微软拼音&#xff0c;在输入法中或英字上&#xff0c;点击右键。 再点设置 - 按键。 …...

阿里云——扩展Linux系统盘

扩展分区和文件系统_Linux系统盘 {#concept_ocb_htw_dhb .concept} 本文提供了如何使用growpart和resize2fs工具完成Linux系统盘分区扩容及文件系统扩展的操作指导。 适用范围 {#section_u9c_3g5_ljs .section} 本文的操作步骤适用于以下分区和文件系统格式的云盘&#xff1…...

TypeScript ~ 掌握基本类型 ②

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…...

【Zookeeper】win安装随笔

目录 下载地址下载目标解压后目录结构配置文件配置文件详情伪分布式安装LinuxZooKeeper audit is disabled启动解决报错&#xff1a;SLF4J: Class path contains multiple SLF4J bindings. _ 下载地址 https://zookeeper.apache.org/releases.html 下载目标 记住选择带bin的…...

Unity 之 最新原生广告Ads接入 -- 助力增长游戏收益

Unity 之 最新Ads原生广告接入流程详解和工具类分享 一&#xff0c;注册 Unity Ads 广告 SDK二&#xff0c;下载 Unity Ads 广告 SDK三&#xff0c;配置 Unity Ads 广告 SDK3.1 广告位展示流程3.2 代码初始化 四&#xff0c;集成 Unity Ads 广告 SDK4.1 相关介绍4.2 代码分享 五…...

ChatGPT是否可以进行逻辑推理?

ChatGPT在逻辑推理方面的能力存在一定的限制。虽然它可以处理一些简单的逻辑问题&#xff0c;但由于其基于统计模型和语言模式的生成方式&#xff0c;它在复杂的逻辑推理和推断任务上可能会遇到挑战。以下是对ChatGPT在逻辑推理方面能力的详细分析&#xff1a; 1. 基于统计模型…...

TP6在composer包里写控制器

前提&#xff1a;首先要了解下如何自建composer包。 1.先建一个空包&#xff0c;加一个文件&#xff1a;composer.json {"name": "test/ctrs","type": "library","license": "MIT","autoload": {&quo…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

分布式增量爬虫实现方案

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

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...