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

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

相关推荐
dessler1 天前
Docker-如何启动docker
运维·docker·云原生·容器·eureka
Likelong~1 天前
Etcd注册中心基本实现
etcd·注册中心
暴富的Tdy2 天前
【快速上手Docker 简单配置方法】
docker·容器·eureka
维李设论2 天前
Node.js的Web服务在Nacos中的实践
前端·spring cloud·微服务·eureka·nacos·node.js·express
筏镜2 天前
调整docker bridge地址冲突,通过bip调整 bridge地址
java·docker·eureka
岁月变迁呀3 天前
Eureka服务注册源码
spring cloud·eureka
阿髙3 天前
docker 软连接修改存储位置
java·docker·eureka
夏尔Gaesar3 天前
Failed to start Docker Application Container Engine
docker·容器·eureka
wyy72933 天前
树莓派4B 搭建openwrt内置超多插件docker,nas等等使用教程
docker·容器·eureka
勇-子4 天前
K8s docker-compose的入门
docker·eureka·kubernetes