Eureka是Netflix开发的服务发现框架,后来成为了Spring Cloud Netflix组件之一。它主要用于AWS云环境中管理服务间的注册与发现,但也可以在非AWS环境中工作。Eureka包含两个主要组件:Eureka Server和Eureka Client。
Eureka Server
Eureka Server提供服务注册服务。各个微服务启动时,会通过Eureka Client向Eureka Server注册自身服务的信息(如服务的地址、端口等),Eureka Server将这些信息存储在一个双层Map结构中,用于服务发现时的查询。
Eureka Server的启动
要创建一个Eureka Server,首先需要添加相应的依赖:
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
然后,在Spring Boot应用的主类上使用@EnableEurekaServer
注解来启动Eureka Server:
java
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
application.yml
配置示例:
yaml
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
这段配置启动了一个Eureka Server,并在8761端口监听。registerWithEureka: false
和fetchRegistry: false
的设置表示它不会将自己注册为客户端,也不会尝试获取服务注册信息,因为它是服务注册中心。
Eureka Client
Eureka Client是一个Java客户端,用于简化与Eureka Server的交互。客户端启动时,会向Eureka Server注册自己,并周期性地发送心跳来更新其服务续约。如果客户端长时间没有发送心跳,Eureka Server将会注销该实例。
客户端注册与发现
要使应用成为Eureka Client,需要添加以下依赖:
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
并在主类上添加@EnableDiscoveryClient
注解:
java
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
application.yml
配置示例:
yaml
server:
port: 8080
spring:
application:
name: myservice
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
preferIpAddress: true
这段配置定义了一个Eureka Client,它会在启动时自动注册到http://localhost:8761/eureka/
上的Eureka Server。
源码解析
Eureka Server在处理注册请求时,主要是通过com.netflix.eureka.registry.AbstractInstanceRegistry
类的register
方法实现的。这个方法会把服务实例信息注册到内部的注册表中。对于服务的续约,则是通过renew
方法来实现。
Eureka Client通过DiscoveryClient
类与Eureka Server进行通信。在启动时,DiscoveryClient
会向Eureka Server发送注册请求,同时会启动一个定时任务,定期向Server发送心跳,以续约服务。
总结
Eureka通过其Server和Client组件提供了一种简单有效的服务注册与发现机制。作为Spring Cloud Netflix项目的一部分,Eureka非常适合构建基于Spring Boot的微服务架构。通过使用Eureka,微服务之间能够相互发现并通信,从而提高了系统的整体可靠性和弹性。