首页 > 其他分享 >Eureka原理实践:构建高可用、可扩展的微服务架构

Eureka原理实践:构建高可用、可扩展的微服务架构

时间:2024-09-25 13:22:27浏览次数:3  
标签:服务 Server 实例 构建 eureka 架构 Client Eureka

Eureka原理实践:构建高可用、可扩展的微服务架构

引言

随着微服务架构的日益普及,服务注册与发现成为了分布式系统架构中的核心组件。Eureka,作为Netflix开源的一款高效稳定的服务注册与发现框架,凭借其自动注册、发现、健康监测及自我保护等特性,在微服务架构中占据了重要地位。本文将深入探讨Eureka的原理,并结合实际代码案例,展示其在Spring

Cloud微服务架构中的应用。

Eureka概述

Eureka由Eureka Server(服务注册中心)和Eureka Client(服务实例)两个核心组件组成。Eureka

Server负责维护服务注册表,存储所有可用服务的实例信息,如IP地址、端口号、服务名等。Eureka

Client则嵌入到每个微服务应用中,分为服务提供者客户端和服务消费者客户端。服务提供者客户端在启动时向Eureka

Server注册自身信息,并定期发送心跳信号以维持注册状态;服务消费者客户端通过查询Eureka

Server获取所需服务的实例列表,并与之建立连接进行通信。

Eureka的核心原理

1. 服务注册

服务提供者在启动时,会通过Eureka Client向Eureka Server发送注册请求,包含服务名称、实例ID、IP地址、端口等信息。Eureka

Server接收到注册请求后,将这些信息存储在内存中,并同步至其他节点以实现数据一致性。这一过程确保了服务实例信息的及时性和准确性。

2. 服务发现

服务消费者通过Eureka Client向Eureka Server发送服务发现请求,Eureka

Server根据请求返回相应的服务实例列表。服务消费者可以根据这些信息实现负载均衡和故障转移,选择最佳的服务实例进行调用。

3. 心跳机制

Eureka Client会定期(默认每30秒)向Eureka Server发送心跳请求,通过renew()方法更新实例的最后更新时间戳。如果Eureka

Server在一定时间(默认90秒)内未收到某个实例的心跳,则认为该实例已下线,并从注册表中移除。这一机制有效地确保了服务实例的健康状态。

4. 自我保护模式

为了防止网络分区故障导致大量服务实例被错误地标记为不可用,Eureka引入了自我保护模式。当Eureka

Server在短时间内丢失过多客户端心跳时,会进入自我保护模式,不再剔除因心跳超时的服务实例,确保在异常情况下仍能提供可用的服务列表。

Eureka的实践案例

搭建Eureka Server

首先,我们需要创建一个Spring Boot项目并引入Eureka Server依赖。以下是Maven项目的 pom.xml 文件中的依赖配置:

xml复制代码

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

接着,在 application.yml 文件中进行基本配置:

yaml复制代码

 server:    
  
   port: 8761    
 eureka:    
   client:    
     register-with-eureka: false    
     fetch-registry: false    
   server:    
     enable-self-preservation: true    
   instance:    
     hostname: localhost    
   client:    
     service-url:    
       defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  

在主类上添加 @EnableEurekaServer 注解以启动Eureka Server:

java复制代码

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

搭建Eureka Client

接下来,我们创建一个新的Spring Boot项目作为服务提供者或消费者,并引入Eureka Client依赖:

xml复制代码

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

application.yml 中配置Eureka Client的基本信息和Eureka Server的地址:

yaml复制代码

 server:    
  
   port: 8080    
 spring:    
   application:    
     name: eureka-client    
 eureka:    
   client:    
     service-url:    
       defaultZone: http://localhost:8761/eureka/  

在主类上添加 @EnableEurekaClient 注解(在Spring Cloud 2.x及以上版本可以省略):

java复制代码

 @SpringBootApplication    
  
 // @EnableEurekaClient // 在Spring Cloud 2.x及以上版本可以省略    
 public class EurekaClientApplication {    
     public static void main(String[] args) {    
         SpringApplication.run(EurekaClientApplication.class, args);    
     }    
 }  

服务调用示例

假设我们有一个用户服务和一个订单服务,订单服务需要调用用户服务获取用户信息。在订单服务中,我们可以通过Eureka

Client获取用户服务的实例列表,并选择一个实例进行调用。

java复制代码

 @RestController    
  
 public class OrderController {    
     
     @Autowired    
     private RestTemplate restTemplate;    
     
     @GetMapping("/orders/{orderId}/user")    
     public User getUserInfoByOrderId(@PathVariable String orderId) {    
         // 假设使用服务名作为URL的一部分,通过Eureka实现服务发现    
         String url = "http://USER-SERVICE/users/{userId}";    
         // 这里需要实现userId的获取逻辑,这里简化为直接使用orderId    
         return restTemplate.getForObject(url.replace("{userId}", orderId), User.class);    
     }    
     
     // 配置RestTemplate的Bean,并设置服务发现支持    
     @Bean    
     @LoadBalanced    
     public RestTemplate restTemplate() {    
         return new RestTemplate();    
     }    
 }  

总结

Eureka通过其高效的服务注册与发现机制、心跳机制、自我保护模式以及高可用性和容错性设计,有效地解决了微服务架构中服务管理的复杂问题,提高了系统的可靠性和可扩展性。通过实际项目中的配置和部署,我们可以深刻体会到Eureka在微服务架构中的重要作用。掌握Eureka的工作原理和实践方法,对于构建高可用、可扩展的微服务系统至关重要。希望本文能为读者提供有价值的参考和启示。

标签:服务,Server,实例,构建,eureka,架构,Client,Eureka
From: https://blog.csdn.net/weixin_43275466/article/details/142516989

相关文章

  • Redisearch 入门指南构建高性能搜索应用
    1.概述Redisearch是一个强大的全文搜索引擎,基于流行的Redis数据库构建,专为高效的数据检索而设计。它结合了Redis的快速存储能力和搜索引擎的复杂查询功能,使得开发者能够在海量数据中实现实时搜索体验。Redisearch支持丰富的特性,包括模糊匹配、布尔搜索、聚合、地理......
  • SimpleAIAgent:使用免费的glm-4-flash即可开始构建简单的AI Agent应用
    SimpleAIAgent是基于C#SemanticKernel与WPF构建的一款AIAgent探索应用。主要用于使用国产大语言模型或开源大语言模型构建AIAgent应用的探索学习,希望能够帮助到感兴趣的朋友。接下来我想分享一下我的AIAgent应用实践。翻译文本并将文本存入文件第一个例子是翻译文本,并将......
  • 134页满分PPT | 某酒业集团智能工厂信息化顶层架构设计
    项目背景及需求理解客户正面临新的竞争环境,需要通过“三网融合建设工程”来应对市场变化和需求。企业战略和业务战略的制定,旨在通过整合前端市场掌控、中端运营保障和后端支持,以实现销售收入的增长和市场地位的稳固。在这样的背景下,需要对智能工厂进行信息化顶层架构设计,以支撑企业......
  • 使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
    在 Kubernetes集群中部署微服务在 5G电信中至关重要。但是,它也带来了重大的安全风险。虽然防火墙规则和代理提供了初始安全性,但Kubernetes中的默认通信机制(例如未加密的网络流量和缺乏访问控制)本质上是不安全的。这种不安全性可能会危及敏感数据。因此,在每个微服务Pod中实......
  • 使用 AuraDB 免费版构建 Java 微服务
        对于今天的冒险,我们希望构建一个Java微服务,它连接到Neo4jAuraDBFree数据库中的图形数据并与之交互。我们的数据是 Goodreads数据集的精简版本,其中包括书籍、作者和评论信息。虽然书籍和作者非常适合MongoDB等文档数据库,但一旦您将评论添加到组合中,关系的细微差别......
  • 2024年系统架构设计师各地考试时间及入口汇总
    一、系统架构设计师系统架构设计师,属于计算机技术与软件(高级)专业技术资格。从事系统架构分析、设计与评估的高级技术人员二、系统架构设计师报名时间及入口汇总系统架构设计师一年考2次,报名时间上半年3月和下半年8月,考试时间为上半年5月和下半年11月系统架构设计师报名官网入口都是......
  • EasyCVR全方位安全守护智慧电厂:构建高效视频监控系统优势分析
    随着信息技术的飞速发展和数字化时代的到来,电厂作为能源供应的重要枢纽,其安全性和管理效率成为社会各界关注的焦点。为了满足电厂对高效、智能、可靠视频监控系统的需求,基于EasyCVR平台建设的电厂视频监控系统应运而生。一、系统构成基于EasyCVR平台建设的电厂视频监控系统主要......
  • KG Structure as Prompt:利用知识图谱构建Prompt,提高大模型对因果关系的理解
    KGStructureasPrompt:利用知识图谱构建Prompt,提高大模型对因果关系的理解秒懂大纲提出背景解法拆解创意视角中文意译 论文:KnowledgeGraphStructureasPrompt:ImprovingSmallLanguageModelsCapabilitiesforKnowledge-basedCausalDiscovery代码:https://github.com/l......
  • 【架构】NewSQL
    文章目录NewSQLTiDBTiDB主要组件特点使用场景安装与部署推荐阅读NewSQLNewSQL是一种数据库管理系统(DBMS)的类别,它结合了NoSQL数据库的可扩展性和传统SQL数据库的事务一致性。具体来说,NewSQL数据库旨在解决传统关系型数据库在处理大规模并发事务时遇到的性能瓶颈......
  • 架构师手写代码:分享数据库原子性与一致性实现方案(不再背概念)
    数据库事务的原子性和一致性是数据库管理系统(DBMS)中确保数据完整性和可靠性的两个关键属性。下面是这两个属性的基本概念和实现逻辑:肖哥弹架构跟大家“弹弹”数据库设计技巧,关注公号回复'mvcc'获得手写数据库事务代码欢迎点赞,点赞,点赞。关注公号Solomon肖哥弹架构获取......