服务注册与发现(Eureka)
1. Eureka 简介
Eureka 是 Netflix 开源的一个服务注册与发现组件,用于在微服务架构中帮助服务自动注册和查找其他服务。它允许微服务通过一个集中式注册中心实现动态的服务发现,从而提高系统的扩展性、灵活性和容错能力。
在微服务架构中,服务注册与发现是至关重要的一部分。Eureka Server 作为注册中心,负责管理所有服务实例的注册信息,Eureka Client 则负责向 Eureka Server 注册自己并定期发送心跳,确保自身服务的可用性。同时,其他服务可以通过 Eureka 查询到已注册的服务并与其通信。
2. Eureka 组件
- Eureka Server:注册中心,负责存储所有服务的注册信息。
- Eureka Client:服务客户端,负责注册自身服务并从 Eureka Server 获取其他服务的地址。
- Eureka Dashboard:提供可视化界面,用于查看当前服务的健康状态和注册信息。
3. Eureka 工作原理
- 服务注册:Eureka Client 在启动时,将自身信息(如服务名、IP 地址、端口号等)注册到 Eureka Server。
- 服务续约:Eureka Client 会定期发送心跳(默认每 30 秒一次)给 Eureka Server,保持服务的可用状态。
- 服务剔除:如果 Eureka Server 在一定时间内未接收到某个服务的心跳信息,会将该服务标记为不可用,并从注册表中剔除。
- 服务发现:Eureka Client 从 Eureka Server 获取注册表(即所有已注册服务的清单),并缓存该清单来实现服务发现。
- 自我保护模式:当 Eureka Server 检测到大量服务丢失心跳时,会启动自我保护模式,防止将健康的服务错误地剔除。
4. Eureka 的配置
4.1 搭建 Eureka Server
首先,创建一个 Eureka Server,它将作为服务注册中心,所有服务都需要注册到这里。
1. 添加依赖:
在 pom.xml 中添加 Eureka Server 的依赖:
xml
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
2. 编写启动类:
在主应用程序类中使用 @EnableEurekaServer 注解启用 Eureka Server:
@SpringBootApplication
@EnableEurekaServer // 启用 Eureka 服务注册中心
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3. 配置文件 application.yml:
server:
port: 8761 # Eureka Server 端口
eureka:
client:
register-with-eureka: false # 当前应用是 Eureka Server,不需要注册自己
fetch-registry: false # 不从其他 Eureka Server 获取服务注册表
server:
enable-self-preservation: false # 禁用自我保护模式(测试用)
启动 Eureka Server,访问 http://localhost:8761,可以看到 Eureka 控制台,显示当前没有注册的服务。
4.2 搭建 Eureka Client(服务提供者)
接下来,创建一个服务提供者,它会向 Eureka 注册自身服务。
1. 添加依赖:
在 pom.xml 中添加 Eureka Client 的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2. 编写服务提供者类:
@SpringBootApplication
@EnableEurekaClient // 启用 Eureka 客户端
@RestController
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
@GetMapping("/hello")
public String sayHello() {
return "Hello from Service Provider!";
}
}
3. 配置文件 application.yml:
server:
port: 8081 # 服务提供者的端口
spring:
application:
name: service-provider # 服务名称
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # 指定 Eureka Server 的地址
启动服务提供者,访问 http://localhost:8761,可以看到 service-provider 服务已经成功注册到 Eureka Server 中。
4.3 搭建 Eureka Client(服务消费者)
创建一个服务消费者,通过服务发现机制调用服务提供者的接口。
1. 添加依赖:
在 pom.xml 中添加 Eureka Client 和 Feign 的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 编写服务消费者类:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients // 启用 Feign 客户端
@RestController
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
@Autowired
private HelloService helloService;
@GetMapping("/consume")
public String consume() {
return helloService.sayHello();
}
}
@FeignClient(name = "service-provider") // 声明式 HTTP 客户端,name 对应服务提供者的名称
public interface HelloService {
@GetMapping("/hello")
String sayHello();
}
3. 配置文件 application.yml:
server:
port: 8082 # 服务消费者的端口
spring:
application:
name: service-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # 指定 Eureka Server 的地址
启动服务消费者,访问 http://localhost:8082/consume,可以看到通过 Feign 调用服务提供者接口,返回 “Hello from Service Provider!”。
5. Eureka 优缺点
优点:
- 简化了服务注册与发现的流程,提供了自动化的服务管理。
- Eureka 提供了服务的负载均衡和故障容错能力。
- 可视化的控制台方便监控服务的健康状况。
- 自我保护模式在网络分区或临时故障时可以防止服务大规模剔除。
缺点: - 由于是集中式的注册中心,Eureka Server 是单点故障的潜在源头,尽管可以通过集群部署来提高可用性。
- 相比于其他服务注册发现机制(如 Consul 或 Zookeeper),Eureka 偏向于简单易用,但在一致性和性能方面可能略显不足。
6. 总结
Eureka 是 Spring Cloud 中用于实现服务注册与发现的核心组件,适用于微服务架构中动态、灵活的服务管理。通过 Eureka,服务可以自动发现和通信,极大地减少了服务之间的耦合和配置的复杂性。同时,配合其他 Spring Cloud 组件,如 Ribbon、Feign,可以轻松实现负载均衡和声明式服务调用。