Eureka 服务发现原理及实践

embedded/2024/10/18 18:25:59/

引言

随着微服务架构的普及,服务发现成为了分布式系统中的一个重要组成部分。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 

    深色版本

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

     java 

    深色版本

    1import org.springframework.boot.SpringApplication;
    2import org.springframework.boot.autoconfigure.SpringBootApplication;
    3import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    4
    5@SpringBootApplication
    6@EnableEurekaServer
    7public class EurekaServerApplication {
    8
    9    public static void main(String[] args) {
    10        SpringApplication.run(EurekaServerApplication.class, args);
    11    }
    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 

    深色版本

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

     java 

    深色版本

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

     java 

    深色版本

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

2.4 服务发现

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

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

     java 

    深色版本

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

3. 总结

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


http://www.ppmy.cn/embedded/99343.html

相关文章

复制带随机指针的链表

struct Node { int val; struct Node* next; struct Node* random; }; struct Node* copyRandomList(struct Node* head) { struct Node* cur head; //copy结点并插入原链表结点后面 while (cur) { //创建新结点 struct Node* co…

API容易被攻击,如何做好API安全

随着互联网技术的飞速发展和普及,网络安全问题日益严峻,API(应用程序接口)已成为网络攻击的常见载体之一。API作为不同系统之间数据传输的桥梁,其安全性直接影响到整个系统的稳定性和数据的安全性。 根据Imperva发布的…

政安晨【零基础玩转各类开源AI项目】基于本地Linux Ubuntu系统部署及应用强大的开源AI音乐生成工具:AudioCraft

目录 简介 部署 下载项目 创建虚拟环境 激活虚拟环境 安装依赖 启动 成功 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 简介 A…

ChatGPT3.5/新手使用手册——在线使用详细操作步骤

成长路上不孤单😊【14后小学生一枚,C爱好者,持续分享所学,今日分享主题【ChatGPT新手使用手册】,需要欢迎收藏转发😊😊😊😊😊😊😊&…

设计模式六大原则 —— 迪米特法则

设计模式六大原则 —— 迪米特法则 在软件设计领域,设计模式六大原则是一组被广泛接受和应用的指导原则,旨在帮助开发者构建更加稳定、灵活、可维护和可扩展的软件系统。这六大原则分别是:单一职责原则(Single Responsibility Pr…

《重生到现代之从零开始的C语言生活》—— 指针2

const const修饰变量 指针可以解引用修改变量,如果我们不想让它被修改可怎么办啊 这个就是const的作用 int main() {int a 0;a 10;printf("%d",a)const int b 0;b 11;printf("%d",b);return 0; }在此代码中,a是可以被修改的&…

逻辑回归解密:原理、公式和优化全解析

文章目录 一、 前言二、逻辑回归的原理和基本公式1. 逻辑回归的原理核心函数:Sigmoid函数 2. 逻辑回归模型3. 梯度上升法参数估计:最大似然估计对数似然函数求导过程参数更新 4. 梯度下降法参数估计:最小化损失函数逻辑回归的负对数似然函数梯…

ansible --limit 在指定主机执行任务

将任务只应用于指定的主机或主机组,而不是整个 inventory 中的所有主机。 限制单个主机 ansible-playbook -i hosts myplaybook.yml --limit "ip"限制多个主机 ansible-playbook -i hosts myplaybook.yml --limit "ip1,ip2,ip3"限制到主机组…