Eureka 是一个基于 REST 的服务,主要用于定位服务,以实现云端中间层服务发现和故障转移。它由 Netflix 开发并开源,是 Spring Cloud 生态系统中的重要组件之一。Eureka 主要用于微服务架构中,帮助服务客户端注册和发现服务,从而实现服务的自动管理。
Eureka 的核心概念
-
服务注册(Service Registration):
- 服务提供者在启动时,会将自己的服务信息(如服务名、IP地址、端口等)注册到 Eureka 服务器。
-
服务发现(Service Discovery):
- 服务消费者从 Eureka 服务器获取服务提供者的信息,并使用这些信息进行远程调用。
-
心跳机制(Heartbeat):
- 服务提供者会定期向 Eureka 服务器发送心跳,以证明自己仍然存活。如果 Eureka 服务器在一定时间内没有收到某个服务提供者的心跳,它会将其从注册表中移除。
-
客户端缓存(Client-side Caching):
- Eureka 客户端会缓存服务注册表的信息,这样即使 Eureka 服务器不可用,客户端仍然可以进行服务发现。
Eureka 的架构
Eureka 的架构主要包括两个组件:Eureka 服务器(Eureka Server)和 Eureka 客户端(Eureka Client)。
-
Eureka 服务器:
- 提供服务注册和发现的功能。
- 通常会有多个 Eureka 服务器实例组成一个集群,以提高可用性。
-
Eureka 客户端:
- 服务提供者(Service Provider):将自己的服务信息注册到 Eureka 服务器。
- 服务消费者(Service Consumer):从 Eureka 服务器获取服务提供者的信息,并进行远程调用。
Eureka 的使用
1. 搭建 Eureka 服务器
首先,需要在项目中引入 Eureka 服务器的依赖。如果是使用 Spring Boot 和 Spring Cloud,可以在 pom.xml
或 build.gradle
中添加以下依赖:
<!-- 对于 Maven 项目 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
// 对于 Gradle 项目
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
然后,创建一个 Spring Boot 应用,并添加 @EnableEurekaServer
注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
在 application.yml
或 application.properties
中配置 Eureka 服务器:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
2. 注册服务到 Eureka
在服务提供者的项目中引入 Eureka 客户端的依赖:
<!-- 对于 Maven 项目 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
// 对于 Gradle 项目
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
在服务提供者的 Spring Boot 应用中添加 @EnableEurekaClient
注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
}
在 application.yml
或 application.properties
中配置 Eureka 客户端:
server:
port: 8081
spring:
application:
name: service-provider
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
3. 发现服务并进行调用
在服务消费者的项目中引入 Eureka 客户端的依赖,并配置 Eureka 客户端:
<!-- 对于 Maven 项目 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
// 对于 Gradle 项目
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
在服务消费者的 Spring Boot 应用中添加 @EnableDiscoveryClient
注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
在 application.yml
或 application.properties
中配置 Eureka 客户端:
server:
port: 8082
spring:
application:
name: service-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
使用 RestTemplate
或 Feign
进行服务调用:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@GetMapping("/consume")
public String consume() {
return restTemplate.getForObject("http://service-provider/hello", String.class);
}
}
总结
Eureka 是一个强大的服务注册和发现工具,适用于微服务架构。通过 Eureka,服务提供者可以注册自己的服务信息,服务消费者可以发现并调用这些服务。Eureka 提供了高可用性和容错性,确保了服务的稳定运行。通过 Spring Cloud 的支持,Eureka 的使用变得更加简单和便捷。