引言
随着微服务架构的普及,服务发现成为了分布式系统中的一个重要组成部分。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 环境准备
- Java 环境:确保本地环境已经安装了 Java 11 或更高版本。
- Maven:使用 Maven 作为构建工具。
- Spring Boot:使用 Spring Boot 2.x 版本。
2.2 创建 Eureka Server
-
创建项目 :使用 Spring Initializr 创建一个 Spring Boot 项目,添加
spring-boot-starter-eureka-server
依赖。 -
配置文件 :编辑
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/
-
启动类 :添加
@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}
-
运行 :启动 Eureka Server 应用,访问
http://localhost:8761
查看服务注册界面。
2.3 创建 Eureka Client
-
创建项目 :使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加
spring-boot-starter-web
和spring-cloud-starter-netflix-eureka-client
依赖。 -
配置文件 :编辑
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}
-
启动类 :添加
@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}
-
控制器:创建一个简单的 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}
-
运行:启动 Eureka Client 应用,再次访问 Eureka Server 的界面,可以看到刚刚启动的服务实例已经被注册。
2.4 服务发现
-
创建另一个 Eureka Client:按照上面的步骤创建第二个 Eureka Client。
-
调用服务 :在第二个 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}
-
运行 :启动第二个 Eureka Client 应用,访问
http://localhost:8081/call-service
来调用第一个 Eureka Client 的接口。
3. 总结
通过本文的学习,你应该已经掌握了 Eureka 服务发现的基本原理,并且能够通过实践案例了解如何在实际项目中使用 Eureka 进行服务注册和服务发现。Eureka 为微服务架构提供了一个简单而有效的服务发现解决方案,能够帮助你构建健壮、可扩展的分布式系统。