【SpringCloud】注册中心 && 服务注册 && 服务发现 && Eureka

【SpringCloud】注册中心 && 服务注册 && 服务发现 && Eureka

文章目录

在这里插入图片描述

Ⅰ. 背景

一、问题描述

上个章节的例子中可以看到,远程调用时,我们的 URL 是写死的:

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

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

二、注册中心

注册中心(Service Registry / Service Discovery Center)是微服务架构中一个核心组件,用来管理和维护服务实例的“地址簿”。它的核心作用是让服务能够动态发现其他服务的位置,而不依赖固定的 IP 或端口

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

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

注册中心主要负责两件事:

  1. 服务注册(Service Registration)
    1. 当一个服务实例启动时,它会把自己的信息(服务名、IP、端口、健康状态等)注册到注册中心。
    2. 示例:服务 A 启动 → 向注册中心注册自己为 A:IP:PORT
  2. 服务发现(Service Discovery)
    1. 当一个服务需要调用另一个服务时,它不再去找固定 IP,而是向注册中心查询目标服务的可用实例列表。
    2. 示例:服务 B 需要调用服务 A → 查询注册中心 → 获取 A 的可用实例 → 调用。
  3. 健康检查(Health Check,可选)
    • 注册中心通常会定期检查服务实例的状态,发现异常则剔除,保证服务调用可靠性。
在这里插入图片描述

三、CAP理论

CAP 理论是分布式系统设计中最基础,也是最为关键的理论。

在这里插入图片描述
  • 一致性(Consistency):CAP 理论中的一致性,指的是强一致性,即所有节点在同一时间具有相同的数据。
  • 可用性(Availability):保证每个请求都有响应,但是响应结果可能是旧的。
  • 分区容错性(Partition Tolerance):当出现网络分区后,系统仍然能够对外提供服务。

一个分布式系统不可能同时满足数据一致性,服务可用性和分区容错性这三个基本需求,最多只能同时满足其中的两个。

在分布式系统中,系统间的网络不能 100% 保证健康,服务又必须对外保证服务,因此 Partition Tolerance 不可避免,那就只能在 Consistency 和 Availability 中选择一个,也就是 CP 或者 AP 架构。

  • CP架构: 为了保证分布式系统对外的数据一致性,可能选择不返回任何数据
  • AP架构: 为了保证分布式系统的可用性,即使这个数据不正确

更多参考:https://cloud.tencent.com/developer/article/1860632

四、常见的注册中心

① Zookeeper

Zookeeper 的官方并没有说它是一个注册中心,但是国内 Java 体系大部分的集群环境都是依赖 Zookeeper 来完成注册中心的功能。

② Eureka

Eureka 是 Netflix 开发的基于 REST 的服务发现框架,主要用于服务注册、管理、负载均衡和服务故障转移。

官方声明在 Eureka2.0 版本停止维护,不建议使用。但是 Eureka 是 SpringCloud 服务注册/发现的默认实现,所以目前还是有很多公司在使用。

③ Nacos

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

CAP对比

ZookeeperEurekaNacos
CAP理论CPAPCP或AP (默认AP)

在分布式环境中,即使拿到一个错误的数据,也胜过无法提供实例信息而造成请求失败要好,比如淘宝双十一、京东618都是谨遵AP原则。

Ⅱ. Eureka介绍

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

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

Eureka主要分为两个部分:

  • EurekaServer 作为注册中心 Server 端,向微服务应用程序提供服务注册、服务发现、健康检查等功能。
  • EurekaClient 服务提供者,服务启动时,会向 EurekaServer 注册自己的信息(IP、端口、服务信息等信息),然后 EurekaServer 会存储这些信息。

通常Eureka-server作为一个独立的微服务!

Ⅲ. 搭建EurekaServer

一、创建Eureka-server子模块

在这里插入图片描述

二、引入eureka-server依赖

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

三、添加maven项目构建插件

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

四、完善启动类

给该项目编写一个启动类,并在启动类上添加 @EnableEurekaServer 注解,开启 eureka 注册中心服务。

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@EnableEurekaServer@SpringBootApplicationpublicclassEurekaServerApplication{publicstaticvoidmain(String[] args){SpringApplication.run(EurekaServerApplication.class, args);}}

五、编写配置文件

server:port:10010spring:application:name: eureka-server eureka:instance:hostname: localhost client: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 上了:

在这里插入图片描述

Ⅴ. 服务发现

接下来修改 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 的列表(可能存在多个服务),并选择其中一个进行调用。

所有微服务要从注册中心(如 Eureka、Consul、Nacos)拉取服务实例信息,靠的就是DiscoveryClient

@Slf4j@ServicepublicclassOrderService{@AutowiredprivateOrderMapper orderMapper;@ResourceprivateDiscoveryClient discoveryClient;@AutowiredprivateRestTemplate restTemplate;publicOrderInfoselectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);//String url = "http://127.0.0.1:9090/product/"+ orderInfo.getProductId();// 根据应用名称获取服务列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");// 服务可能有多个, 获取第一个EurekaServiceInstance instance =(EurekaServiceInstance) instances.get(0); log.info(instance.getInstanceId());// 拼接urlString url = instance.getUri()+"/product/"+ orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url,ProductInfo.class); orderInfo.setProductInfo(productInfo);return orderInfo;}}

四、启动服务

刷新注册中心:http://127.0.0.1:10010/,可以看到 order-service 已经注册到 eureka 上了。

在这里插入图片描述

访问接口:http://127.0.0.1:8080/order/1,可以看到,远程调用也成功了。

Ⅵ. Eureka和Zookeeper区别

Eureka 和 Zookeeper 都是用于服务注册和发现的工具,区别如下:

  1. Eureka 是 Netflix 开源的项目,而 Zookeeper 是 Apache 开源的项目。
  2. Eureka 基于 AP 原则,保证高可用,而 Zookeeper 基于 CP 原则,保证数据一致性。
  3. Eureka 每个节点都是均等的,而 Zookeeper 的节点区分 Leader 和 Follower/Observer,也正因为这个原因,如果 Zookeeper 的 Leader 发生故障时,需要重新选举,选举过程集群会有短暂时间的不可用。
在这里插入图片描述

Read more

Java 大视界 -- Java 大数据在智能教育学习成果评估体系完善与教育质量提升中的深度应用(434)

Java 大视界 -- Java 大数据在智能教育学习成果评估体系完善与教育质量提升中的深度应用(434)

Java 大视界 -- Java 大数据在智能教育学习成果评估体系完善与教育质量提升中的深度应用(434) * 引言: * 正文: * 一、Java 大数据赋能智能教育评估的核心逻辑 * 1.1 教育评估数据特性与 Java 技术栈的精准适配 * 1.1.1 核心价值:从 “经验驱动” 到 “数据驱动” 的范式跃迁 * 1.2 数据流转与评估建模的底层逻辑 * 二、核心技术架构与落地路径(可直接复用) * 2.1 分层解耦的高可用架构设计 * 2.1.1 采集层:高并发多端数据接入(Java + Kafka) * 2.1.2 处理层:Spark + Hive 实现海量数据清洗与建模 * 2.1.

By Ne0inhk
华为OD机试双机位C卷真题:自动化维修流水线(C/C++/Java/Python/Go/JS)

华为OD机试双机位C卷真题:自动化维修流水线(C/C++/Java/Python/Go/JS)

自动化维修流水线 华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 小伙伴反馈题目大意:给定m条流水线,流水线可并行处理维修任务,给出n个任务,并给出每个任务的执行时间,要求完成所有任务的最短时间。 输入描述 第一行输入 任务数n和流水线数量m,用空格分割 第二行输入 每个任务完成所用时间 输出描述 输出最短执行完成所有任务数量 用例1 输入 10 1 10 20 30 5 5 5 5 10 5 10 输出 105 题解 思路:二分 + 递归回溯

By Ne0inhk

2026年人工智能发展趋势:效率重构、生态协同与规范前行

进入2026年,人工智能产业告别了对参数规模的盲目追逐,迈入“技术提质、产业落地、治理完善”的三重迭代期。技术层面,大模型向高效化演进、小模型实现场景突围,智能体能力持续升级;产业层面,AI与实体经济深度融合,从辅助工具向核心生产力转变;治理层面,全球监管规则加速落地,安全与合规成为行业发展的前置条件。本文结合真实案例与权威数据,拆解2026年人工智能的核心发展趋势,呈现技术变革与产业实践的真实图景。 趋势一:范式转移,小模型崛起重构AI效率格局 2026年成为小模型发展的分水岭,AI行业从“规模崇拜”转向“效率优先”,核心驱动力源于大模型边际效益递减与能源成本高企的双重压力。国际能源署测算,2026年AI相关电力消耗将相当于日本全国用电量,粗放式的参数扩张模式已难以为继,而“密度定律”的普及推动行业转向精细化运营——通过技术优化让模型更“小”且能力更强,小模型不再是大模型的简化版,而是针对特定场景的高效解决方案。 小模型的突破集中在特定任务性能、成本控制与端侧部署三大维度。性能上,小模型在垂直领域已实现对前沿大模型的超越:微博自研的VibeThinker模型仅15亿参数,却在

By Ne0inhk
AI评估建议可信度:破解决策迷局

AI评估建议可信度:破解决策迷局

demo:更新决策数学模型的版本https://www.coze.cn/s/yCV7zGc-F6A/ #人的一生处处在决策,决策的好坏决定结果有没有遗憾,有的人寻求外在建议综合决策,而无法判断建议是否可靠,因此,提出Cognitive Trustworthiness Evaluator, CTE,这是一个极具潜力且前沿的交叉领域项目——将认知科学、行为经济学、概率推理与人工智能结合,构建一个基于认知偏差建模的建议可信度评估智能体(Cognitive Trustworthiness Evaluator, CTE) 一、项目目标 构建一个智能体(Agent),通过分析用户在表达观点、提出建议时所体现出的认知特征(尤其是与概率感、事后归因、幸存者偏差、反事实思维等相关的模式),对其认知可靠性进行量化评分,并据此判断其建议是否值得采纳。 核心假设:一个人对不确定性的理解能力(即“概率感”)及其对因果关系的误判倾向,是其建议质量的重要预测指标。 二、理论基础与关键维度 我们聚焦以下五个核心认知维度,每个维度均有心理学/行为经济学实证支持: 表格 维度定义行为表现可观测信

By Ne0inhk