Eureka介绍和使用

Eureka介绍和使用

  • 一、基本介绍
    • [1. Eureka是什么?](#1. Eureka是什么?)
    • [2. Eureka的作用](#2. Eureka的作用)
    • [3. 常用使用场景](#3. 常用使用场景)
    • [4. Eureka的工作原理](#4. Eureka的工作原理)
    • [5. Eureka的优点](#5. Eureka的优点)
    • [6. 使用Eureka的注意事项](#6. 使用Eureka的注意事项)
  • 二、eureka配置项解释
    • [1. eureka.instance.hostname](#1. eureka.instance.hostname)
    • [2. eureka.instance.appname](#2. eureka.instance.appname)
    • [3. eureka.instance.instance-id](#3. eureka.instance.instance-id)
    • [4. eureka.client.serviceUrl.defaultZone](#4. eureka.client.serviceUrl.defaultZone)
    • [5. eureka.server.enable-self-preservation](#5. eureka.server.enable-self-preservation)
    • 6.eureka.client.registerWithEureka**
    • 7.eureka.client.fetchRegistry**
  • 三、Eureka使用详解及示例代码
    • [1. 环境准备](#1. 环境准备)
    • [2. 创建Eureka Server](#2. 创建Eureka Server)
      • [2.1. 创建Spring Boot项目](#2.1. 创建Spring Boot项目)
      • [2.2. 配置Eureka Server](#2.2. 配置Eureka Server)
      • [2.3. 启动Eureka Server](#2.3. 启动Eureka Server)
    • [3. 创建Eureka Client](#3. 创建Eureka Client)
      • [3.1. 添加Eureka Client依赖](#3.1. 添加Eureka Client依赖)
      • [3.2. 配置Eureka Client](#3.2. 配置Eureka Client)
      • [3.3. 注册服务](#3.3. 注册服务)
    • [4. 使用Eureka进行服务发现](#4. 使用Eureka进行服务发现)
      • [4.1. 在另一个Eureka Client中发现服务](#4.1. 在另一个Eureka Client中发现服务)
      • [4.2. 使用`@FeignClient`进行服务调用](#4.2. 使用@FeignClient进行服务调用)
    • [5. 总结](#5. 总结)

Eureka:Netflix的微服务注册中心

随着微服务的流行,服务的注册与发现成为了分布式系统中的关键组件。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实例的主机名。您可以将其设置为本地主机名或指定的主机名。

配置示例:

yaml 复制代码
eureka:
  instance:
    hostname: localhost

2. eureka.instance.appname

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

配置示例:

yaml 复制代码
eureka:
  instance:
    appname: my-service

3. eureka.instance.instance-id

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

配置示例:

yaml 复制代码
eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

4. eureka.client.serviceUrl.defaultZone

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

配置示例:

yaml 复制代码
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

5. eureka.server.enable-self-preservation

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

配置示例:

yaml 复制代码
eureka:
  server:
    enable-self-preservation: false

6.eureka.client.registerWithEureka**

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

示例配置:

yaml 复制代码
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获取服务注册表信息。

示例配置:

yaml 复制代码
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的依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2.2. 配置Eureka Server

application.yml中配置Eureka Server:

yaml 复制代码
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注解,并启动应用:

java 复制代码
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的依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

3.2. 配置Eureka Client

application.yml中配置Eureka Client:

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

3.3. 注册服务

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

java 复制代码
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注解:

java 复制代码
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的任何类中注入并使用这个接口:

java 复制代码
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可以简化服务间的调用过程。

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

相关推荐
weixin_438197381 小时前
K8S创建云主机配置docker仓库
linux·云原生·容器·eureka·kubernetes
一叶飘零_sweeeet18 小时前
Eureka、Zookeeper 与 Nacos:服务注册与发现功能大比拼
spring·zookeeper·eureka·nacos
hshpy20 小时前
Allow two Docker containers to communicate with each other
docker·容器·eureka
巅峰程序1 天前
[docker]拉取镜像失败
docker·容器·eureka
MonkeyKing_sunyuhua1 天前
sudo docker ps才能查看,docker ps不能查看问题
docker·容器·eureka
噜啦啦噜啦啦噜啦噜啦嘞噜啦噜啦2 天前
源码解析-Spring Eureka
java·spring·eureka
涔溪2 天前
Docker简介
spring cloud·docker·eureka
IsToRestart3 天前
Docker 的常用命令有哪些?
java·docker·eureka
free_girl_fang3 天前
SpringClud一站式学习之Eureka服务治理(二)
学习·云原生·eureka
Hello.Reader3 天前
解析Eureka的架构
云原生·eureka·架构