网站建设中的问题,关注公众号一单一结兼职app,著名建筑设计网站,做网站都需要什么东西文章目录 前言一、微服务调用出现的问题1.1 服务消费者如何获取服务提供者的地址信息#xff1f;1.2 如果有多个服务提供者#xff0c;消费者该如何选择#xff1f;1.3 消费者如何得知服务提供者的健康状态#xff1f; 二、什么是 Eureka2.1 Eureka 的核心概念2.2 Eureka 的… 文章目录 前言一、微服务调用出现的问题1.1 服务消费者如何获取服务提供者的地址信息1.2 如果有多个服务提供者消费者该如何选择1.3 消费者如何得知服务提供者的健康状态 二、什么是 Eureka2.1 Eureka 的核心概念2.2 Eureka 的解决微服务调用问题的方案 三、Eureka 的原理3.1 Eureka 的核心组件3.1.1 eureka-server3.1.2 eureka-client 3.2 Eureka 的工作流程 四、搭建 Eureka 服务五、注册服务5.1 注册 user-service 服务5.2 注册 order-service 服务5.3 同一个服务启动多个实例 六、服务的发现 前言
在微服务架构中服务的注册与发现是至关重要的一环。为了实现这一目标Eureka 注册中心应运而生。在本篇文章中我们将深入理解 Eureka 注册中心的原理以及探讨服务的注册与发现机制。
在微服务的协作中服务之间的远程调用是常见的需求。然而使用传统的 RestTemplate 远程调用方式存在一些问题例如耦合度高、维护困难等。为了解决这些问题我们将探讨如何利用 Eureka 注册中心来优雅地进行服务的注册与发现从而更好地构建微服务架构。
接下来我们将逐步深入探讨 Eureka 注册中心的原理、搭建 Eureka 服务、服务的注册与发现等关键内容。希望通过阅读本文可以帮助我们更全面地理解微服务架构中 Eureka 的作用以及如何灵活运用它来构建高效可靠的分布式系统。
一、微服务调用出现的问题
在微服务架构中服务之间的远程调用是常见的需求。然而随着系统的复杂性增加服务调用也带来了一些问题和挑战。
1.1 服务消费者如何获取服务提供者的地址信息
在微服务架构中服务提供者的地址信息通常是动态的可能随时发生变化例如服务的扩容、缩容、迁移等情况。因此服务消费者需要一种机制来获取服务提供者的地址信息以确保能够正确地发起远程调用。
解决方案服务注册与发现
服务提供者在启动时将自己的地址信息注册到服务注册中心包括主机名、端口号等信息。服务消费者通过查询服务注册中心来获取服务提供者的地址信息从而可以动态地发起调用。
1.2 如果有多个服务提供者消费者该如何选择
在实际应用中可能会存在多个提供相同服务的服务提供者这时服务消费者需要选择一个合适的提供者来发起调用。选择的依据可以包括负载均衡、性能指标、健康状态等因素。
解决方案负载均衡
负载均衡是一种策略用于在多个服务提供者之间分配请求以达到均衡负载的目的。常见的负载均衡策略包括轮询、随机、加权轮询、加权随机等不同策略适用于不同的场景。
1.3 消费者如何得知服务提供者的健康状态
在微服务架构中服务提供者的健康状态对于服务消费者是非常重要的信息。如果一个服务提供者出现了故障或不可用服务消费者需要避免向其发起请求以确保系统的稳定性和可靠性。
解决方案健康检查与容错机制
健康检查是一种监测服务提供者健康状态的机制通常由服务注册中心来执行。服务消费者可以根据健康检查的结果来判断服务提供者是否可用从而决定是否发起调用。容错机制可以帮助服务消费者处理远程调用时可能出现的故障例如超时、重试、降级等。
其中Eureka 就是是一种服务注册与发现的解决方案它通过服务注册中心来解决了微服务调用中的一些关键问题。
二、什么是 Eureka
Eureka 是 Netflix 提供的一款开源的服务注册与发现框架用于构建基于微服务架构的分布式系统。它解决了在微服务架构中服务的动态注册、发现和负载均衡的问题是构建可伸缩和高可用性微服务的重要工具之一。
2.1 Eureka 的核心概念
服务注册
在微服务架构中服务提供者在启动时将自己的信息注册到 Eureka 注册中心包括服务名称、网络地址等。这样Eureka 注册中心就知道了系统中有哪些服务是可用的。
服务发现
服务消费者可以通过查询 Eureka 注册中心获取可用服务的信息从而决定向哪些服务发起调用。Eureka 注册中心维护了一个服务实例列表包括每个服务的网络地址。
心跳与健康检查
Eureka 注册中心会定期向服务提供者发送心跳请求以检测服务是否仍然可用。如果一个服务在一定时间内未发送心跳Eureka 将其标记为不可用。这就实现了对服务健康状态的监控。
负载均衡
Eureka 客户端集成了 Ribbon 负载均衡器可以在多个服务提供者之间实现负载均衡。通过使用 Ribbon服务消费者可以选择一个合适的服务提供者来发起调用。
Eureka 的优势 简化了服务调用 Eureka 提供了简洁的 API使得服务的注册、发现和调用变得非常容易。 高可用性 Eureka 支持服务注册中心的集群部署通过相互注册来保证注册中心的高可用性。 负载均衡 集成了 Ribbon 负载均衡器可实现对多个服务提供者的请求分配提高系统的性能和稳定性。 动态扩展 Eureka 支持服务的动态注册和注销适应服务实例的动态变化。 健康检查 通过心跳和健康检查Eureka 能够及时发现不可用的服务实例确保服务的高可用性。
总体而言Eureka 是一个功能强大的服务注册与发现框架为构建微服务架构提供了可靠的基础设施支持。
2.2 Eureka 的解决微服务调用问题的方案 服务消费者如何获取服务提供者的地址信息 Eureka 注册中心 服务提供者在启动时将自己的地址信息注册到 Eureka 注册中心。服务消费者可以通过查询 Eureka 注册中心获取服务提供者的地址信息。 如果有多个服务提供者消费者该如何选择 负载均衡 Eureka 支持负载均衡服务消费者可以使用负载均衡策略来选择一个合适的服务提供者。Eureka 客户端集成了 Ribbon 负载均衡器可方便地实现负载均衡。 消费者如何得知服务提供者的健康状态 健康检查 Eureka 注册中心会定期对服务提供者进行健康检查如果一个服务提供者出现故障Eureka 将其标记为不可用。服务消费者在查询服务列表时可以过滤掉不可用的服务提供者确保只选择健康的服务。
综上所述Eureka 提供了服务注册与发现的机制同时集成了负载均衡和健康检查等功能有效地解决了微服务调用中的关键问题。通过使用 Eureka微服务架构中的服务调用变得更加灵活、可靠、具有高可用性。
三、Eureka 的原理
Eureka 是一个由 Netflix 提供的服务注册与发现框架通过 eureka-server 和 eureka-client 两部分协同工作实现了微服务架构中服务的动态注册、发现、负载均衡和健康检查等功能。下面我们将深入了解 Eureka 的工作原理。
3.1 Eureka 的核心组件
3.1.1 eureka-server 服务注册中心 eureka-server 充当服务的注册中心负责接收服务提供者注册信息并维护注册表。 服务注册表 服务提供者在启动时向 eureka-server 注册自己的信息包括服务名称、网络地址等形成服务注册表。 健康检查 eureka-server 定期向服务提供者发送心跳通过健康检查来维护服务的健康状态。
3.1.2 eureka-client 服务提供者 微服务中的各个服务模块通过 eureka-client 向 eureka-server 注册自己的服务。 服务消费者 微服务中的服务消费者通过 eureka-client 从 eureka-server 获取可用服务的信息实现服务的发现。 负载均衡 eureka-client 集成了 Ribbon 负载均衡器可以在多个服务提供者之间实现负载均衡提高系统的性能和可靠性。
3.2 Eureka 的工作流程
Eureka 的工作流程可用下图表示 服务注册阶段 服务提供者启动时通过 eureka-client 向 eureka-server 注册自己的服务信息。 注册包括服务名称、网络地址等服务提供者成为服务注册表的一部分。 服务发现阶段 服务消费者通过 eureka-client 向 eureka-server 发送服务发现请求。 eureka-server 返回可用服务的信息包括服务名称和对应的网络地址。 服务消费者根据负载均衡策略选择一个服务提供者。 健康检查与维护 eureka-server 定期向服务提供者发送心跳检查服务的健康状态。 如果一个服务提供者长时间未发送心跳eureka-server 将其标记为不可用。 不可用的服务将在服务注册表中被移除保持服务注册表的准确性。
通过上述流程Eureka 实现了服务的动态注册与发现保障了微服务架构的高可用性和弹性扩展能力。Eureka 的原理设计使得微服务之间的调用更加灵活和可靠。
四、搭建 Eureka 服务
在 Spring Cloud Demo 代码中搭建 Eureka 服务的步骤如下
创建项目引入spring-cloud-starter-netflix-eureka-server的依赖
!-- eureka 服务端--
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId
/dependency编写启动类添加EnableEurekaServer注解
EnableEurekaServer // 开启 EurekaServer 自动装配
SpringBootApplication
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}添加application.yml文件编写下面的配置
server:port: 10086
spring:application:name: eurekaservice # 服务的名称
eureka:client:service-url: # eureka 的地址信息defaultZone: http://127.0.0.1:10086/eureka/ # eureka 也是一个微服务因此启动的时候也会将自己注册进 eureka 中为集群起作用完成上述所有的步骤之后就可以运行EurekaApplication 启动类了然后就可以访问地址http://localhost:10086/。
如果此时出现的页面如下就说明搭建 Eureka 服务成功了 其中Instances currently registered with Eureka 下显示的就是当前在 Eureka 中注册的服务。
五、注册服务
5.1 注册 user-service 服务
将 user-service 服务注册到 EurekaServer 中的步骤如下
在 user-service 项目的pom.xml中引入spring-cloud-starter-netflix-eureka-client依赖 !-- eureka 客户端--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependency在application.yml文件编写下面的配置
spring:application:name: userservice
eureka:client:service-url: defaultZone: http://127.0.0.1:10086/eureka/ 此时我们发现这个配置和上面搭建 EurekaServer 时的配置基本相同其原因就是 Eureka 在启动的时候也会将自己注册到 EurekaServer 中而这个配置的作用就是将指定的服务通过application name 区分注册到defaultZone 对应地址的 EurekaServer 中。
5.2 注册 order-service 服务
在 order-service 项目的pom.xml中引入spring-cloud-starter-netflix-eureka-client依赖 !-- eureka 客户端--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependency在application.yml文件编写下面的配置
spring:application:name: orderservice
eureka:client:service-url: defaultZone: http://127.0.0.1:10086/eureka/ 此时启动user-service 和 order-service 服务再次访问http://localhost:10086/就可以发现成功将服务注册到 EurekaServer 中了
5.3 同一个服务启动多个实例
另外在IDEA中我们可以同时启动一个服务的多个实例只需要保证不同实例的端口号不要发生冲突即可。
例如此时我还想增加两个user-service 服务的实例步骤如下 右键点击 UserApplication 然后选择 Copy Configuration 进行复制 然后进行如下设置 -Dserver.port8082表明为这个配置重新设置端口号为 8082可以按照相同的方式再复制一个配置。 启动这两个实例然后再次访问http://localhost:10086/ 此时就可以发现user-service 新增的两个实例的服务也成功注册到了 EurekaServer 中。
六、服务的发现
把服务注册到 EurekaServer 之后要做的就是实现服务的拉取了EurekaServer 中服务的拉取是基于服务名称来获取服务的列表然后再对服务列表做负载均衡选择出一个服务。
此时我们想要 order-service 能够拉取到 EurekaServer 中注册的 user-service 服务需要进行以下操作
修改 order-service 的代码修改访问的 url 路径用服务名代替 IP和端口
public Order queryOrderById(Long orderId) {// 1. 查询订单Order order orderMapper.findById(orderId);// 2. 查询用户// 2.1 构建查询用户的 urlString url http://userservice/user/ order.getUserId();// 2.2 使用 RestTemplate 远程调用查询用户User user restTemplate.getForObject(url, User.class);// 3. 封装 user 信息order.setUser(user);// 4.返回return order;
}此处就使用 userservice 服务名来代替 user-service 服务的 IP 和端口号了。
对 order-service 服务的启动类OrderApplication中的 RestTemplate 添加LoadBalanced负载均衡注解
SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}/*** 创建 RestTemplate 并注册到 Spring 容器*/LoadBalanced // 负载均衡Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}至此重新启动 order-service 服务便能成功从 EurekaServer 中访问到 user-service 提供的服务了。
此时清空三个 user-service服务实例的日志记录然后在浏览器中连续查询三次订单信息 由此可得知三个实例各种承担了一次服务的请求说明此时负载均衡所采用的策略是轮询的方式。