Eureka服务发现框架介绍
前言
Eureka:服务注册与发现组件,用于实现服务的自动注册与发现,Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,Spring Cloud Eureka提供服务端与客户端,服务端即是Eureka服务注册中心,客户端完成微服务向Eureka服务的注册与发现。服务端和客户端均采用Java语言编写。
Eureka作为初代的服务注册和发现组件,其基本思想和原理对于后来的Nacos有深远的影响,在nacos中也能隐约看到其身影。
为什么使用Eureka
- 动态服务注册与发现:服务实例在启动时自动注册到Eureka服务器,并提供心跳机制保持服务的活跃状态。
- 负载均衡:Eureka可以作为客户端负载均衡器的一部分,帮助客户端应用根据服务实例的列表进行请求分发。
- 故障转移:当服务实例失败时,Eureka可以快速通知其他服务实例,实现故障转移。
- 区域感知性:Eureka可以优先返回同一区域的服务实例,优化访问速度。
- 自我保护:在网络分区或其他异常情况下,Eureka可以自动进入自我保护模式,避免过度下线服务实例。
初始Eureka
上图中共涉及到以下 3 个角色:
- 服务注册中心(Register Service):它是一个 Eureka Server,用于提供服务注册和发现功能。
- 服务提供者(Provider Service):它是一个 Eureka Client,用于提供服务。它将自己提供的服务注册到服务注册中心,以供服务消费者发现。
- 服务消费者(Consumer Service):它是一个 Eureka Client,用于消费服务。它可以从服务注册中心获取服务列表,调用所需的服务。
Eureka 实现服务注册与发现的流程如下:
- 搭建一个 Eureka Server 作为服务注册中心;
- 服务提供者 Eureka Client 启动时,会把当前服务器的信息以服务名(spring.application.name)的方式注册到服务注册中心;
- 服务消费者 Eureka Client 启动时,也会向服务注册中心注册;
- 服务消费者还会获取一份可用服务列表,该列表中包含了所有注册到服务注册中心的服务信息(包括服务提供者和自身的信息);
- 在获得了可用服务列表后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。
服务注册中心(Eureka Server)所扮演的角色十分重要,它是服务提供者和服务消费者之间的桥梁。服务提供者只有将自己的服务注册到服务注册中心才可能被服务消费者调用,而服务消费者也只有通过服务注册中心获取可用服务列表后,才能调用所需的服务。
Eureka的工作原理
Eureka包含两个主要组件:Eureka Server和Eureka Client。
- Eureka Server 提供服务注册和发现的功能。
- Eureka Client 是一个Java客户端,用于简化与Eureka Server的交互。
- 服务提供方启动后将注册到注册中心,提供IP, 名字,什么服务等信息。
- 服务调用方作为客户端注册到注册中心后,拉取注册中心的服务列表,在通过负载均衡调用对应的服务提供方。
- 注册中心可以建立集群,生成多台eureka,注册中心为了监测各个服务的心跳,将在每30S 向所注册的服务发起请求判断
- 服务是否挂掉,如果挂掉90S后将会将服务从注册中心剔除。
- 一个服务可以监测多台服务实例,从而可实现均衡负载。
示例代码
1. 搭建Eureka Server
首先,创建一个Spring Boot应用并添加Eureka Server的依赖:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies>
然后,创建一个主类来启动Eureka Server:
@SpringBootApplication@EnableEurekaServerpublicclassEurekaServerApplication{publicstaticvoidmain(String[] args){SpringApplication.run(EurekaServerApplication.class, args);}}
2. 集成Eureka Client
接下来,创建一个服务实例并集成Eureka Client:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency></dependencies>
在配置文件中指定Eureka Server的地址:
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
在服务的主类上添加
@EnableDiscoveryClient
注解:
@SpringBootApplication@EnableDiscoveryClientpublicclassServiceApplication{publicstaticvoidmain(String[] args){SpringApplication.run(ServiceApplication.class, args);}}
3. 使用服务发现
一旦服务实例注册到Eureka Server,其他服务可以通过Eureka Client发现这些服务。例如,使用RestTemplate进行服务调用:
@AutowiredprivateDiscoveryClient discoveryClient;publicStringcallService(String serviceId){List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);if(!instances.isEmpty()){ServiceInstance instance = instances.get(0);// 选择第一个实例return restTemplate.getForObject(instance.getUri().toString()+"/service-path",String.class);}return"Service not available";}
总结
Eureka作为微服务架构中的服务发现工具,通过其心跳续约、服务下线与剔除、自我保护等机制,提供了一种高效、可靠的服务注册与发现解决方案。通过搭建Eureka集群,可以进一步提高系统的可用性和稳定性。在实际开发中,合理地使用Eureka可以显著提升微服务架构的灵活性和扩展性。
版权归原作者 北洛1024 所有, 如有侵权,请联系我们删除。