【Eureka】搭建Eureka Server,实现服务注册和服务发现

news/2024/9/15 6:33:34/ 标签: eureka, 云原生

1. Eureka介绍

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

官方文档:https://github.com/Netflix/eureka/wiki

Eureka主要分为两部分:

  • Eureka Server: 作为注册中心Server端,向微服务应用程序提供服务注册,发现,健康检查等能力.
  • Eureka Client: 服务提供者,服务启动时,会向Eureka Server 注册自己的信息(IP,端口,服务信息等),Eureka Server 会存储这些信息

2. 什么是注册中心

在最初的架构体系中,集群的概念还不那么流行,且机器数量也比较少,此时直接使用DNS+Nginx就可以满足几乎所有服务的发现.相关的注册信息直接配置在Nginx.但是随着微服务的流行与流量的激增机器规模逐渐变大,并且机器会有频繁的上下线行为,这种时候需要运维手动地去维护这个配置信息是一个很麻烦的操作,所以开发者们开始希望有这么一个东西,它能维护一个服务列表,哪个机器上线了哪个机器宕机了,这些信息都会自动更新到服务列表上,客户端拿到这个列表,直接进行服务调用即可这个就是注册中心.

注册中心主要有三种角色:

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

他们之间的关系以及工作内容,可以通过两个概念来描述:服务注册:服务提供者在启动时,向 Registry注册自身服务,并向 Registry 定期发送心跳汇报存活状态,

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

常见的注册中心:

1. Zookeeper:Zookeeper的官方并没有说它是一个注册中心,但是国内Java体系,大部分的集群环境都是依赖Zookeeper来完成注册中心的功能
2. Eureka:Eureka是Netflix开发的基于REST的服务发现框架,主要用于服务注册,管理,负载均衡和服务故障转移.
官方声明在Eureka2.0版本停止维护,不建议使用.但是Eureka是SpringCloud服务注册/发现的默认实现,所以目前还是有很多公司在使用.
3. Nacos:Nacos是Spring Cloud Alibaba架构中重要的组件,除了服务注册,服务发现功能之外,Nacos还支持配置管理,流量管理,DNS.动态DNS等多种特性

3. 搭建Eureka Server

Eureka-server时一个独立的微服务,我们可以通过创建子项目的方式创建,当然也可以单独创建一个独立的项目,作为Eureka-server.

3.1 创建Eureka-server子模块

3.2 引入Rureka-server依赖

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

3.3 项目构建插件

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

3.4 编写配置文件

# Eureka相关配置
# Eureka 服务
server:port: 8761
spring:application:name: eureka-server
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/

3.5完善启动类

给该项⽬编写⼀个启动类,并在启动类上添加 @EnableEurekaServer 注解,开启eureka注册中⼼服务

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

3.6 启动服务

启动服务,访问注册中心:http://localhost:8761/

4. 服务注册

服务注册也就是服务提供方需要来做的事情,我这里实现准备好了两个子项目分别是order-service和product-service,分别表示订单服务和商品服务。并且这里订单服务有查询订单的接口,商品服务有查询商品的接口,并且order-service通过RestTemplate远程调用product-service,根据订单查询订单信息时, 根据订单⾥产品ID, 获取产品的详细信息.

https://www.cnblogs.com/54chensongxia/p/11414923.htmlicon-default.png?t=N7T8https://www.cnblogs.com/54chensongxia/p/11414923.html -- RestTemplate 详细使⽤可参考

现在我的场景下的是谁需要来进行服务注册?也就是服务提供者-被调用的一方:product-service.

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

4.1 引入Eureka-client依赖

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

4.2 完善配置文件

添加服务名称和eureka地址

4.3 启动服务

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

5. 服务发现

服务发现就是需要从Eureka中获取到对应的服务,在我们的场景中,order-service从eureka-server拉取product-service的服务信息, 实现服务发现。服务发现就是主动调用的一方。

5.1 引入依赖

这里和前面的服务注册引入的依赖一致,都是引入client

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

5.2 完善配置文件

服务发现也需要知道eureka地址, 因此配置内容依然与服务注册⼀致,都是配置eureka信息
spring:application:name: order-service#Eureka client
eureka:client:service-url:defaultZone: http://127.0.0.1:8761/eureka/

5.3 远程调用

远程调⽤时, 我们需要从eureka-server中获取product-service的列表(可能存在多个服务), 并选择其中⼀个进⾏调⽤。也就是从众多的服务中,选出我们需要的服务,然后使用。
import com.guan.order.mapper.OrderMapper;
import com.guan.order.model.OrderInfo;
import com.guan.product.model.ProductInfo;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.util.List;@Service
@Slf4j
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Resourceprivate DiscoveryClient discoveryClient;@Autowiredprivate RestTemplate restTemplate;public OrderInfo selectOrderByID(Integer orderID){OrderInfo orderInfo = orderMapper.selectOrderById(orderID);// String url =  "http://127.0.0.1:9090/product/"+ orderInfo.getProductId();// 从Eureka获取服务列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");String uri = instances.get(0).getUri().toString();String url =  uri + "/product/"+ orderInfo.getProductId();log.info("远程调用url:{}",url);ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}

需要注意这里使用的是,springframework.cloud.client.discovery包下面的DiscoveryClient。

5.4 启动服务

刷新注册中心:http://localhost:8761/

可以看到order-service已经注册到 eureka上了, 访问接⼝: http://127.0.0.1:8080/order/1
可以看到, 远程调⽤也成功了

6. Eureka和Zookeeper区别

Eureka和Zookeeper都是⽤于服务注册和发现的⼯具,区别如下:
  • Eureka是Netflix开源的项目,而Zookeeper是Apache开源的项目;
  • Eureka基于AP原则,保证高可用,Zookeeper基于CP原则,保证数据一致性
  • Eureka每个节点 都是均等的,Zookeeper的节点区分Leader和Follower 或 Observer,也正因为这个原因,如果Zookeeper的Leader发生故障时,需要重新选举,选举过程集群会有短暂时间的不可用

注:

CAP 三个核心概念:

  1. 一致性 (Consistency):

    • 所有节点在同一时间看到的数据是一致的。
    • 每次读取都可以读取到最近写入的数据(或写入操作发生的错误)。
    • 换句话说,在所有成功的写操作之后,所有节点都应立即反映出相同的数据。
  2. 可用性 (Availability):

    • 每个请求都能接收到非错误的响应——尽管它不保证返回最新写入的数据。
    • 系统始终处于运行状态,并且能够响应请求。
    • 换句话说,即使部分节点发生故障,系统仍然能够正常工作。
  3. 分区容错性 (Partition Tolerance):

    • 系统能够在网络分区(即网络通信中断,节点无法相互通信)的情况下继续运行。
    • 分布式系统中存在网络分区时,仍然能够继续提供一致性和可用性(需要在一致性和可用性之间做权衡)。
    • 系统必须能够处理任意数量的消息丢失或延迟,并保证系统的正常运行。

CAP 定理的核心结论:

在一个分布式系统中,同时满足一致性、可用性和分区容错性这三者是不可能的,只能最多满足其中的两项:

  • CA(一致性 + 可用性): 系统在网络没有分区的情况下保证一致性和可用性。

    • 例子:传统的关系型数据库(如 MySQL 在单节点配置下),在网络分区出现时,系统无法继续正常工作。
  • CP(一致性 + 分区容错性): 系统在网络分区的情况下选择一致性,但牺牲了一定的可用性。

    • 例子:Zookeeper、HBase 等系统在网络分区发生时,会拒绝部分请求来维持一致性。
  • AP(可用性 + 分区容错性): 系统在网络分区的情况下选择可用性,但可能牺牲一致性。

    • 例子:Cassandra、DynamoDB 等系统在网络分区时仍然能处理请求,但不同节点可能返回不同的数据(最终一致性)。

http://www.ppmy.cn/news/1519908.html

相关文章

数据访问:JPA

文章目录 JPA的由来JPA是什么Spring Data JPA快速上手 JPA的由来 ORM框架能够将Java对象映射到关系型数据库中&#xff0c;能够直接持久化复杂的 Java对象。ORM框架的出现&#xff0c;可以让开发者从数据库编程中解脱出来&#xff0c;把更多的精力放在业务模型与业务逻辑上。目…

k8s-pod 实战八 (gRPC 探测详细分析)

gRPC 探测详细分析 在 Kubernetes 中,探针(Probe)用于检查应用程序的健康状态和就绪状态。尽管 Kubernetes 原生支持 HTTP 和 TCP 探针,但对于 gRPC 服务,你需要借助第三方工具来实现探测。grpc-health-probe 是一个常用的工具,它专门用于探测 gRPC 服务的健康状态。 实…

KeePassXC软件简介

KeePassXC 是一款开源且免费的跨平台密码管理器&#xff0c;它允许用户在不同的网站和服务上使用多个不同的密码&#xff0c;而无需记住它们。用户只需要记住一个主密码或者持有一个密钥文件&#xff0c;就可以访问所有密码的加密数据库。KeePassXC 支持 AES 加密算法&#xff…

《C++20 特性综述》

《C20 特性综述》 在编程世界中&#xff0c;C一直以其强大的性能和灵活性占据着重要地位。随着时间的推移&#xff0c;C不断发展和演进&#xff0c;C20 带来了一系列令人瞩目的新特性&#xff0c;为开发者提供了更强大的工具和更高效的编程方式。 一、概念&#xff08;Concep…

大模型技术 | 基于 Langchain 和 Streamlit,构建多 PDF RAG 聊天机器人

与 PDF 互动是很酷的。你可以与你的笔记、书籍和文档等进行聊天。 本文将帮助你构建一个基于 Multi RAG Streamlit 的 Web 应用程序&#xff0c;通过对话 AI 聊天机器人来读取、处理和互动PDF数据。 以下是该应用程序的工作步骤&#xff0c;用简单的语言进行说明。 配置必要的…

JDK原理

当我们谈论JDK&#xff08;Java Development Kit&#xff09;的原理时&#xff0c;实际上是在探讨Java语言及其开发环境背后的技术和设计思想。JDK是Java编程语言的核心工具包&#xff0c;它包含了Java运行环境&#xff08;JRE&#xff09;、Java编译器&#xff08;javac&#…

2 html5 浏览器已经支持的新API

HTML5规范下很多API浏览器都已经支持&#xff0c;这里我们列举几个很常用的浏览器支持的API: 1 tab页之间通信: BroadcastChannel(channelName); 可用于多个不同浏览器tab页之间通信。实例化的时候Channel名称必须相同。 const broadcastChannel new BroadcastChannel(myC…

39次8.29(了解docker-compose,docker-compose编排容器,配置harbor服务)

1.使用使用docker-compose编排容器 1.YAML ⽂件的格式和语法 1&#xff09;YAML ⽂件格式 yaml 是⼀种标记语⾔很直观的数据序列化格式&#xff0c;可读性很⾼。 类似于 xml 描述性语⾔&#xff0c;语法⽐xml简单的很多。 yaml 数据结构通过缩进进⾏表示&#xff0c;连续的…

金九银十来了,你准备好了吗?——迎接技术行业的旺季

每年的九月和十月&#xff0c;对于技术行业来说&#xff0c;是一个特别的时期。这个时期被业界称为“金九银十”&#xff0c;意味着招聘和项目开发的高峰期。对于技术人员而言&#xff0c;这不仅是一个职业发展的黄金时期&#xff0c;也是技术能力提升和职业规划的关键时刻。那…

RAG中pdf解析的方法全览

RAG中解析PDF的方法 一 pdf格式都有哪些 1.机器生成的pdf文件&#xff0c;包含图像&#xff0c;文本&#xff0c;可以被编辑 2.传统扫描文档&#xff0c;表现为图像&#xff0c;不能被编辑 3.带OCR的扫描文档。可能转OCR的过程中带入了错误。 二 pdf解析全科指南 全面指南…

设计模式 8 组合模式

设计模式 8 创建型模式&#xff08;5&#xff09;&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式&#xff08;7&#xff09;&#xff1a;适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff0…

golang 于 goland 无法运行

命令行 go build -o main.go 等等 报出 # command-line-arguments runtime.main_mainf: function main is undeclared in the main package 直接goland运行 爆出 command-line-arguements 等等 goland中直接删除配置( Edit Configurations )&#xff0c;或者把运行模式从 Fil…

redis主从+高可用切换+负载均衡

1. redis主从配置 # 在master中 cp sentinel.conf /etc/redis/ vim /etc/redis/sentinel.conf scp /etc/redis/sentinel.conf server2:/etc/redis/ scp /etc/redis/sentinel.conf server3:/etc/redis/ redis-sentinel /etc/redis/sentinel.conf # 启动监控# 在slave中 redis-s…

第十三节:学习Springboot整合mybatis——完整篇(自学Spring boot 3.x的第三天)

大家好&#xff0c;今天记录下学习springboot的第三天。​网创有方 这节详细记录了如何使用springboot整合mybatis方法&#xff0c;并成功实现将请求信息插入本地的mysql数据库。 由于只是为了方便本地验证&#xff0c;实际项目是需要部署到服务器上去的&#xff0c;所以就采用…

“NoSQL数据库技术及其应用”写作框架,软考高级,系统架构设计师

论文真题 随着互联网web2.0网站的兴起&#xff0c;传统关系数据库在应对web2.0 网站&#xff0c;特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心&#xff0c;暴露了很多难以克服的问题&#xff0c;而非关系型的数据库则由于其本身的特点得到了非常迅速的发展…

汽车免拆诊断案例 | 2012 款大众速腾车发动机偶尔抖动

故障现象 一辆2012款大众速腾车&#xff0c;搭载CST发动机和干式双离合变速器&#xff0c;累计行驶里程约为17万km。车主反映&#xff0c;发动机偶尔抖动。 故障诊断 接车后试车&#xff0c;确认发动机怠速偶尔抖动&#xff0c;且在D挡起步时抖动明显。用故障检测仪检测&…

仿论坛项目--开发社区首页

• 开发流程 1次请求的执行过程 • 分步实现开发社区首页&#xff0c;显示前10个帖子开发分页组件&#xff0c;分页显示所有的帖子 项目调试技巧 • 响应状态码的含义 • 服务端断点调试技巧 • 客户端断点调试技巧 • 设置日志级别&#xff0c;并将日志输出到不同的终端 h…

刷题记录(2)

1. HWOD机试 - 模拟消息队列(100) package com.yue.test;import org.junit.Test;import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List;/*** Author: 夜雨* Date: 2021-12-08-10:31* Description:* Version 1.0*/ public…

SAPUI5基础知识25 - 聚合绑定(Aggregation Binding)

1. 背景 Aggregation Binding 是 SAPUI5 中的一种数据绑定方式&#xff0c;用于将数据模型中的集合&#xff08;如数组&#xff09;绑定到 UI 控件的聚合&#xff08;如列表项、表格行等&#xff09;。 常见的场景包括将一个数组绑定到 sap.m.List 的 items 聚合&#xff0c;…

如何定义核心场景用例?

​首先我们解决两个问题&#xff1a; 1.什么是场景测试&#xff1f; 2.什么是核心场景&#xff1f; 1、什么是场景测试&#xff1f; &#x1f3af; 1.1&#xff1a;什么是场景 事件触发时的情景形成了场景。场景必不可少的几个要素&#xff1a;环境、人、时间、行为。简而…