Eureka 是 Netflix 开源的一个服务发现组件,在微服务架构中扮演着重要的角色。Eureka Server 提供服务注册与发现的功能,而 Eureka Client 负责将自身服务信息注册到 Eureka Server,同时也可以从 Eureka Server 获取其他服务的信息。
以下是 Eureka 的基本原理及其在实践中的应用步骤。
1. Eureka 的基本原理
1.1 Eureka Server
Eureka Server 是一个服务注册中心,所有 Eureka Client(即微服务)都会向其注册自身信息(例如主机名、IP 地址、端口号、状态等)。Eureka Server 维护着这些服务的注册信息,并提供服务发现的功能,其他服务可以通过 Eureka Server 获取服务的访问信息。
1.2 Eureka Client
Eureka Client 是微服务的一部分,它包含两个主要的功能:
- 服务注册:Eureka Client 启动时,会向 Eureka Server 注册自己的服务信息。定期发送心跳请求来续约,表示服务仍然可用。
- 服务发现:Eureka Client 可以从 Eureka Server 获取其他已注册服务的信息,供调用者使用。
1.3 服务注册与续约机制
- 服务注册:Eureka Client 启动后会自动将自己的服务信息注册到 Eureka Server。
- 续约:注册成功后,Eureka Client 会以一定的时间间隔(默认30秒)向 Eureka Server 发送心跳,续约租约,表明该服务仍然处于活跃状态。
- 服务剔除:如果 Eureka Server 在一定时间内(默认90秒)没有收到某个服务的续约信息,会将该服务实例从注册表中移除。
1.4 服务发现
- 服务发现:当一个服务需要调用另一个服务时,Eureka Client 会从 Eureka Server 获取目标服务的实例列表。调用者可以通过负载均衡策略选择一个实例进行访问。
2. Eureka 实践步骤
2.1 创建 Eureka Server
首先,创建一个 Eureka Server。
1. 创建一个 Spring Boot 项目:
使用 Spring Initializr 创建一个新的 Spring Boot 项目,选择以下依赖:
- Eureka Server
- Spring Web
2. 配置 Eureka Server:
在项目的主类中添加
@EnableEurekaServer
注解:
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication@EnableEurekaServerpublicclassEurekaServerApplication{publicstaticvoidmain(String[] args){SpringApplication.run(EurekaServerApplication.class, args);}}
**3. 配置文件
application.yml
:**
server:port:8761eureka:client:register-with-eureka:false# 不向自身注册fetch-registry:false# 不拉取注册表spring:application:name: eureka-server
4. 启动 Eureka Server:
运行
EurekaServerApplication
,Eureka Server 会在
http://localhost:8761/
启动,你可以在浏览器中查看 Eureka 的控制台。
2.2 创建 Eureka Client
接下来,创建一个将注册到 Eureka Server 的服务。
1. 创建一个新的 Spring Boot 项目:
使用 Spring Initializr 创建一个新的 Spring Boot 项目,选择以下依赖:
- Eureka Discovery Client
- Spring Web
2. 配置 Eureka Client:
在项目的主类中添加
@EnableEurekaClient
注解:
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication@EnableEurekaClientpublicclassEurekaClientApplication{publicstaticvoidmain(String[] args){SpringApplication.run(EurekaClientApplication.class, args);}}
**3. 配置文件
application.yml
:**
server:port:8080eureka:client:service-url:defaultZone: http://localhost:8761/eureka/ # 指定 Eureka Server 的地址instance:prefer-ip-address:truespring:application:name: eureka-client
4. 创建一个简单的 REST 控制器:
importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassHelloController{@GetMapping("/hello")publicStringhello(){return"Hello from Eureka Client!";}}
5. 启动 Eureka Client:
运行
EurekaClientApplication
,该服务会自动注册到 Eureka Server 上。
2.3 服务发现与调用
如果你有多个服务注册在 Eureka Server 上,你可以使用
RestTemplate
或
Feign
来实现服务间的调用。
**使用
RestTemplate
实现服务调用:**
importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cloud.client.ServiceInstance;importorg.springframework.cloud.client.discovery.DiscoveryClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.client.RestTemplate;importjava.util.List;@RestControllerpublicclassServiceController{@AutowiredprivateDiscoveryClient discoveryClient;@GetMapping("/invoke")publicStringinvokeService(){List<ServiceInstance> instances = discoveryClient.getInstances("eureka-client");if(instances.size()>0){String serviceUri = instances.get(0).getUri().toString()+"/hello";RestTemplate restTemplate =newRestTemplate();return restTemplate.getForObject(serviceUri,String.class);}return"No instances available!";}}
当你访问
/invoke
端点时,它会调用注册在 Eureka 上的
eureka-client
服务的
/hello
端点,并返回结果。
3. 集群与高可用性
为了实现高可用性,你可以部署多个 Eureka Server 实例并将它们组成一个集群。Eureka Server 可以通过配置相互注册,从而实现高可用性。
集群配置示例:
eureka:client:service-url:defaultZone: http://eureka-server-1:8761/eureka/,http://eureka-server-2:8762/eureka/
在这种配置下,每个 Eureka Client 会向多个 Eureka Server 注册,并且 Eureka Server 之间也会同步注册表信息,从而实现容灾和负载均衡。
4. Eureka 的自我保护机制
Eureka 具有自我保护机制,当大量客户端突然失去联系时,Eureka 不会立即将这些实例移出注册表,以防止网络分区或瞬时故障导致的错误判断。
这种机制可以通过以下配置控制:
eureka:server:enable-self-preservation:true
当自我保护机制启用时,即使没有收到心跳,Eureka Server 也不会立即将服务标记为不可用。
总结
Eureka 作为服务注册和发现组件,在微服务架构中起着关键作用。通过 Eureka,可以实现服务的自动注册与发现,简化了服务之间的通信流程。同时,Eureka 还提供了高可用性和自我保护机制,保障服务的可靠性。在实践中,通过配置 Eureka Server 和 Eureka Client,你可以轻松构建一个支持服务自动化管理的分布式系统。
版权归原作者 先天无极编程圣体 所有, 如有侵权,请联系我们删除。