Eureka介绍和使用-CSDN博客


EurekaNetflix的微服务注册中心

随着微服务的流行服务的注册与发现成为了分布式系统中的关键组件。Netflix的Eureka是这一领域中的翘楚为微服务架构提供了强大的服务治理功能。本文将详细介绍Eureka是什么它的作用常用的使用场景以及工作原理。

一、基本介绍

1. Eureka是什么?

Eureka是Netflix开发的一个开源的服务注册与发现框架。在微服务架构中每个服务都需要知道其他服务的位置而Eureka就提供了这样一个中心化的注册中心让所有的服务都能够找到彼此。

2. Eureka的作用

  • 服务注册每个微服务在启动时都会在Eureka中进行注册告诉Eureka自己的网络位置。
  • 服务发现其他微服务需要调用某个服务时会向Eureka询问该服务的位置然后Eureka会返回该服务的网络地址。
  • 健康检查Eureka客户端会定时发送心跳到Eureka Server以此证明自己的“健康”状态。如果Eureka Server在一段时间内没有收到某个服务的心跳那么它会认为该服务已经宕机将其从服务列表中移除。
  • 负载均衡Eureka配合Ribbon或其他负载均衡工具可以实现客户端的负载均衡。

3. 常用使用场景

  • 任何使用微服务架构的应用都可以使用Eureka作为服务注册与发现的解决方案。
  • 在云环境中由于服务的IP地址经常变动使用Eureka可以动态地获取服务地址。
  • 当系统中存在大量的微服务并且需要频繁地互相调用时Eureka能够提供高效的服务发现机制。

4. Eureka的工作原理

  • 服务注册当微服务实例启动后会向Eureka Server发送注册请求携带自己的IP和端口等信息。Eureka Server接收到注册请求后会将该服务的信息存储到注册表中。
  • 服务续约为了避免因为网络分区导致的服务不可用问题Eureka客户端会定时向Eureka Server发送心跳来续约自己的“租期”。
  • 服务获取当其他服务需要调用某个服务时会向Eureka Server请求获取该服务的网络地址。Eureka Server会从注册表中查找该服务的信息并返回给请求者。
  • 服务下线当微服务实例关闭或异常时它会向Eureka Server发送下线请求。Eureka Server接收到请求后会将该服务从注册表中移除。

5. Eureka的优点

  • 高可用性Eureka Server设计为高可用性每个实例都能平等地提供服务注册和发现功能。多个Eureka Server可以相互复制注册表信息形成集群进一步提高系统的可用性。
  • 自我保护模式在网络分区故障发生网络不稳定期间Eureka客户端和Eureka Server之间无法正常通信Eureka Server将会切换到自我保护模式。在这种模式下Eureka Server会保护服务注册表中的信息不再删除服务注册表中的数据等到网络故障恢复后再自动退出自我保护模式。
  • 与Spring Cloud集成EurekaSpring Cloud集成良好为Spring Cloud微服务架构提供了服务注册与发现的解决方案。通过简单的配置就能将Spring Boot构建的微服务应用注册到Eureka Server。

6. 使用Eureka的注意事项

  • 合理设置服务续约间隔服务续约间隔决定了服务向Eureka Server发送心跳的频率。这个值设置得过小会增加网络负担设置得过大可能会导致服务在Eureka Server上过早被标记为不可用。
  • 确保Eureka Server的高可用Eureka Server的高可用是保证整个系统稳定运行的关键。在生产环境中通常建议部署多个Eureka Server实例形成集群。
  • 注意网络分区问题网络分区问题可能导致服务无法正常续约进而被Eureka Server标记为不可用。在这种情况下需要尽快解决网络问题或者考虑使用Eureka的自我保护模式。

二、eureka配置项解释

Eureka的配置文件设置对于Eureka的服务注册与发现功能至关重要。下面是Eureka的一些关键配置项以及它们的解释和配置方法

1. eureka.instance.hostname

此设置用于配置Eureka实例的主机名。您可以将其设置为本地主机名或指定的主机名。

配置示例

eureka:
  instance:
    hostname: localhost

2. eureka.instance.appname

此设置用于配置在Eureka服务中注册的应用名称。

配置示例

eureka:
  instance:
    appname: my-service

3. eureka.instance.instance-id

此设置用于配置Eureka实例的唯一ID。您可以根据需要使用默认设置或自定义唯一ID。

配置示例

eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

4. eureka.client.serviceUrl.defaultZone

此设置用于配置Eureka Server的地址。您需要指定Eureka Server的主机名和端口。

配置示例

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

5. eureka.server.enable-self-preservation

这个设置用于开启或关闭Eureka Server的自我保护模式。当设置为true时即使Eureka Server在短时间内丢失过多客户端也不会删除失去连接的客户端。这有助于提高系统的可用性。

配置示例

eureka:
  server:
    enable-self-preservation: false

6.eureka.client.registerWithEureka

这个配置用来决定Eureka客户端是否向Eureka Server注册自己。如果设置为true该客户端会向Eureka Server注册自己的信息这样其他服务就可以通过Eureka Server找到它。如果设置为false则该客户端不会注册到Eureka Server。

示例配置

eureka:
  client:
    registerWithEureka: false

通常情况下Eureka Server会将此值设置为false因为Eureka Server不需要向自己注册。而一般的Eureka Client应将其设置为true以完成服务注册。

7.eureka.client.fetchRegistry

这个配置用来决定Eureka客户端是否从Eureka Server获取服务注册信息。如果设置为true该客户端会从Eureka Server获取服务注册表的信息这样它就可以知道其他可用的服务实例。如果设置为false则该客户端不会从Eureka Server获取服务注册表信息。

示例配置

eureka:
  client:
    fetchRegistry: false

对于Eureka Server通常将此值设置为false因为它不需要获取自己的服务注册表信息。而对于需要发现其他服务的Eureka Client应将其设置为true

这两个配置项在Eureka的客户端和服务器角色中起着重要的作用正确地配置它们可以确保服务的正确注册和发现。在配置时需要根据实例的角色服务器或客户端和需求来选择合适的值。

以上就是Eureka的一些重要配置项及其配置方法。请注意这些配置项通常需要在您的Spring Boot应用的application.ymlapplication.properties文件中进行设置。具体的配置项可能会因您的实际需求和Eureka的版本而有所不同所以请根据实际情况进行调整。

三、Eureka使用详解及示例代码

本文将指导您如何使用Eureka进行服务注册与发现。我们将通过示例代码展示如何在Spring Boot应用中集成Eureka。

1. 环境准备

首先确保您已经安装了以下环境

  • JDK 1.8 或更高版本
  • Maven 3.0 或更高版本
  • Spring Boot 2.x

2. 创建Eureka Server

首先我们创建一个Eureka Server。这将作为服务的注册中心。

2.1. 创建Spring Boot项目

创建一个新的Spring Boot项目并在pom.xml中添加Eureka Server的依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2.2. 配置Eureka Server

application.yml中配置Eureka Server

server:
  port: 8761 
eureka:
  instance:
    hostname: localhost   #此设置用于配置Eureka实例的主机名。您可以将其设置为本地主机名或指定的主机名。
  client:
    registerWithEureka: false   # 这个配置用来决定Eureka客户端是否向Eureka Server注册自己。如果设置为true该客户端会向Eureka Server注册自己的信息这样其他服务就可以通过Eureka Server找到它。如果设置为false则该客户端不会注册到Eureka Server。通常情况下Eureka Server会将此值设置为false因为Eureka Server不需要向自己注册。而一般的Eureka Client应将其设置为true以完成服务注册。
    fetchRegistry: false
    serviceUrl:   # 此设置用于配置Eureka Server的地址。需要指定Eureka Server的主机名和端口。
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

2.3. 启动Eureka Server

在主类上添加@EnableEurekaServer注解并启动应用

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

3. 创建Eureka Client

接下来我们创建一个Eureka Client这将是我们要注册的服务。

3.1. 添加Eureka Client依赖

在另一个Spring Boot项目的pom.xml中添加Eureka Client的依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

3.2. 配置Eureka Client

application.yml中配置Eureka Client

server:
  port: 8080
spring:
  application:
    name: my-service   # 此设置用于配置在Eureka服务中注册的应用名称。
eureka:
  client:
    serviceUrl:   # 此设置用于配置Eureka Server的地址。需要指定Eureka Server的主机名和端口。
      defaultZone: http://localhost:8761/eureka/ 

3.3. 注册服务

在主类上添加@EnableEurekaClient注解并启动应用

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
    
    @GetMapping("/hello")
    public String hello() {
        return "Hello from Eureka Client!";
    }
}

现在您已经成功创建了一个Eureka Server和一个Eureka Client。启动Eureka Server然后启动Eureka Client您将看到Client成功注册到Server上。通过访问Eureka Server的管理界面默认地址http://localhost:8761/您将看到已注册的服务列表。同时其他服务也可以通过Eureka Server发现这个Client服务并进行调用。

4. 使用Eureka进行服务发现

在微服务架构中服务之间的调用经常是动态的我们不知道具体要调用哪个实例这时候就需要Eureka的服务发现功能。

4.1. 在另一个Eureka Client中发现服务

假设我们有一个名为my-service-consumer的另一个Eureka Client它需要调用上面创建的my-service

首先确保my-service-consumer也添加了Eureka Client的依赖并进行了相应的配置。

4.2. 使用@FeignClient进行服务调用

Spring Cloud提供了Feign作为HTTP客户端进行服务间的调用它基于Ribbon和Hystrix并整合了Eureka简化了服务调用的过程。

my-service-consumer中创建一个接口并使用@FeignClient注解

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "my-service")
public interface MyServiceClient {
    @GetMapping("/hello")
    String hello();
}

这里value = "my-service"表示要调用的服务的名称它应该与在Eureka中注册的服务名称相匹配。

接着你可以在my-service-consumer的任何类中注入并使用这个接口

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConsumerController {
    private final MyServiceClient myServiceClient;

    @Autowired
    public ConsumerController(MyServiceClient myServiceClient) {
        this.myServiceClient = myServiceClient;
    }

    @GetMapping("/call-my-service")
    public String callMyService() {
        return myServiceClient.hello(); // 这里将调用my-service的/hello接口
    }
}

5. 总结

通过上面的示例我们展示了如何在Spring Boot应用中集成Eureka并进行服务注册与发现。在实际应用中您可能会有多个Eureka Server实例和多个Eureka Client实例。确保在生产环境中适当配置这些实例以保证高可用性。同时使用Feign可以简化服务间的调用过程。

请注意本文提供的示例代码仅用于演示目的。在生产环境中使用时请根据实际需求进行适当的调整和优化。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6