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

news2024/9/30 17:29:48

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);
    }

    @RestController
    class 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);
    }

    @RestController
    class HelloController {

        @Autowired
        private RestTemplate restTemplate;

        @GetMapping("/hello")
        public String hello() {
            String url = "http://service-provider/hello";
            return restTemplate.getForObject(url, String.class);
        }

    }

    @Bean
    @LoadBalanced
    public 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-provider
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        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-consumer
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        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,这样可以确保每个服务实例都有自己的注册信息。

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

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

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

相关文章

代码源 线段树模板

线段树1 思路&#xff1a; 我们需要维护的东西是序列的最小值和最小值个数 这道题没有修改操作&#xff0c;因此不考虑修改 然后考虑Pushup 最小值很简单&#xff0c;直接取min 最小值个数怎么维护呢&#xff1f;考虑这个区间需要维护的值如何从左右两个区间获得 如果左右…

四.流程控制语句

1、条件语句 Go 编程语言中 if 条件语句的语法如下&#xff1a; 1、基本形式 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } If 在布尔表达式为 true 时&#xff0c;其后紧跟的语句块执行&#xff0c;如果false 则不执行。 package main import "fmt" fu…

Spring MVC是什么?详解它的组件、请求流程及注解

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解Spring MVC是什么&#xff0c;它的优缺点与九大组件&#xff0c;以及它的请求流程与常用的注解。 目录 一、Spring MVC是什…

计算机网络 - http协议 与 https协议(2)

前言 本篇介绍了构造http请求的的五种方式&#xff0c;简单的使用postman构造http请求&#xff0c;进一步了解https, 学习https的加密过程&#xff0c;了解对称密钥与非对称密钥对于加密是如何进行的&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流…

【数据科学和可视化】反思十年数据科学和可视化工具的未来

数据科学在过去十年中呈爆炸式增长&#xff0c;改变了我们开展业务的方式&#xff0c;并让下一代年轻人为未来的工作做好准备。但是这种快速增长伴随着对数据科学工作的不断发展的理解&#xff0c;这导致我们在如何使用数据科学从我们的大量数据中获得可操作的见解方面存在很多…

vue3实现一个简单的数字滚动效果

一、实现数字按步长递增的效果 1.实现思路 将这个组件封装起来&#xff0c;需要外部引用的文件传递两个值&#xff1a;指定数值 num 和 滚动持续时长 duration。首先设置一个增量 step&#xff0c;让数字按照这个增量来进行递增。然后设置一个定时器 setInterval&#xff0c;…

Flink集群部署总结

集群部署方式 Flink有两种部署方式&#xff0c;Standalone和Flink on Yarn集群部署方式。 Flink集群架构 Flink分布式架构是常见的主从结构&#xff0c;由JobManager和TaskManager组成。JobManager是大脑&#xff0c;负责接收、协调、分发Task到各个TaskManager&#xff0c;也…

靶场搭建——搭建pikachu靶场

搭建pikachu靶场 搭建pikachu靶场1、win11本机搭建步骤2、虚拟机win2012搭建步骤 我所碰见的问题以及解决方式&#xff1a; 搭建pikachu靶场 这里我所运用到的材料有&#xff1a;首先我最终是在虚拟机中环境为win2012和主机都搭建完成。 &#xff08;一个即可&#xff09; Ph…

在各数据库中使用 MERGE 实现插入避重 SQL

MERGE实现插入避重操作 前言 MERGE是一种在数据库管理系统中用于合并&#xff08;插入、更新或删除&#xff09;数据的SQL语句。它允许根据指定的条件将数据从一个表合并到另一个表中&#xff0c;同时避免重复插入或更新数据。 MERGE语句通常由以下几个关键字和子句组成&…

Spring Boot 中的服务消费

Spring Boot 中的服务消费 在分布式系统中&#xff0c;服务消费是一个很常见的场景。通过服务消费&#xff0c;可以将一个系统中的服务作为另一个系统中的组件来使用。Spring Boot 提供了很多工具来简化服务消费的过程&#xff0c;本文将深入探讨 Spring Boot 中的服务消费是什…

Java——《面试题——maven篇》

全文章节 Java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java——…

Redis数据库的简介、部署及常用命令

Redis数据库的简介、部署及常用命令 一、关系数据库与非关系型数据库概述1、关系型数据库2、非关系型数据库3、关系数据库与非关系型数据库区别4、非关系型数据库产生背景 二、Redis简介1、Redis服务器程序的单线程模型2、Redis的优点 三、Redis部署四、Redis 命令工具1、redis…

全概率公式和贝叶斯公式

人工智能和机器学习中经常听到一个著名公式&#xff1a;贝叶斯概率公式。早已忘记了&#xff0c;赶紧记一下笔记。 &#xff08;一&#xff09;全概率公式&#xff1a; 注意&#xff1a;全概率公式成立的前提是Bi是样本的划分 其证明过程如下&#xff1a; &#xff08;二&…

C++笔记之互斥锁,原子变量,条件变量对比

C笔记之互斥锁&#xff0c;原子变量&#xff0c;条件变量对比 code review! 目的&#xff1a;避免多线程间共享数据的竞态条件。 文章目录 C笔记之互斥锁&#xff0c;原子变量&#xff0c;条件变量对比1.std::mutex——互斥锁2.std::lock_guard3.std::unique_lock4.std::ato…

C++之lambda函数应用(一百四十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

如何看懂时序图(1):时序图基础知识

对于参考手册中经常出现的一些时序图&#xff0c;经常会让我摸不着头脑。比如对于Flash的时序图来说&#xff0c;要看懂的话&#xff0c;里面的每一个参数都得系统地学一遍&#xff0c;而且时序图中的一些符号也不太懂是什么意思。前一段时间调HyperRAM的时候&#xff0c;因为那…

冯·诺依曼架构哈佛架构(嵌入式学习)

冯诺依曼架构&哈佛架构 0. 前言1. 冯诺依曼架构&#xff08;von Neumann architecture&#xff09;关键组件限制&挑战 2. 哈佛架构关键组件限制&挑战 3. 冯诺依曼架构&哈佛架构的区别4. 知识扩展 0. 前言 冯诺依曼架构&#xff08;von Neumann architecture&a…

Python 命令行参数

Python 命令行参数 1、sys 库 sys.argv 获取参数2、getopt 模块解析带-参数2.1 短参数shortopts2.1.1 无短参数2.1.2 短参数h无值2.1.3 短参数h有值2.1.4 多个短参数h:v 2.2 长参数longopts2.2.1 长参数无值2.2.2 长参数有值 2.3 有空格字符串值 1、sys 库 sys.argv 获取参数 s…

Kubernetes核心概念汇总—调度、抢占和驱逐(Pod 调度就绪态)

Pod 一旦创建就被认为准备好进行调度。 Kubernetes 调度程序尽职尽责地寻找节点来放置所有待处理的 Pod。 然而&#xff0c;在实际环境中&#xff0c;会有一些 Pod 可能会长时间处于"缺少必要资源"状态。 这些 Pod 实际上以一种不必要的方式扰乱了调度器&#xff08;…

Vue3 如何去开发安卓 或者 ios

Vue3 有没有一款好用的开发原生的工具 1.uniapp 我个人认为uniapp 适合开发小程序之类的&#xff0c;用这个去开发原生应用会存在一些问题 性能限制&#xff1a;由于 Uniapp 是通过中间层实现跨平台&#xff0c;应用在访问底层功能时可能存在性能损失。与原生开发相比&#xf…