当前位置:   article > 正文

Eureka 服务发现原理及实践

Eureka 服务发现原理及实践

引言

随着微服务架构的普及,服务发现成为了分布式系统中的一个重要组成部分。Eureka 是 Netflix 开源的一款基于 REST 服务的服务发现组件,主要用于定位服务,以实现云端中间层服务发现和故障转移。本文将介绍 Eureka 的基本原理,并通过一个简单的实践案例来展示如何使用 Eureka 进行服务发现。

1. Eureka 简介

1.1 什么是 Eureka?

Eureka 是 Netflix 的一款服务发现框架,它基于 REST 服务实现,用于定位服务,以实现云端中间层服务发现和故障转移。Eureka 包含两个组件:Eureka Server 和 Eureka Client。

  • Eureka Server:提供服务注册中心的功能。
  • Eureka Client:是一个 Java 客户端,用于简化与 Eureka Server 的交互;客户端同时具备服务提供者和服务消费者的角色。

1.2 Eureka 的工作原理

Eureka 使用了一个完全去中心化的模型。所有的节点既是服务提供者也是服务消费者。每个节点都会启动一个 Eureka Client,并定期向 Eureka Server 发送心跳消息来表明自己仍然可用。如果 Eureka Server 在一定时间内没有收到某个节点的心跳,它会将该实例从服务注册表中移除。

  • 服务注册:服务启动时,Eureka Client 会向 Eureka Server 注册自身信息(如 IP 地址、端口、服务 ID 等)。
  • 服务发现:当客户端需要调用其他服务时,它会向 Eureka Server 请求服务列表,获取可用的服务实例地址。
  • 服务续约:为了保持服务实例的有效性,客户端每隔一定时间(默认为 30 秒)会向 Eureka Server 发送一次心跳信息,表明服务实例仍然存活。
  • 服务下线:如果 Eureka Server 在一段时间内(默认为 90 秒)没有收到客户端的心跳信息,它会将该服务实例标记为下线。

2. Eureka 实践

2.1 环境准备

  1. Java 环境:确保本地环境已经安装了 Java 11 或更高版本。
  2. Maven:使用 Maven 作为构建工具。
  3. Spring Boot:使用 Spring Boot 2.x 版本。

2.2 创建 Eureka Server

  1. 创建项目:使用 Spring Initializr 创建一个 Spring Boot 项目,添加 spring-boot-starter-eureka-server 依赖。

  2. 配置文件:编辑 application.yml 文件。

     yaml 

    深色版本

    1. 1server:
    2. 2 port: 8761
    3. 3
    4. 4eureka:
    5. 5 instance:
    6. 6 hostname: localhost
    7. 7 client:
    8. 8 register-with-eureka: false
    9. 9 fetch-registry: false
    10. 10 service-url:
    11. 11 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  3. 启动类:添加 @EnableEurekaServer 注解。

     java 

    深色版本

    1. 1import org.springframework.boot.SpringApplication;
    2. 2import org.springframework.boot.autoconfigure.SpringBootApplication;
    3. 3import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    4. 4
    5. 5@SpringBootApplication
    6. 6@EnableEurekaServer
    7. 7public class EurekaServerApplication {
    8. 8
    9. 9 public static void main(String[] args) {
    10. 10 SpringApplication.run(EurekaServerApplication.class, args);
    11. 11 }
    12. 12}
  4. 运行:启动 Eureka Server 应用,访问 http://localhost:8761 查看服务注册界面。

2.3 创建 Eureka Client

  1. 创建项目:使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加 spring-boot-starter-webspring-cloud-starter-netflix-eureka-client 依赖。

  2. 配置文件:编辑 application.yml 文件。

     yaml 

    深色版本

    1. 1server:
    2. 2 port: 8080
    3. 3
    4. 4eureka:
    5. 5 client:
    6. 6 service-url:
    7. 7 defaultZone: http://localhost:8761/eureka/
    8. 8 register-with-eureka: true
    9. 9 fetch-registry: true
    10. 10 instance:
    11. 11 prefer-ip-address: true
    12. 12 lease-expiration-duration-in-seconds: 90
    13. 13 lease-renewal-interval-in-seconds: 30
    14. 14 metadata-map:
    15. 15 instanceId: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
  3. 启动类:添加 @EnableEurekaClient 注解。

     java 

    深色版本

    1. 1import org.springframework.boot.SpringApplication;
    2. 2import org.springframework.boot.autoconfigure.SpringBootApplication;
    3. 3import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    4. 4
    5. 5@SpringBootApplication
    6. 6@EnableEurekaClient
    7. 7public class EurekaClientApplication {
    8. 8
    9. 9 public static void main(String[] args) {
    10. 10 SpringApplication.run(EurekaClientApplication.class, args);
    11. 11 }
    12. 12}
  4. 控制器:创建一个简单的 REST 控制器。

     java 

    深色版本

    1. 1import org.springframework.web.bind.annotation.GetMapping;
    2. 2import org.springframework.web.bind.annotation.RestController;
    3. 3
    4. 4@RestController
    5. 5public class MyController {
    6. 6
    7. 7 @GetMapping("/hello")
    8. 8 public String hello() {
    9. 9 return "Hello from Eureka Client!";
    10. 10 }
    11. 11}
  5. 运行:启动 Eureka Client 应用,再次访问 Eureka Server 的界面,可以看到刚刚启动的服务实例已经被注册。

2.4 服务发现

  1. 创建另一个 Eureka Client:按照上面的步骤创建第二个 Eureka Client。

  2. 调用服务:在第二个 Eureka Client 中添加一个 REST 控制器,用于调用第一个 Eureka Client 的 /hello 接口。

     java 

    深色版本

    1. 1import org.springframework.beans.factory.annotation.Autowired;
    2. 2import org.springframework.web.bind.annotation.GetMapping;
    3. 3import org.springframework.web.bind.annotation.RestController;
    4. 4import org.springframework.web.client.RestTemplate;
    5. 5
    6. 6@RestController
    7. 7public class ServiceDiscoveryController {
    8. 8
    9. 9 private final RestTemplate restTemplate;
    10. 10
    11. 11 @Autowired
    12. 12 public ServiceDiscoveryController(RestTemplate restTemplate) {
    13. 13 this.restTemplate = restTemplate;
    14. 14 }
    15. 15
    16. 16 @GetMapping("/call-service")
    17. 17 public String callService() {
    18. 18 String response = restTemplate.getForObject("http://eureka-client/hello", String.class);
    19. 19 return "Called service: " + response;
    20. 20 }
    21. 21}
  3. 运行:启动第二个 Eureka Client 应用,访问 http://localhost:8081/call-service 来调用第一个 Eureka Client 的接口。

3. 总结

通过本文的学习,你应该已经掌握了 Eureka 服务发现的基本原理,并且能够通过实践案例了解如何在实际项目中使用 Eureka 进行服务注册和服务发现。Eureka 为微服务架构提供了一个简单而有效的服务发现解决方案,能够帮助你构建健壮、可扩展的分布式系统。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/1006426
推荐阅读
相关标签
  

闽ICP备14008679号