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: 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

可以看到 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 {
    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;

    //注入 DiscoveryClient 对象,来从注册中心拉取服务列表
    @Autowired
    private 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 地址以及端口号,发送请求给了商品服务获得了商品信息。 

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

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

相关文章

【设计模式深度剖析】【9】【行为型】【访问者模式】| 以博物馆的导览员为例加深理解

&#x1f448;️上一篇:备忘录模式 | 下一篇:状态模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 文章目录 访问者模式定义英文原话直译如何理解呢&#xff1f; 访问者模式的角色类图代码示例 访问者模式的应用优点缺点使用场景 示例解析:博物馆的导览员代码示例 访问…

uni-app与原生插件混合开发调试3-安卓原生插件开发调试和打包

安卓原生插件开发调试和打包 上面已经介绍了怎么安装开发和调试环境&#xff0c;接下来就是安卓原生插件的具体开发和调试步骤&#xff1a; 将uniapp前端项目的index.vue文件新增代码。代码如图所示&#xff1a; <template><view><view><text>{{titl…

GaussDB关键技术原理:高性能(二)

GaussDB关键技术原理&#xff1a;高性能&#xff08;一&#xff09;从数据库性能优化系统概述对GaussDB的高性能技术进行了解读&#xff0c;本篇将从查询处理综述方面继续分享GaussDB的高性能技术的精彩内容。 2 查询处理综述 内容概要&#xff1a;本章节介绍查询端到端处理的…

Go团队的工作方式

在Go 1.23版本[1]即将发布(2024.8)之前&#xff0c;在GopherCon 2024[2]开幕(2024.7)之前&#xff0c;Go团队成员Cameron Balahan(Go产品负责人)[3]、 Sameer Ajmani&#xff08;Go团队工程总监&#xff09;和Russ Cox&#xff08;Go团队技术负责人&#xff09;[4]参加了业界知…

2024 年最新 Python 基于火山引擎豆包大模型搭建 QQ 机器人详细教程(更新中)

豆包大模型概述 火山引擎官网&#xff1a;https://www.volcengine.com/ 字节跳动推出的自研大模型。通过字节跳动内部50业务场景实践验证&#xff0c;每日千亿级tokens大使用量持续打磨&#xff0c;提供多模态能力&#xff0c;以优质模型效果为企业打造丰富的业务体验。 模型…

“论云原生架构及其应用”写作框架,系统架构设计师

论文真题 近年来&#xff0c;随着数字化转型不断深入&#xff0c;科技创新与业务发展不断融合&#xff0c;各行各业正在从大工业时代的固化范式进化成面向创新型组织与灵活型业务的崭新模式。在这一背景下&#xff0c;以容器和微服务架构为代表的云原生技术作为云计算服务的新…

智能化改造助力企业高质量发展

引言 背景介绍 在当今全球经济环境中&#xff0c;变化和不确定性已成为常态。企业面临的竞争压力不断增加&#xff0c;市场竞争日益激烈。新兴市场的崛起、技术进步和消费者需求的快速变化&#xff0c;使得传统的商业模式和生产方式面临巨大挑战。为了在这样的环境中保持竞争力…

Go语言之基础入门

网站&#xff1a;http://hardyfish.top/ 免费书籍分享&#xff1a; 资料链接&#xff1a;https://url81.ctfile.com/d/57345181-61545511-81795b?p3899 访问密码&#xff1a;3899 免费专栏分享&#xff1a; MySQL是怎样运行的从根儿上理解MySQL 课程链接&#xff1a;https:/…

(13)DroneCAN 适配器节点(一)

文章目录 前言 1 特点 2 固件 3 ArduPilot固件DroneCAN设置 4 DroneCAN适配器节点 前言 这些节点允许现有的 ArduPilot 支持的外围设备作为 DroneCAN 或 MSP 设备适应 CAN 总线。这也允许扩展自动驾驶仪硬件的功能。如允许 I2C 设备&#xff08;如罗盘或空速&#xff09…

网信办公布第六批深度合成服务算法备案清单,深兰科技大模型入选

6月12日&#xff0c;国家互联网信息办公室发布了第六批深度合成服务算法备案信息&#xff0c;深兰科技硅基知识智能对话多模态大模型算法通过相关审核&#xff0c;成功入选该批次《境内深度合成服务算法备案清单》。同时入选的还有腾讯混元大模型多模态算法、支付宝图像生成算法…

什么样的落地台灯比较好?五款宝藏可靠护眼大路灯推荐

现代家庭中&#xff0c;落地台灯也逐渐的代替传统台灯&#xff0c;成为许多孩子在读写时的照明神器&#xff0c;它已经被许多家长认可&#xff0c;宽广的光线光线清晰&#xff0c;视觉上舒适了不少。然而&#xff0c;目前市场上有许多品牌未经过充分的技术、材质和工艺研究&…

OpenCV颜色检测

OpenCV颜色检测 前言策略分析根据颜色检测目标对象相关链接 前言 绿幕技术是一种经典的视频编辑技术&#xff0c;可以用于将人物置于不同的背景中。例如在电影制作中&#xff0c;技术的关键在于演员不能身着特定颜色的衣服(比如绿色)&#xff0c;站在只有绿色的背景前。然后&a…

【Nginx】Nginx安装及简单使用

https://www.bilibili.com/video/BV1F5411J7vK https://www.kuangstudy.com/bbs/1353634800149213186 https://stonecoding.net/system/nginx/nginx.html https://blog.csdn.net/qq_40492693/article/details/124453090 Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器。其特…

Benchmarking Panoptic Scene Graph Generation (PSG), ECCV‘22 场景图生成,利用PSG数据集

2080-ti显卡复现 源代码地址 Jingkang50/OpenPSG: Benchmarking Panoptic Scene Graph Generation (PSG), ECCV22 (github.com) 安装 pytorch 1.7版本 cuda10.1 按照readme的做法安装 我安装的过程如下图所示,这个截图是到了pip install openmim这一步 下一步 下一步 这一步…

【八】【QT开发应用】QTcreate项目打包成.exe文件或.apk文件,EnigmaVirtualBox软件下载,虚拟网站代打开QT应用

EnigmaVirtualBox下载 Enigma Virtual Box QTcreate项目打包成.exe可执行文件 找到自己写好的项目的.exe文件 将这个文件复制到一个新的文件夹里面 在这个新的文件夹里面打开cmd,这样可以使得cmd直接进入到该文件夹 打包.exe命令行 输入下面的命令行 windeployqt game…

写一个坏越的个人天地(二)

小红书上搜了下博客,感觉好像没有让自己喜欢的。昨天刚好学了点grid布局,来试试 菜单栏直接使用el-menu 下边布局就用grid局部了,这块初步想法是轮播+你的天气和我的天气+自我介绍 天气的话,这边要先找一下有没有天气的api 我这边百度搜了个聚合的api,一天可以免费调用5…

u盘sd卡格式化怎么恢复,3种恢复方法教学

u盘sd卡格式化怎么恢复&#xff0c;这是许多人在误操作后最关心的问题。我们会详细介绍五种有效的恢复方法&#xff0c;并且提供恢复原理的教学视频&#xff0c;帮助您轻松找回U盘和SD卡上被格式化的数据。 一. 数据存储与恢复的原理 1. U盘、移动硬盘、硬盘以及固态盘存储数据…

晶谷电子器件烧结封装介质材料 绝缘用晶谷低温封接环保玻璃粉 耐压高

电子器件烧结封装介质材料是用于保护和封装电子器件的关键材料。 常见的电子器件烧结封装介质材料包括以下几种&#xff1a; 1. 陶瓷材料&#xff1a;具有良好的绝缘性能、耐高温性能和机械强度。 2. 高分子材料&#xff1a;如环氧树脂等&#xff0c;具有良好的柔韧性和耐湿…

安卓手机autox.js连接电脑vscode服务

开通电脑防火墙 好多提示需要将端口通过防火墙放行&#xff0c;没有交怎么放行的。按照下方入站和出站规则都添加好的话就可以放行端口。 启动adb 本地中找到adb的目录&#xff0c;使用下方的两个命令&#xff0c;开启和结束。 adb start-server adb kill-server开启开发者…

电脑网络动态IP配置:步骤详解与实用指南

在构建和管理电脑网络时&#xff0c;IP地址的配置是一个关键步骤。IP地址是设备在网络中的唯一标识符&#xff0c;它决定了设备如何与其他设备进行通信。有两种主要的IP地址类型&#xff1a;静态IP和动态IP。静态IP是手动配置的&#xff0c;而动态IP则是由网络中的DHCP服务器自…