Eureka 服务注册与发现

目录

前言

注册中心

CAP 理论

常⻅的注册中心

CAP理论对比

Eureka

搭建 Eureka Server

引⼊ eureka-server 依赖

完善启动类

编写配置⽂件

启动服务

服务注册

引⼊ eureka-client 依赖

完善配置⽂件

启动服务

服务发现

引⼊依赖

完善配置⽂件

远程调⽤

启动服务


前言

        在微服务开发中,一个服务通常由一个微服务集群提供,在代码中两个服务之间的服务器是不可能绑定死的,是 n 对 n 的关系,所以对微服务进行管理是很有必要的。

        比如当订单服务需要用到商品信息时就需要发送请求给商品服务,我们要如何找到商品服务呢?可以通过 Eureka 来找到该服务。

        在微服务开发中:

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

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

注册中心

        在最初的架构体系中,集群的概念还不那么流⾏,且机器数量也⽐较少,此时直接使⽤DNS + Nginx 就可以满⾜⼏乎所有服务的发现.相关的注册信息直接配置在 Nginx.但是随着微服务的流⾏与流量的激增,机器规模逐渐变⼤,并且机器会有频繁的上下线⾏为,这种时候需要运维⼿动地去维护这个配置信息是 ⼀个很⿇烦的操作.

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

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

服务提供者(Server):⼀次业务中,被其它微服务调⽤的服务.也就是提供接给其它微服务. 

服务消费者(Client):⼀次业务中,调⽤其它微服务的服务.也就是调⽤其它微服务提供的接⼝.

 • 服务注册中⼼(Registry):⽤于保存 Server 的注册信息,当 Server节点发⽣变更时, Registry 会同步 变更.服务与注册中⼼使⽤⼀定机制通信,如果注册中⼼与某服务⻓时间⽆法通信,就会注销该实例.

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

        服务注册:服务提供者在启动时,向 Registry 注册⾃⾝服务,并向 Registry定期发送⼼跳汇报存活状态. 

        服务发现:服务消费者从注册中⼼查询服务提供者的地址,并通过该地址调⽤服务提供者的接⼝.服务发现的⼀个重要作⽤就是提供给服务消费者⼀个可⽤的服务列表.

CAP 理论

        谈到注册中⼼,就避不开 CA P理论.CAP 理论是分布式系统设计中最基础,也是最为关键的理论.

• ⼀致性(Consistency) CAP 理论中的⼀致性,指的是强⼀致性.所有节点在同⼀时间具有相同的数据

 • 可⽤性(Availability) 保证每个请求都有响应(响应结果可能不对)

 • 分区容错性(Partition Tolerance) 当出现⽹络分区后,系统仍然能够对外提供服务

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

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

正常情况:

⽹络异常:

CP 架构:为了保证分布式系统对外的数据⼀致性,于是选择不返回任何数据

AP 架构:为了保证分布式系统的可⽤性,节点2返回 V0 版本的数据(即使这个数据不正确)

常⻅的注册中心

1. Zookeeper

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

2. Eureka

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

3. Nacos

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

CAP理论对比

        在分布式环境中,即使拿到⼀个错误的数据,也胜过⽆法提供实例信息⽽造成请求失败要好(⽐如淘宝 11.11,京东 618 都是谨遵 AP 原则)

Eureka

        Eureka 是 Netflix OSS 套件中关于服务注册和发现的解决⽅案.Spring Cloud 对 Eureka 进⾏了集成,并作为优先推荐⽅案进⾏宣传,虽然⽬前 Eureka 2.0 已经停⽌维护,新的微服务架构设计中,也不再建议使⽤,但是⽬前依然有⼤量公司的微服务系统使⽤ Eureka 作为注册中⼼.

        Eureka 主要分为两个部分:

         • Eureka Server: 作为注册中⼼ Server 端,向微服务应⽤程序提供服务注册,发现,健康检查等能⼒.

        • Eureka Client: 服务提供者,服务启动时,会向 Eureka Server 注册⾃⼰的信息(IP,端⼝,服务信息 等),Eureka Server 会存储这些信息。服务请求者,会去  Eureka Server 拉取服务列表,知道服务位置后,去获取服务

搭建 Eureka Server

引⼊ eureka-server 依赖

    <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

完善启动类

//开启 Eureka 注册中心服务
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

编写配置⽂件

# Eureka相关配置
# Eureka 服务
server:port: 10010
# Eureka 项目名称
spring:application:name: eureka-server
# Eureka 主机名称
eureka:instance:hostname: localhostclient:fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为falseregister-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

可以看到 eureka-server 已经启动成功了

服务注册

        接下来我们把 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/

启动服务

刷新注册中⼼:http://127.0.0.1:10010

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

服务发现

引⼊依赖

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

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

完善配置⽂件

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

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

远程调⽤

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

核心代码:

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;//注入 DiscoveryClient 对象,来从注册中心拉取服务列表@Autowiredprivate DiscoveryClient discoveryClient;public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);//从 eureka 注册中心获取服务列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");//由于此时服务中心只有一个 product-service 服务,直接获取即可,获取到了 product-service 服务的 IP 地址和端口号String uri = instances.get(0).getUri().toString();String url=uri+"/product/info/"+orderInfo.getProductId();//String url = "http://127.0.0.1:9090/product/info/"+orderInfo.getProductId();//通过 restTemplate 发送 HTTP 请求到指定的接口,并将响应数据封装成对象ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}

启动服务

刷新注册中⼼:http://127.0.0.1:10010

        可以看到服务的请求者和提供者都被记录到注册中心

        访问订单服务接口,获取订单信息:

        可以看到订单服务成功通过注册中心获得了订单服务的 IP 地址以及端口号,发送请求给了商品服务获得了商品信息。 

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

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

相关文章

江协科技51单片机学习- p16 矩阵键盘

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

web安全渗透测试十大常规项(一):web渗透测试之JAVA反序列化

渗透测试之PHP反序列化 1. Java反序列化1.1 Java安全-反序列化-原生序列化类函数1.1.1 原生序列化类函数:1.2 Java安全-SpringBoot框架-泄漏&CVE1. Java反序列化 1、序列化与反序列化 序列化:将内存中的对象压缩成字节流 反序列化:将字节流转化成内存中的对象2、为什么…

数据仓库和数据库有什么区别?

一、什么是数据仓库二、什么是数据库三、数据仓库和数据库有什么区别 一、什么是数据仓库 数据仓库&#xff08;Data Warehouse&#xff09;是一种专门用于存储和管理大量结构化数据的信息系统。它通过整合来自不同来源的数据&#xff0c;为企业提供统一、一致的数据视图&…

SuiNS发布子名及新命名标准,推动Web3身份结构的进步

SuiNS子名是Sui Name Service的强大扩展&#xff0c;最近与新命名标准一起发布。子名允许用户在一个主要的SuiNS名下创建额外的自定义身份&#xff0c;而无需额外费用。用户 gia 可以创建如 gaminggia 或 lendinggia 这样的子名&#xff0c;从而增强个人组织和支持群组与组织的…

通过Socket通信实现局域网下Amov无人机连接与数据传输

1.局域网下的通信 1.1 局域网 厂家提供的方式是通过Homer图数传工具(硬件)构建的amov局域网实现通信连接. 好处是通信距离足够长,支持150m;坏处是"局部",无法访问互联网. &#xff3b;&#xff29;&#xff2d;&#xff21;&#xff27;&#xff25;&#xff1a;…

AGV机器人的调度开发分析(1)- 内核中的路线规划

准备开始写一个系列&#xff0c;介绍下AGV机器人的调度的开发和应用。 按照openTCS的核心内容&#xff0c;国内多家广泛应用于AGV的调度。那么架构图如下&#xff1a; Kernel中有一个是Routing&#xff0c;这是路由规划模块&#xff0c;需要实现的细节功能包括如下&#xff1a…

SpringBoo+vue3+vite整合讯飞星火3.5通过webscoket实现聊天功能(前端代码)附带展示效果

访问地址&#xff1a; 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/site 后端文档&#xff1a; SpringBoovue3整合讯飞星火3.5通过webscoket实现聊天功能&#xff08;全网首发&#xff09;附带展示效果_springboot websocket vue3-CSDN博客https://blog.csdn.net/qq_53722…

2024 年值得推荐的 10 款 iPhone 数据恢复软件

iPhone 从来都不是一个简单的打电话电话。它就像一台微型电脑&#xff0c;让我们互相联系、拍照、拍视频、发邮件、看文档、看书。然而&#xff0c;随着它成为日常生活的必需品&#xff0c;我们总是容易因各种原因丢失数据&#xff0c;如删除、恢复出厂设置、iOS 错误、文件同步…

Django之云存储(二)

一、Django使用云存储 建立项目 django-admin startproject project_demo创建子应用 python manage.py startapp app_name修改配置文件,设置模板视图路径 settings.py TEMPLATES = [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR,…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【13】压力压测JMeter-性能监控jvisualvm

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【13】压力压测JMeter-性能监控jvisualvm 压力测试概述性能指标 JMeter基本使用添加线程组添加 HTTP 请求添加监听器启动压测&查看分析结果JMeter Address Already in use 错误解决 性…

BFS:解决多源最短路问题

文章目录 什么是多源最短路问题&#xff1f;1.矩阵2.飞地的数量3.地图的最高点4.地图分析总结 什么是多源最短路问题&#xff1f; 多源最短路问题&#xff08;Multi-Source Shortest Path Problem&#xff0c;MSSP&#xff09;是图论中的一个经典问题&#xff0c;它的目标是在…

自动化办公04 使用pyecharts制图

目录 一、柱状图 二、折线图 三、饼图 四、地图 1. 中国地图 2. 世界地图 3. 省会地图 五、词云 Pyecharts是一个用于数据可视化的Python库。它基于Echarts库&#xff0c;可以通过Python代码生成各种类型的图表&#xff0c;如折线图、柱状图、饼图、散点图等。 Pyecha…

Spring-bean

Spring 网站&#xff1a;spring.io 两个方面&#xff1a; 简化开发&#xff1a; IoCAOP 框架整合&#xff1a; MyBatis SpringFrameWork系统架构&#xff08;上层依赖下层&#xff09; 解决问题&#xff08;代码耦合度高——模块与模块之间的依赖程度&#xff09; 目标&am…

HarmonyOS父子组件传递参数

HarmonyOS父子组件传递参数 1. 使用State和Prop进行父子组件传递———注意是单向同步 Prop装饰器&#xff1a;父子单向同步 注意&#xff1a;只支持单向同步&#xff0c;同时也只能支持string\number\boolean\enum比较简单的类型。 代码 // 使用 props 进行父子组件传值…

java.io.eofexception:ssl peer shut down incorrectly

可能是因为 1)https设置 2&#xff09;超时设置 FeignConfig.java package zwf.service;import java.io.IOException; import java.io.InputStream; import java.security.KeyStore;import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory;import org.apac…

玄机平台流量特征分析-蚁剑流量分析

前言 蚁剑的流量特征 (1)每个请求体都存在ini_set(“display_errors”, “0”);set_time_limit(0)开头。并且后面存在base64等字符 (2)响应包的结果返回格式为&#xff1a; 随机数 响应内容 随机数 看一下题目要求 步骤1.1 这里要求我们找到木马的连接密码&#xff0c;…

如和完全免费快速访问外网?有亿点点不便利罢了

很鸡肋&#xff0c;但是可以试试 这个手机是真的可以使用谷歌的 不得不说有点意思&#xff0c;但肯定没啥用 地址跳转

每日签到页面模板组件,简单好用,用了会上瘾的那种

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝&#xff09;、快应用等多个平台。 今日给…

消息队列MQ相关面试题

消息队列MQ相关面试题 1 RabbitMQ 1.1 你们项目中哪里用到了RabbitMQ ? 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆☆ 我们项目中很多地方都使用了RabbitMQ , RabbitMQ 是我们项目中服务通信的主要方式之一 , 我们项目中服务通信主要有二种方式实现 : 通过Fei…

Gradle 自动化项目构建-Gradle 核心之 Project

一、前言 从明面上看&#xff0c;Gradle 是一款强大的构建工具&#xff0c;但 Gradle 不仅仅是一款强大的构建工具&#xff0c;它更像是一个编程框架。Gradle 的组成可以细分为如下三个方面&#xff1a; groovy 核心语法&#xff1a;包括 groovy 基本语法、闭包、数据结构、面…