微服务的“指南针”——深入解析 Eureka 服务注册与发现(超详细版)

举报
bug菌 发表于 2025/03/20 12:12:14 2025/03/20
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 🎉 前言:微服务时代,如何高效管理服务?  在单体架构时代,所有的模...

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

🎉 前言:微服务时代,如何高效管理服务?

  在单体架构时代,所有的模块都集中在一个项目里,服务之间的调用很简单,直接方法调用就能搞定。然而,随着业务规模的扩大,单体架构的问题也暴露出来

  • 代码庞大、难以维护:所有的业务代码都集中在一个项目里,一旦出问题,修复起来就像在一根巨大的毛线团里找线头。
  • 部署困难:每次上线都要部署整个应用,即使改动的只是某个小模块。
  • 扩展性受限:无法对某个高并发模块单独扩容,必须整个应用一起扩展,浪费资源。

为了解决这些问题,微服务架构应运而生!但是微服务架构虽然解决了单体架构的问题,同时也带来了新的挑战:

多个微服务之间如何相互通信?

如何动态地管理微服务的注册和发现?

如果某个服务宕机了,其他服务如何应对?

如果没有一个高效的服务注册与发现机制,微服务之间的调用就会变得非常混乱,每个服务都需要手动配置所有的 IP 地址,并且当某个服务地址变更时,其他所有依赖它的服务都要手动更新,非常麻烦。

于是,Eureka 作为 Spring Cloud 生态中的重要组件,成为了解决这些问题的关键。接下来,我们就来详细了解它的工作原理,并通过 实战案例 带你一步步搭建一个完整的 Eureka 服务注册与发现系统!💪


🔥 1. Eureka 介绍:微服务的“导航仪”

🔍 1.1 Eureka 是什么?

Eureka 是 Netflix 开源的一款 服务注册与发现(Service Discovery) 组件,它属于 Spring Cloud 生态的一部分,专门用于解决 微服务架构中的服务发现问题

🎯 Eureka 能做什么?

服务注册:微服务启动时,会自动向 Eureka Server 注册自己的信息(IP、端口、健康状况等)。
服务发现:微服务可以通过 Eureka Server 查询其他服务的地址,动态调用。
健康监测:Eureka Server 会定期检查微服务是否存活,并剔除不可用的实例。
负载均衡:客户端可以获取多个服务实例,并通过负载均衡策略选择合适的实例进行调用。
自我保护机制:当网络不稳定时,Eureka Server 不会立即剔除服务,而是维持已有的服务列表,保证系统的可用性。


🏗 2. 搭建 Eureka Server

Eureka Server 是整个服务注册与发现的核心,它充当了“服务的电话簿”,所有微服务都需要向它注册自己的信息,并从它那里获取其他服务的信息。

2.1 创建 Eureka Server 项目

首先,我们需要创建一个 Spring Boot 项目,并选择以下依赖:

  • Spring Web(用于构建 Web 应用)
  • Eureka Server(用于启用 Eureka 注册中心)

🛠 2.2 编写 Eureka Server 启动类

package com.example.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer  // 启用 Eureka Server
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

📜 2.3 配置 application.yml

server:
  port: 8761  # Eureka Server 默认端口

eureka:
  instance:
    hostname: localhost  # Eureka Server 主机名
  client:
    register-with-eureka: false  # Eureka Server 本身不作为客户端注册
    fetch-registry: false  # 不拉取其他服务信息
    service-url:
      defaultZone: http://localhost:8761/eureka/  # Eureka 自己的地址

🎬 2.4 启动 Eureka Server

运行 EurekaServerApplication.java,然后打开浏览器访问:。如果看到 Eureka 的管理界面,说明 Eureka Server 搭建成功!🎉


🚗 3. 创建 Eureka Client(服务提供者)

Eureka Client 是指那些需要被注册和发现的微服务。所有微服务都需要在 Eureka Server 中注册自己,才能被其他微服务发现并调用。

🏗 3.1 创建服务提供者

创建一个新的 Spring Boot 项目,选择以下依赖:

  • Spring Web
  • Eureka Client

🔧 3.2 配置 Eureka Client

server:
  port: 8081  # 微服务端口

spring:
  application:
    name: service-provider  # 服务名称

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # Eureka Server 地址
  instance:
    prefer-ip-address: true  # 让 Eureka 用 IP 地址注册

🚀 3.3 创建 EurekaClientApplication.java 启动类

package com.example.eurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient  // 启用服务发现
public class EurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

🏷 3.4 创建 REST API

package com.example.eurekaclient.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class TestController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello from service-provider!";
    }
}

🎯 3.5 启动服务

运行 EurekaClientApplication.java,然后打开 Eureka Server 管理界面,你会看到 service-provider 已经注册进来了!🔥

好,我们继续深入拓展 Eureka 的各个方面,逐步扩展和详细解释微服务架构中服务注册与发现的工作原理,并结合实际代码和最佳实践,帮助你掌握 Eureka 的使用和优化。

🚀 4. Eureka 工作原理

🌀 4.1 服务注册与发现

在微服务架构中,服务注册与发现是一个重要的机制。Eureka 通过客户端与服务端之间的通信,管理微服务实例的生命周期,确保服务的可用性和可靠性。

  1. 服务注册:每个服务启动时都会自动向 Eureka Server 注册自身的信息(如服务名称、主机 IP、端口、健康状态等)。服务注册时,Eureka Server 会给每个服务分配一个唯一的 ID 和一系列的元数据。

  2. 服务发现:Eureka Client 启动时,它会向 Eureka Server 查询可用的服务列表。通过服务名称,客户端可以发现注册的服务实例并进行调用。

🌐 4.2 Eureka Client 与 Eureka Server 通信机制

  • 心跳机制:Eureka Client 会定期向 Eureka Server 发送心跳请求(默认是 30 秒),表明自己还活着并且仍在服务。如果没有收到心跳,则认为该服务不可用,会从 Eureka Server 注册表中移除该服务。

  • 自我保护机制:如果 Eureka Server 无法联系到多个服务实例(即服务宕机或网络问题),它会进入“自我保护模式”,在此模式下,Eureka 会暂时保留那些没有发送心跳的服务实例,避免频繁删除服务。

💡 4.3 服务注册生命周期

  1. 服务启动:服务启动时会向 Eureka Server 发送注册请求,包括服务名称、实例信息等。
  2. 心跳保持注册:服务启动后,会定期发送心跳请求,维持其在 Eureka Server 中的注册信息。
  3. 服务注销:当服务停止时,Eureka Client 会通知 Eureka Server 注销该服务,解除服务与 Eureka Server 的绑定。

🛠 5. Eureka 高可用性与集群配置

为了提高 Eureka 服务的可靠性和容错性,我们通常会部署多个 Eureka Server 实例,形成一个 Eureka 集群。这样即使某个 Eureka Server 宕机,其他的 Eureka Server 仍然可以提供服务,保证系统的高可用性。

🌐 5.1 配置 Eureka 集群

配置 Eureka 集群的关键在于:

  • 多个 Eureka Server 实例的配置
  • 客户端配置多个 Eureka Server 地址

假设我们有两个 Eureka Server,分别是 eureka-server-1eureka-server-2。我们需要配置它们以实现集群式部署。

  1. Eureka Server 1 的配置:
eureka:
  instance:
    hostname: eureka-server-1
  client:
    service-url:
      defaultZone: http://eureka-server-1:8761/eureka,http://eureka-server-2:8762/eureka
  1. Eureka Server 2 的配置:
eureka:
  instance:
    hostname: eureka-server-2
  client:
    service-url:
      defaultZone: http://eureka-server-1:8761/eureka,http://eureka-server-2:8762/eureka

在配置中,defaultZone 的配置包含了 Eureka 集群中其他服务器的地址。通过这种方式,Eureka Client 就可以与多个 Eureka Server 实例进行通信,确保服务发现功能的高可用性。

🚀 5.2 Eureka 自我保护机制

当 Eureka Server 检测到一定时间内无法获取到来自某个服务实例的心跳时,Eureka Server 会自动进入“自我保护模式”。在此模式下,Eureka 会暂时保持服务实例的状态,即便它们不再响应心跳请求,避免频繁删除服务信息。这样可以减少因网络问题引起的服务丢失。

自我保护模式会在网络恢复时自动退出,Eureka Server 会重新检查服务的健康状态并更新服务注册表。

🎯 5.3 Eureka 高可用性注意事项

  1. Eureka Client 高可用:客户端可以通过配置多个 Eureka Server 地址,避免单点故障。即便某个 Eureka Server 宕机,客户端仍然可以连接到其他可用的 Eureka Server。

  2. 客户端缓存机制:Eureka Client 会缓存从 Eureka Server 获取的服务信息。当 Eureka Server 不可用时,客户端可以继续从缓存中获取服务列表,确保系统的容错能力。

  3. 负载均衡与容错处理:结合 Ribbon 或其他负载均衡工具,客户端可以通过多个 Eureka 实例来均衡请求负载。即使某个服务实例不可用,负载均衡机制也能选择其他可用实例,保证服务调用的稳定性。

🏆 6. Eureka 与 Spring Cloud 其他组件的集成

在实际的微服务架构中,Eureka 并不仅仅是一个孤立的组件,它通常与 Spring Cloud 中的其他组件共同工作,形成一个完整的微服务系统。接下来,我们来看看 Eureka 是如何与其他常用组件集成的。

6.1 Eureka 与 Ribbon 集成

Ribbon 是一个客户端负载均衡工具,它能够在多个服务实例中选择一个最优实例进行调用。通过将 Eureka 与 Ribbon 集成,客户端可以在多个服务实例中自动选择最合适的进行调用。

🔧 6.1.1 使用 Ribbon 进行负载均衡

首先,添加 spring-cloud-starter-ribbon 依赖,并在客户端配置中启用负载均衡:

spring:
  application:
    name: service-consumer

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule  # 负载均衡策略

然后,在调用远程服务时,使用 @LoadBalanced 注解来启用 Ribbon 的负载均衡:

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

通过这种方式,Ribbon 会根据 Eureka 注册表中服务实例的数量和健康状态自动进行负载均衡。

💡 6.2 Eureka 与 Feign 集成

Feign 是一个声明式 HTTP 客户端,它可以简化 HTTP 服务调用的代码。通过与 Eureka 集成,Feign 可以直接通过服务名称来调用其他微服务,而无需指定 IP 或端口。

🔧 6.2.1 配置 Feign 客户端

首先,在 Spring Boot 配置类中启用 Feign:

@EnableFeignClients
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

然后,定义一个 Feign 客户端接口:

@FeignClient("service-provider")
public interface ServiceClient {
    @GetMapping("/api/hello")
    String sayHello();
}

通过 Feign 客户端,service-provider 服务将自动通过 Eureka 服务注册与发现机制进行定位,简化了服务调用的代码。

💡 7. Eureka 进阶使用与优化

7.1 配置健康检查

微服务的健康检查是确保系统可靠性的重要机制。Spring Cloud 提供了 Spring Boot Actuator 来实现健康检查。

🔧 7.1.1 配置健康检查

通过 spring-boot-starter-actuator 依赖,Eureka 客户端可以定期向 Eureka Server 发送健康检查信息,确保服务的健康状态。

management:
  endpoints:
    web:
      exposure:
        include: health,info

Eureka 会根据健康检查结果决定是否将服务标记为“健康”,并维持或删除服务的注册信息。

🌍 7.2 配置服务实例的元数据

Eureka 允许为每个服务实例添加元数据,例如实例的版本、环境、端口等信息。这些信息可以帮助其他服务在发现服务时做出更合理的选择。

eureka:
  instance:
    metadata-map:
      version: v1
      region: us-west

通过这些元数据,Eureka Server 可以为每个服务实例提供更丰富的上下文信息,有助于服务消费者做出决策。

🔑 8. 总结

Eureka 是微服务架构中的核心组件,它通过 服务注册与发现 机制,帮助各个微服务之间相互通信,保证了系统的可扩展性、可靠性和容错性。我们通过实际代码演示,掌握了如何搭建 Eureka Server 和 Eureka Client,如何实现服务注册与发现,并结合 RibbonFeign 等组件进行负载均衡与服务调用。

除了基础的服务注册与发现,Eureka 还提供了丰富的功能,如自我保护机制、高可用集群配置、负载均衡策略、健康检查、服务元数据管理等,使其在生产环境中非常强大和可靠。

微服务架构复杂且充满挑战,但 Eureka 的出现无疑让这个世界变得更加有序和易于管理。希望通过这篇文章,你已经对 Eureka 有了更深入的了解,能够在实际项目中灵活运用 Eureka 来构建高效、可扩展的微服务架构!🎉

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

✨️ Who am I?

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。