【Spring Cloud】 使用Eureka实现服务注册与服务发现

文章目录

  • 🍃前言
  • 🎍解决方案
    • 🚩关于注册中⼼
    • 🚩CAP理论
    • 🚩常见的注册中心
  • 🎄Eureka
    • 🚩搭建 Eureka Server
      • 🎈创建Eureka-server ⼦模块
      • 🎈引入依赖
      • 🎈项目构建插件
      • 🎈书写启动类
      • 🎈编写配置文件
      • 🎈启动验证服务
  • 🌳服务注册
    • 🚩引⼊eureka-client依赖
    • 🚩完善配置文件
    • 🚩启动服务
  • 🎄服务发现
    • 🚩引入依赖
    • 🚩完善配置文件
    • 🚩远程调用
    • 🚩启动服务
  • ⭕总结

🍃前言

在我们前面进行搭建微服务,在进行远程调用时进行远程调用的时候,我们发现我们的远程调用URL是写死的。

String url = "http://127.0.0.1:9090/product/"+ orderInfo.getProductId();

当更换机器,或者新增机器时,这个URL就需要跟着变更,就需要去通知所有的相关服务去修改。随之⽽来的就是各个项⽬的配置⽂件反复更新,各个项⽬的频繁部署。这种没有具体意义,但⼜不得不做的⼯作,会让⼈⾮常痛苦

🎍解决方案

试想⽣活中的场景

我们⽣活中,避免不了和各个机构(医院,学校,政府部⻔等)打交道,就需要保存各个机构的电话号码。如果机构换了电话号码,就需要通知各个使⽤⽅,但是这些机构的使⽤⽅群体是巨⼤的,没办法做到⼀⼀通知,怎么处理呢?

机构电话如果发⽣变化,通知114。⽤⼾需要联系机构时,先打114查询电话,然后再联系各个机构

114查号台的作⽤主要有两个:

  1. 号码注册:服务⽅把电话上报给114
  2. 号码查询:使⽤⽅通过114可以查到对应的号码

在这里插入图片描述

同样的,微服务开发时,也可以采⽤类似的⽅案。

  • 服务启动/变更时,向注册中⼼报道。注册中⼼记录应⽤和IP的关系。

  • 调⽤⽅调⽤时,先去注册中⼼获取服务⽅的IP,再去服务⽅进⾏调⽤

🚩关于注册中⼼

在最初的架构体系中,集群的概念还不那么流⾏,且机器数量也⽐较少,此时直接使⽤DNS+Nginx就可以满⾜⼏乎所有服务的发现。相关的注册信息直接配置在Nginx。但是随着微服务的流⾏与流量的激增,

机器规模逐渐变⼤,并且机器会有频繁的上下线⾏为,这种时候需要运维⼿动地去维护这个配置信息是⼀个很⿇烦的操作。

所以开发者们开始希望有这么⼀个东西,它能维护⼀个服务列表,哪个机器上线了,哪个机器宕机了,这些信息都会⾃动更新到服务列表上,客⼾端拿到这个列表,直接进⾏服务调⽤即可。这个就是注册中⼼

注册中⼼主要有三种⻆⾊:

  • 服务提供者(Server):⼀次业务中, 被其它微服务调⽤的服务, 也就是提供接给其它微服务
  • 服务消费者(Client):⼀次业务中, 调⽤其它微服务的服务. 也就是调⽤其它微服务提供的接
  • 服务注册中⼼(Registry): ⽤于保存Server 的注册信息, 当Server 节点发⽣变更时,Registry会同步变更. 服务与注册中⼼使⽤⼀定机制通信, 如果注册中⼼与某服务⻓时间⽆法通信, 就会注销该实例.

他们之间的关系以及⼯作内容, 可以通过两个概念来描述:

  • 服务注册:服务提供者在启动时, 向 Registry 注册⾃⾝服务, 并向 Registry 定期发送⼼跳汇报存活状
    态.
  • 服务发现: 服务消费者从注册中⼼查询服务提供者的地址,并通过该地址调⽤服务提供者的接⼝. 服务
    发现的⼀个重要作⽤就是提供给服务消费者⼀个可⽤的服务列表

在这里插入图片描述

🚩CAP理论

谈到注册中⼼,就避不开CAP理论。

CAP 理论是分布式系统设计中最基础,也是最为关键的理论,理论大致如下:

在这里插入图片描述

  • ⼀致性(Consistency) CAP理论中的⼀致性, 指的是强⼀致性。所有节点在同⼀时间具有相同的数据
  • 可⽤性(Availability) 保证每个请求都有响应(响应结果可能不对)
  • 分区容错性(Partition Tolerance) 当出现⽹络分区后,系统仍然能够对外提供服务

CAP 理论告诉我们: ⼀个分布式系统不可能同时满⾜数据⼀致性, 服务可⽤性和分区容错性这三个基本
需求, 最多只能同时满⾜其中的两个.

在分布式系统中, 系统间的⽹络不能100%保证健康, 服务⼜必须对外保证服务. 因此Partition Tolerance是不可避免. 那就只能在C和A中选择⼀个. 也就是CP或者AP架构

两个架构的区别在于:

  • CP架构: 为了保证分布式系统对外的数据⼀致性, 于是选择不返回任何数据
  • AP架构: 为了保证分布式系统的可⽤性, 节点2返回V0版本的数据(即使这个数据不正确)

🚩常见的注册中心

  1. Zookeeper

Zookeeper的官⽅并没有说它是⼀个注册中⼼,但是国内Java体系,⼤部分的集群环境都是依赖 Zookeeper来完成注册中⼼的功能

  1. Eureka

Eureka是Netflix开发的基于REST的服务发现框架,主要⽤于服务注册,管理,负载均衡和服务故障 转移.
官⽅声明在Eureka2.0版本停⽌维护,不建议使⽤。但是Eureka是SpringCloud服务注册/发现的默认实现,所以⽬前还是有很多公司在使⽤

  1. Nacos

Nacos是Spring Cloud Alibaba架构中重要的组件, 除了服务注册, 服务发现功能之外, Nacos还⽀持配置管理,流量管理, DNS, 动态DNS等多种特性.

三者所选择的 CAP 理论也不一样

ZookeeperEurekaNacos
CAP理论CPAPCP或AP,默认AP

本次博主主要介绍 Eureka 的使用

🎄Eureka

Eureka是Netflix OSS套件中关于服务注册和发现的解决⽅案

Eureka主要分为两个部分:

  • Eureka Server: 作为注册中⼼Server端, 向微服务应⽤程序提供服务注册, 发现, 健康检查等能⼒
  • Eureka Client: 服务提供者, 服务启动时, 会向Eureka Server 注册⾃⼰的信息(IP,端⼝,服务信息等),Eureka Server 会存储这些信息

注意,以下的演示是基于【Spring Cloud】微服务的简单搭建 的基础进行搭建的。不了解的小伙伴可以先去看一下博主所写的微服务的简单搭建。

关于Eureka的使用, 主要包含以下三个部分:

  1. 搭建Eureka Server
  2. 将order-service, product-service 都注册到Eureka
  3. order-service远程调⽤时, 从Eureka中获取product-service的服务列表, 然后进⾏交互

🚩搭建 Eureka Server

Eureka-server 是⼀个独⽴的微服务

🎈创建Eureka-server ⼦模块

在这里插入图片描述
在这里插入图片描述

🎈引入依赖

在这里插入图片描述
依赖如下:

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

🎈项目构建插件

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

🎈书写启动类

在这里插入图片描述
代码如下:

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

🎈编写配置文件

在这里插入图片描述

配置如下:

server:
 port: 10010
spring:
 application:
  name: eureka-serve
eureka:
 instance:
  hostname: localhost
 client:
  fetch-registry: false # 表⽰是否从Eureka Server获取注册信息,默认为true.因为这是⼀个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这⾥设置为false
  register-with-eureka: false # 表⽰是否将⾃⼰注册到Eureka Server,默认为true.由于当前应⽤就是Eureka Server,故⽽设置为false.
  service-url:
# 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.
   defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

🎈启动验证服务

启动服务, 访问注册中⼼: http://127.0.0.1:10010/

出现以下界面说明启动成功了
在这里插入图片描述

🌳服务注册

接下来我们把product-service 注册到eureka-server中

🚩引⼊eureka-client依赖

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

🚩完善配置文件

添加服务名称和eureka地址

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

🚩启动服务

刷新我们的注册中心,就可以看到以下场景
在这里插入图片描述

可以看到product-service已经注册到 eureka上了

🎄服务发现

接下来我们修改order-service, 在远程调⽤时, 从eureka-server拉取product-service的服务信息, 实现
服务发现

🚩引入依赖

服务注册和服务发现都封装在eureka-client依赖中, 所以服务发现时, 也是引⼊eureka-client依赖

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

🚩完善配置文件

服务发现也需要知道eureka地址,因此配置内容依然与服务注册⼀致,都是配置eureka信息

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

🚩远程调用

远程调⽤时,我们需要从eureka-server中获取product-service的列表(可能存在多个服务),并选择其中
⼀个进⾏调⽤

@Slf4j
@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RestTemplate restTemplate;
    @Resource
    private DiscoveryClient discoveryClient;
    public OrderInfo selectAll(Integer userid) {
        OrderInfo orderInfo = orderMapper.selectAll(userid);
        //String url = "http://127.0.0.1:9999/product/" + orderInfo.getProductId();
        List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
        //服务可能有多个, 获取第⼀个
        System.out.println("instances" + instances.size());
        EurekaServiceInstance instance = (EurekaServiceInstance)instances.get(0);
        log.info(instance.getInstanceId());
        //拼接url
        String url = instance.getUri()+"/product/"+ orderInfo.getProductId();
        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
        orderInfo.setProductInfo(productInfo);
        return orderInfo;
    }
}

🚩启动服务

刷新注册中心。我们可以看到order-service已经注册到eureka上了
在这里插入图片描述
访问order-service的相应接口,我们也可以看到调用成功。
在这里插入图片描述

⭕总结

关于《【Spring Cloud】 使用Eureka实现服务注册与服务发现》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【结构性型模式-适配器模式】

定义 将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类能一起工作。 适配器模式分为类适配器模式和对象适配器模式&#xff0c;前者类之间的耦合度比后者高&#xff0c;且要求程序员了解现有组件库中的相关组件的内部结…

运算放大器(2)

&#xff08;1&#xff09;反向放大器 Vout(-R2/R1)*Vi 图一运放的同向端接地0V&#xff0c;反向端和同向端虚短&#xff0c;所以也是0V 反向输入端输入电阻很高&#xff0c;虚断&#xff0c;几乎没有电流注入和流出&#xff0c;那么R1和R2相当于是串联的&#xff0c;流过一个…

平分正方形

题目链接 平分正方形 题目描述 注意点 square.length 3square[2] > 0若同时有多条直线满足要求&#xff0c;则选择斜率最大的一条计算并返回&#xff08;与Y轴平行的直线视为斜率无穷大&#xff09; 解答思路 平分正方形的直线是两个正方形中间点相连的直线&#xff0…

【超音速 专利 CN117710683A】基于分类模型的轻量级工业图像关键点检测方法

申请号CN202311601629.7公开号&#xff08;公开&#xff09;CN117710683A申请日2023.11.27申请人&#xff08;公开&#xff09;超音速人工智能科技股份有限公司发明人&#xff08;公开&#xff09;张俊峰(总); 杨培文(总); 沈俊羽; 张小村 技术领域 本发明涉及图像关键点检测…

python制作甘特图的基本知识(附Demo)

目录 前言1. matplotlib2. plotly 前言 甘特图是一种常见的项目管理工具&#xff0c;用于表示项目任务的时间进度 直观地看到项目的各个任务在时间上的分布和进度 常用的绘制甘特图的工具是 matplotlib 和 plotly 主要以Demo的形式展示 1. matplotlib 功能强大的绘图库&a…

【网络安全】APDCL:IDOR + 账户接管

未经许可&#xff0c;不得转载。 文章目录 正文漏洞1&#xff1a;IDOR漏洞2&#xff1a;账户接管 正文 APDCL &#xff0c;即印度阿萨姆邦电力分销公司&#xff08;Assam Power Distribution Company Limited&#xff09;&#xff0c;是印度阿萨姆邦政府控制的公共部门企业&am…

亚马逊IP关联是什么?要怎么解决呢?

亚马逊不仅提供了广泛的商品和服务&#xff0c;也是许多企业和个人选择的电子商务平台。然而&#xff0c;与亚马逊相关的IP关联问题&#xff0c;特别是在网络安全和运营管理方面&#xff0c;经常成为使用亚马逊服务的用户和商家关注的焦点。通过了解亚马逊IP关联的含义、可能的…

AURORA仿真

AURORA 仿真验证 定义&#xff1a;AURORA是一种高速串行通信协议&#xff0c;通常用于在数字信号处理系统和其他电子设备之间传输数据。它提供了一种高效的方式来传输大量数据&#xff0c;通常用于需要高带宽和低延迟的应用中。AURORA协议通常由Xilinx公司的FPGA器件支持&#…

ctfshow-web入门-php特性(web96-web99)

目录 1、web96 2、web97 3、web98 4、web99 1、web96 试了下通配、转义、拼接、大小写都不行 这里使用绝对路径或者当前路径绕过&#xff1a; ?u./flag.php ?u/var/www/html/flag.php 还可以使用 php 伪协议&#xff1a; ?uphp://filter/resourceflag.php 2、web97 关…

102.qt qml-最全Table交互之多列固定、行列拖拽、自定义委托、标题交互使用教程

自定义实现的Table控件&#xff0c;支持跨qt版本&#xff0c;兼容qt5,qt6&#xff01; 截图如下所示: 黑色风格如下所示&#xff1a; 视频演示入口&#xff1a;Qt QML QianWindowV2.5(新增曲线综合示例、QML最全Table交互示例、支持qt5/qt6)_哔哩哔哩_bilibili 1.示例页面入口…

【低照度图像增强系列(8)】URetinex-Net算法详解与代码实现(2022|CVPR)

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检…

中创算力公益行 | 夏日炎炎送清凉,温暖童心筑梦行

这是一个关于爱与关怀的故事&#xff0c;也是一段关于成长与责任的旅程。在这个炎炎夏日&#xff0c;喧嚣与热浪交织&#xff0c;有些孩子&#xff0c;他们生活在偏远的乡村&#xff0c;用稚嫩的双肩承载着生活的重担&#xff0c;在这个本应享受无忧无虑童年的年纪&#xff0c;…

SpringBoot3.3.0升级方案

本文介绍了由SpringBoot2升级到SpringBoot3.3.0升级方案&#xff0c;新版本的升级可以解决旧版本存在的部分漏洞问题。 一、jdk17下载安装 1、下载 官网下载地址 Java Archive Downloads - Java SE 17 Jdk17下载后&#xff0c;可不设置系统变量java_home&#xff0c;仅在id…

【python】PyQt5事件传递,鼠标动作捕获,键盘按键捕获原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

深度学习论文: MobileSAMv2: Faster Segment Anything to Everything

深度学习论文: MobileSAMv2: Faster Segment Anything to Everything MobileSAMv2: Faster Segment Anything to Everything PDF:https://arxiv.org/pdf/2312.09579 PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 1 概述 SAM模型应对两大分割任务的挑战&…

数字数据编码为数字信号/编码模式

&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e; 1 非归零编码【NRZ】 2 曼彻斯特编码 3 差分曼彻斯特编码 &#xff5e;&#xff5e;&#xff5e;&#xff…

『C++成长记』vector模拟实现

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、存储结构 二、默认成员函数 &#x1f4d2;2.1构造函数 &#x1f4d2;2.2拷贝…

Unity实现安卓App预览图片、Pdf文件和视频的一种解决方案

一、问题背景 最近在开发app项目&#xff0c;其中有个需求就是需要在app软件内显示图片、pdf和视频&#xff0c;一开始想的解决方案是分开实现&#xff0c;也就是用Image组件显示图片&#xff0c;找一个加载pdf的插件和播放视频的插件&#xff0c;转念一想觉得太麻烦了&#x…

集成excel工具:自定义导入监听器、自定义类型转换器、web中的读

文章目录 I 封装导入导出1.1 定义工具类1.2 自定义读监听器: 回调业务层处理导入数据1.3 定义文件导入上下文1.4 定义回调协议II 自定义转换器2.1 自定义枚举转换器2.2 日期转换器2.3 时间、日期、月份之间的互转2.4 LongConverterIII web中的读IV 其他注意事项应用场景:导入…

Canvas:实现在线动态时钟效果

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…