Eureka 是 Netflix 开发的一个 RESTful 服务,用于在 AWS 云中定位服务,以实现负载均衡和中间层服务器的故障转移。它主要用于微服务架构中,作为服务注册与发现的工具。Eureka 有两个主要组件:Eureka 服务器和 Eureka 客户端。
### Eureka 服务器
Eureka 服务器是一个服务注册中心。所有的服务提供者(微服务)都会在 Eureka 服务器上注册自己的服务,同时服务消费者(需要调用其他微服务的服务)也会从 Eureka 服务器上获取服务列表,从而实现服务的发现和调用。
#### 启动一个 Eureka 服务器
1. **创建一个 Spring Boot 项目**:
使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加 Eureka Server 依赖。
2. **配置 Eureka 服务器**:
在 `application.properties` 或 `application.yml` 文件中添加 Eureka 服务器的配置。
```properties
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
```
3. **启用 Eureka 服务器**:
在 Spring Boot 主类上添加 `@EnableEurekaServer` 注解。
```java
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);
}
}
```
### Eureka 客户端
Eureka 客户端是需要注册到 Eureka 服务器上的服务提供者或服务消费者。服务提供者在启动时会向 Eureka 服务器注册自己的信息,并定期发送心跳以保持注册信息的有效性。服务消费者则从 Eureka 服务器获取服务提供者的信息,以进行远程调用。
#### 启动一个 Eureka 客户端
1. **创建一个 Spring Boot 项目**:
使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加 Eureka Client 依赖。
2. **配置 Eureka 客户端**:
在 `application.properties` 或 `application.yml` 文件中添加 Eureka 客户端的配置。
```properties
server.port=8080
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
eureka.instance.prefer-ip-address=true
```
3. **启用 Eureka 客户端**:
在 Spring Boot 主类上添加 `@EnableEurekaClient` 注解。
```java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
```
4. **注册服务**:
将需要注册的服务在启动时自动注册到 Eureka 服务器上。在服务启动类或者配置文件中指定服务的名称。
```properties
spring.application.name=my-service
```
### 使用 Eureka 进行服务发现
服务消费者通过 Eureka 服务器获取服务提供者的地址列表,并通过负载均衡等方式调用服务。
1. **使用 RestTemplate 调用服务**:
配置 RestTemplate 并使用 `@LoadBalanced` 注解实现负载均衡。
```java
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
```
2. **调用服务**:
使用服务名替代具体的 IP 地址或域名进行服务调用。
```java
@Autowired
private RestTemplate restTemplate;
public String callService() {
return restTemplate.getForObject("http://my-service/endpoint", String.class);
}
```
通过上述步骤,可以快速搭建一个基于 Eureka 的服务注册与发现机制,方便在微服务架构中实现服务的自动发现和调用。