Eureka原理实践

打印 上一主题 下一主题

主题 891|帖子 891|积分 2683

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 注解:
  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  4. @SpringBootApplication
  5. @EnableEurekaServer
  6. public class EurekaServerApplication {
  7.     public static void main(String[] args) {
  8.         SpringApplication.run(EurekaServerApplication.class, args);
  9.     }
  10. }
复制代码
3. 设置文件 application.yml:
  1. server:
  2.   port: 8761
  3. eureka:
  4.   client:
  5.     register-with-eureka: false  # 不向自身注册
  6.     fetch-registry: false        # 不拉取注册表
  7. spring:
  8.   application:
  9.     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 注解:
  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  4. @SpringBootApplication
  5. @EnableEurekaClient
  6. public class EurekaClientApplication {
  7.     public static void main(String[] args) {
  8.         SpringApplication.run(EurekaClientApplication.class, args);
  9.     }
  10. }
复制代码
3. 设置文件 application.yml:
  1. server:
  2.   port: 8080
  3. eureka:
  4.   client:
  5.     service-url:
  6.       defaultZone: http://localhost:8761/eureka/  # 指定 Eureka Server 的地址
  7.   instance:
  8.     prefer-ip-address: true
  9. spring:
  10.   application:
  11.     name: eureka-client
复制代码
4. 创建一个简单的 REST 控制器:
  1. import org.springframework.web.bind.annotation.GetMapping;
  2. import org.springframework.web.bind.annotation.RestController;
  3. @RestController
  4. public class HelloController {
  5.     @GetMapping("/hello")
  6.     public String hello() {
  7.         return "Hello from Eureka Client!";
  8.     }
  9. }
复制代码
5. 启动 Eureka Client:
运行 EurekaClientApplication,该服务会自动注册到 Eureka Server 上。
2.3 服务发现与调用

如果你有多个服务注册在 Eureka Server 上,你可以使用 RestTemplate 或 Feign 来实现服务间的调用。
使用 RestTemplate 实现服务调用:
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.cloud.client.ServiceInstance;
  3. import org.springframework.cloud.client.discovery.DiscoveryClient;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import org.springframework.web.client.RestTemplate;
  7. import java.util.List;
  8. @RestController
  9. public class ServiceController {
  10.     @Autowired
  11.     private DiscoveryClient discoveryClient;
  12.     @GetMapping("/invoke")
  13.     public String invokeService() {
  14.         List<ServiceInstance> instances = discoveryClient.getInstances("eureka-client");
  15.         if (instances.size() > 0) {
  16.             String serviceUri = instances.get(0).getUri().toString() + "/hello";
  17.             RestTemplate restTemplate = new RestTemplate();
  18.             return restTemplate.getForObject(serviceUri, String.class);
  19.         }
  20.         return "No instances available!";
  21.     }
  22. }
复制代码
当你访问 /invoke 端点时,它会调用注册在 Eureka 上的 eureka-client 服务的 /hello 端点,并返回效果。
3. 集群与高可用性

为了实现高可用性,你可以摆设多个 Eureka Server 实例并将它们组成一个集群。Eureka Server 可以通过设置相互注册,从而实现高可用性。
集群设置示例:
  1. eureka:
  2.   client:
  3.     service-url:
  4.       defaultZone: http://eureka-server-1:8761/eureka/,http://eureka-server-2:8762/eureka/
复制代码
在这种设置下,每个 Eureka Client 会向多个 Eureka Server 注册,并且 Eureka Server 之间也会同步注册表信息,从而实现容灾和负载均衡。
4. Eureka 的自我掩护机制

Eureka 具有自我掩护机制,当大量客户端忽然失去接洽时,Eureka 不会立即将这些实例移出注册表,以防止网络分区或瞬时故障导致的错误判断。
这种机制可以通过以下设置控制:
  1. eureka:
  2.   server:
  3.     enable-self-preservation: true
复制代码
当自我掩护机制启用时,纵然没有收到心跳,Eureka Server 也不会立即将服务标记为不可用。
总结

Eureka 作为服务注册和发现组件,在微服务架构中起着关键作用。通过 Eureka,可以实现服务的自动注册与发现,简化了服务之间的通信流程。同时,Eureka 还提供了高可用性和自我掩护机制,保障服务的可靠性。在实践中,通过设置 Eureka Server 和 Eureka Client,你可以轻松构建一个支持服务自动化管理的分布式体系。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表