使用Eureka实现服务注册与发现的具体案例详解


1. Eureka 的基本概念

1.1 什么是 Eureka?

Eureka 是一个基于 REST 的服务注册和发现平台,主要分为以下两个组件:

  • Eureka Server:作为服务注册中心,负责维护服务实例信息。
  • Eureka Client:服务消费者与服务提供者都通过 Eureka Client 与 Eureka Server 交互。

Eureka 的核心目标是:

  • 服务动态注册与注销:服务启动后自动注册,停止时自动从注册中心移除。
  • 服务发现:通过注册中心查找可用服务。

1.2 Eureka 的工作原理

Eureka 的工作机制如下:

  1. 服务实例在启动时向 Eureka Server 注册。
  2. 服务消费者从 Eureka Server 获取服务列表以便调用。
  3. 服务实例定期发送心跳来保持注册状态,Eureka Server 持续监控实例的可用性。
  4. 服务实例停止时,向 Eureka Server 发送注销请求,或在心跳超时后被移除。

2. 实战:搭建基于 Eureka 的服务注册与发现系统

2.1 环境准备

  1. JDK 版本:8 或以上
  2. Spring Boot:2.5.x 或更高版本
  3. Maven:依赖管理工具

2.2 创建 Eureka Server

2.2.1 新建项目

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

  • Spring Web
  • Eureka Server
2.2.2 配置 pom.xml

确保 pom.xml 包含以下 Eureka Server 依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.2.3 配置 application.yml

配置 Eureka Server 的基本信息:

yaml 复制代码
server:
  port: 8761

spring:
  application:
    name: eureka-server

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
  server:
    enable-self-preservation: false
2.2.4 启动 Eureka Server

在主类中添加 @EnableEurekaServer 注解,标记为 Eureka Server:

java 复制代码
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

启动项目后,访问 http://localhost:8761,可看到 Eureka Server 的管理页面。

2.3 创建服务提供者(Provider)

2.3.1 新建项目

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

  • Spring Web
  • Eureka Client
2.3.2 配置 pom.xml

确保 pom.xml 包含 Eureka Client 依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.3.3 配置 application.yml

配置服务提供者的基本信息:

yaml 复制代码
server:
  port: 8081

spring:
  application:
    name: provider-service

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
2.3.4 实现业务接口

创建一个简单的 RESTful 接口:

java 复制代码
@RestController
public class ProviderController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello from Provider!";
    }
}

启动服务提供者后,Eureka Server 的管理页面中将显示 provider-service

2.4 创建服务消费者(Consumer)

2.4.1 新建项目

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

  • Spring Web
  • Eureka Client
  • Spring Cloud LoadBalancer
2.4.2 配置 pom.xml

添加所需依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2.4.3 配置 application.yml

配置服务消费者的基本信息:

yaml 复制代码
server:
  port: 8082

spring:
  application:
    name: consumer-service

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
2.4.4 调用服务

通过 RestTemplate 调用服务提供者:

java 复制代码
@RestController
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/consume")
    public String consumeService() {
        String url = "http://provider-service/hello";
        return restTemplate.getForObject(url, String.class);
    }

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

启动服务消费者后,访问 http://localhost:8082/consume,可调用服务提供者的接口。


3. 总结

通过上述案例,我们完整实现了基于 Eureka 的服务注册与发现功能。Eureka 提供了高效、动态的服务管理方式,在微服务架构中起到了核心作用。虽然 Netflix 宣布停止维护 Eureka,但其简单、直观的设计仍然是学习服务注册与发现的重要工具。此外,了解类似的服务注册工具(如 Consul、Zookeeper)也有助于构建更全面的知识体系。

希望本文的案例能帮助你快速上手 Eureka,并为构建微服务系统打下坚实的基础!

相关推荐
天蓝不会忘记0214 分钟前
k8s集群部署的方法原理
云原生·容器·kubernetes
红球yyds2 小时前
用anisble搭建k8s集群及原理
云原生·容器·kubernetes
分布式存储与RustFS5 小时前
从 MinIO 到 RustFS:不只是换语言,更是换一份协议自由
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
易番番ERP1 天前
品牌代理商SKU繁多,ERP如何高效处理新旧规格替换?
数据库·微服务·云原生·sku·易番番erp
对象存储与RustFS1 天前
给 Kubernetes 找一个对象存储后端:RustFS Helm 部署 + 应用接入实录
后端·云原生·kubernetes
分布式存储与RustFS1 天前
给 Kubernetes 找一个对象存储后端:RustFS Helm 部署 + 应用接入实录
云原生·kubernetes·开源·对象存储·分布式存储·s3·rustfs
伞伞悦读1 天前
Docker 安装 MinIO 完整教程(新手友好版)
docker·容器·eureka
阿里云云原生2 天前
还在给 AI “喂冷饭”?8.28 上海沙龙:带你跨越 AI 实时上下文鸿沟
云原生·kafka
有脚就行2 天前
第33篇-KServe推理平台-标准化的K8s推理服务管理
人工智能·云原生·容器·kubernetes
名字还没想好☜2 天前
Kubernetes StatefulSet 实战:为什么数据库不能用 Deployment 部署
数据库·云原生·容器·kubernetes·statefulset