Eureka 服务注册与发现

news2024/11/25 11:52:52

目录

前言

注册中心

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 地址以及端口号,发送请求给了商品服务获得了商品信息。 

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

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

相关文章

光明致优尊耀呈现“柏林爱乐在上海”音乐会正式开幕,奏响盛夏狂热乐章

2024年6月26日&#xff0c;由光明致优尊耀呈现的中国上海国际艺术节特别项目“柏林爱乐在上海”音乐会正式开幕。暌违七年&#xff0c;世界顶级交响乐团——柏林爱乐乐团再度访沪&#xff0c;在首席指挥基里尔别特连科率领下&#xff0c;正式在中国上海国际艺术节登台演出&…

Zynq MPSoC / RFSoC 动态配置 DIMM DDR

目录 名词释义硬软件版本Zynq MPSoC / RFSoC 动态 DDR 配置简介具体操作方法PCW GUI 配置启用动态 DDR 配置功能I2C 硬件要求根据硬件修改 FSBL初始化 I2C 控制器选择 I2C Mux 的 Slave读取 EEPROM 的第一页读取 EEPROM 的第二页 调试参考文档 本文首发于 Josh Gao 的博客&…

自动化测试小技巧之Airtest-Selenium和Excel的无缝协作

一、前言 之前在问卷以及Q群上有同学有提出过能否将网页上的一些数据通过Airtest去导出生成一份Excel&#xff0c;那么我们今天一起讨论一下&#xff0c;我们应该如何去实现&#xff0c;以及当我们获取的数据类型不同的时候&#xff0c;获取的方式该怎么随之调整&#xff1f; …

实现在父盒子中点击生成子盒子并识别父盒子边界不溢出

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</…

高级运维工程师讲述银河麒麟V10SP1服务器加固删除snmp服务引起keeplived莫名连带删除引起生产事故实战

高级运维工程师讲述银河麒麟V10SP1服务器加固删除snmp服务引起keeplived莫名连带删除引起生产事故实战 一、核实操作系统信息 uname -a Linux localhost.localdomain 4.19.90-23.8.v2101.ky10.x86_64 #1 SMP Mon May 17 17:08:34 CST 2021 x86_64 x86_64 x86_64 GNU/Linuxcat…

【AMBA】APB总线的个人学习记录(一):理论知识

精通APB (Advanced Peripheral Bus) 总线设计通常意味着你不仅理解其基础概念&#xff0c;而且能够在实际的硬件设计中灵活运用APB总线&#xff0c;解决复杂问题&#xff0c;并优化设计。以下是一些关键点&#xff0c;当你掌握这些方面时&#xff0c;可以说你对APB总线设计有了…

004-GeoGebra基础篇-GeoGebra的布局

注意&#xff0c;为保证大家的GeoGebra的学习顺利从基础、中级到高级的过度&#xff0c;本教程笔记有此要求&#xff1a; 必须使用英文版GeoGebra&#xff08;虽说GeoGebra也支持汉字写算式&#xff0c;但强烈不建议&#xff0c;因为一个英文翻译过来的中文真是五花八门&#…

网店管家婆与金蝶云星空对接集成往来单位查询接口打通客户新增

网店管家婆与金蝶云星空对接集成往来单位查询接口打通客户新增 对接系统网店管家婆 目前网上管家婆已服务超十万家海内外企业级用户&#xff0c;覆盖了服装配饰、食品酒水、数码3C、美妆日护、医疗保健、母婴用品、五金工具等等行业。 对接系统&#xff1a;金蝶云星空 金蝶K/3C…

如何高效管理TikTok账号?TK矩阵防关联测评养号引流系统揭秘

TK矩阵防关联测评自养号系统是为TikTok&#xff08;TK&#xff09;平台设计的&#xff0c;旨在帮助卖家实现多账号管理、防关联以及自动化测评和养号的功能。该系统通过一系列的技术手段和创新功能&#xff0c;为跨境电商运营者提供了强大的支持。 系统核心优势 1. 全球真实环…

5000字深入讲解:企业数字化转型优先从哪个板块开始?

很多企业都知道数字化转型重要&#xff0c;但不知道应该怎样入手&#xff0c;分哪些阶段。以下引用国内领先数字化服务商 织信Informat 的数字化转型方法论材料&#xff0c;且看看他们是如何看待数字化转型的&#xff1f;数字化转型应该从哪先开始&#xff1f;如何做&#xff1…

一个好玩的 AI 产品,一起来玩儿梗

欢迎贡献你的扎心梗图&#xff1a; - 万物皆可meme介绍&#xff1a;https://hqexj12b0g.feishu.cn/wiki/space/7385353047184375810 - 任何人都可以编辑的玩梗集&#xff1a;https://hqexj12b0g.feishu.cn/wiki/

Redis-Bitmap位图及其常用命令详解

1.Redis概述 2.Bitmap Bitmap 是 Redis 中的一种数据结构&#xff0c;用于表示位图&#xff08;bit array&#xff09;。 它通常用于处理大规模数据集中每个元素的状态&#xff0c;比如用户的在线/离线状态&#xff08;每个用户对应一个位&#xff0c;表示在线&#xff08;1&a…

【课程总结】Day12:YOLO的深入了解

前言 在【课程总结】Day11&#xff08;下&#xff09;&#xff1a;YOLO的入门使用一节中&#xff0c;我们已经了解YOLO的使用方法&#xff0c;使用过程非常简单&#xff0c;训练时只需要三行代码&#xff1a;引入YOLO&#xff0c;构建模型&#xff0c;训练模型&#xff1b;预测…

分类预测 | PSO-PNN基于粒子群算法优化概率神经网络的数据分类预测(Matlab)

分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别 目录 分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.PSO-PNN基于粒子群算法优化概率神经网络的数据…

SQLite:一个极简使用教程

SQLite是一个轻量级的、文件系统基础的数据库&#xff0c;它被设计为配置简单、易于部署。SQLite数据库存储在一个单一的磁盘文件中&#xff0c;这意味着数据库的创建和维护都非常简单。 1. SQLite特点 轻量级&#xff1a;SQLite不需要一个独立的服务器进程。它是一个嵌入式SQ…

Steam夏促遇到社区打不开、社区进不去的处理措施一览

在Steam夏促中&#xff0c;绝大部分Steam游戏都会有折扣优惠&#xff0c;包括一些3A大作在夏促中也会降价售卖&#xff0c;玩家可以低价购买到自己心仪的游戏。不少玩家进入Steam社区查看游戏评价时遇到社区打不开、社区进不去的情况&#xff0c;不知道怎么解决&#xff0c;下面…

Pycharm一些问题解决办法

研究生期间遇到关于Pycharm一些问题报错以及解决办法的汇总 ModuleNotFoundError: No module named sklearn’ 安装机器学习库&#xff0c;需要注意报错的sklearn是scikit-learn缩写。 pip install scikit-learnPyCharm 导包提示 unresolved reference 描述&#xff1a;模块…

React小记(五)_Hooks入门到进阶

React 16.8 版本 类组件 和 函数组件 两种组件共存&#xff0c;到目前 React 18 版本&#xff0c;官方已经不在推荐使用类组件&#xff0c;在函数组件中 hooks 是必不可少的&#xff0c;它允许我们函数组件像类组件一样可以使用组件的状态&#xff0c;并模拟组件的生命周期等一…

新手向导:掌握Axure RP的第一步

其实很多时候&#xff0c;我们很容易把教程做得太复杂&#xff0c;让学生失去重点被复杂的理论吓到。入门基础的时候只需要先弄清楚两个核心内容&#xff0c;学起来就容易多了:一是简单了解这个软件&#xff0c;二是学习这个软件的基本操作。所以如果你问我什么是好的 Axure RP…

chrome 配置允许跨域

目录 1.Chrome跨域插件配置 1.1启动插件 1.2. 设置本地调试跨域 2 Firefox跨域插件 2.1. 安装插件 CORS Everywhere 2.2. 启动插件 3 工具下载链接 1.Chrome跨域插件配置 使用chrome插件“Allow CORS: Access-Control-Allow-origin ”来解决跨域问题。 点击pin图标&…