SpringCloud入门—Eureka入门

本文介绍了SpringCloud Eureka的基础概念,单节点和多节点搭建,以及其实现原理,涵盖了服务注册、发现、心跳、取消请求和时间同步等内容。适合初学者了解微服务治理的核心组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringCloud入门—Eureka入门

一、介绍

  • 背景
    在传统应用中,组件之间的调用,通过有规范的约束的接口来实现,从而实现不同模块间良好的协作。但是被拆分成微服务后,每个微服务实例的网络地址都可能动态变化,数量也会变化,使得原来硬编码的地址失去了作用。需要一个中心化的组件来进行服务的登记和管理。

  • 概念
    实现服务治理,即管理所有的服务信息和状态。

    注册中心用途相当于打开地图找周围超市买东西,先看看周围都有哪些超市(获取注册列表),再去超市买东西(调用服务)。
    
  • 服务器端
    Server是一个公共服务,为Client提供服务注册和发现的功能,维护注册到自身的Client的相关信息,同时提供接口给Client获取注册表中其他服务的信息,使得动态变化的Client能够进行服务间的相互调用。

  • 客户端
    Client将自己的服务信息通过一定的方式登记到Server上,并在正常范围内维护自己信息一致性,方便其他服务发现自己,同时可以通过Server获取到自己依赖的其他服务信息,完成服务调用,还内置了负载均衡器,用来进行基本的负载均衡。

二、Eureka单节点搭建

  1. pom

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.zhow</groupId>
        <artifactId>Eureka-Server</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>Eureka-Server</name>
        <description>Eureka-Server</description>
    
        <properties>
            <java.version>1.8</java.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
            <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>${spring-boot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.3.7.RELEASE</version>
                    <configuration>
                        <mainClass>com.zhow.eurekaserver.EurekaServerApplication</mainClass>
                    </configuration>
                    <executions>
                        <execution>
                            <id>repackage</id>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    
  2. application.properties

    #是否将自己注册到Eureka Server,默认为true,由于当前就是server,故而设置成false,表明该服务不会向eureka注册自己的信息
    eureka.client.register-with-eureka=false
    #是否从eureka server获取注册信息,由于单节点,不需要同步其他节点数据,用false
    eureka.client.fetch-registry=false
    #设置服务注册中心的URL,用于client和server端交流
    eureka.client.serviceUrl.defaultZone=http://localhost:7000/eureka/
    
  3. 代码

    启动类上添加此注解标识该服务为配置中心
    @EnableEurekaServer
    

打开http://localhost:8080/,查看Eureka页面。

三、Eureka多节点搭建

client功能

  1. 注册:每个微服务启动时,将自己的网络地址等信息注册到注册中心,注册中心会存储(内存中)这些信息。
  2. 获取服务注册表:服务消费者从注册中心,查询服务提供者的网络地址,并使用该地址调用服务提供者,为了避免每次都查注册表信息,所以client会定时去server拉取注册表信息到缓存到client本地。
  3. 心跳:各个微服务与注册中心通过某种机制(心跳)通信,若注册中心长时间和服务间没有通信,就会注销该实例。
  4. 调用:实际的服务调用,通过注册表,解析服务名和具体地址的对应关系,找到具体服务的地址,进行实际调用。

server注册中心功能

  1. 服务注册表:记录各个微服务信息,例如服务名称,ip,端口等。

    注册表提供 查询API(查询可用的微服务实例)和管理API(用于服务的注册和注销)。

  2. 服务注册与发现:注册:将微服务信息注册到注册中心。发现:查询可用微服务列表及其网络地址。

  3. 服务检查:定时检测已注册的服务,如发现某实例长时间无法访问,就从注册表中移除。

搭建

  1. 修改本机hosts文件
    文件位置 C:\Windows\System32\drivers\etc

    hosts文件下添加以下代码
    127.0.0.1 eureka1.com
    127.0.0.1 eureka2.com
    127.0.0.1 eureka3.com
    
  2. pom 不变

  3. application.properties

    #依次打开eureka1,eureka2,eureka3
    spring.profiles.active=eureka1
    #spring.application.name 表示是否为同一服务
    spring.application.name=EurekaService
    

    application-eureka1.properties

    #是否将自己注册到其他Eureka Server,默认为true 需要
    #eureka.client.register-with-eureka=true
    #是否从eureka server获取注册信息, 需要
    #eureka.client.fetch-registry=true
    #设置服务注册中心的URL,用于client和server端交流
    #此节点应向其他节点发起请求
    eureka.client.serviceUrl.defaultZone=http://eureka2.com:7002/eureka/,http://eureka3.com:7003/eureka/
    #主机名,必填
    eureka.instance.hostname=eureka1.com
    #web端口,服务是由这个端口处理rest请求的
    server.port=7001
    

    application-eureka2.properties

    #是否将自己注册到其他Eureka Server,默认为true 需要
    #eureka.client.register-with-eureka=true
    #是否从eureka server获取注册信息, 需要
    #eureka.client.fetch-registry=true
    #设置服务注册中心的URL,用于client和server端交流
    #此节点应向其他节点发起请求
    eureka.client.serviceUrl.defaultZone=http://eureka1.com:7001/eureka/,http://eureka3.com:7003/eureka/
    #主机名,必填
    eureka.instance.hostname=eureka2.com
    #web端口,服务是由这个端口处理rest请求的
    server.port=7002
    

    application-eureka3.properties

    #是否将自己注册到其他Eureka Server,默认为true 需要
    #eureka.client.register-with-eureka=true
    #是否从eureka server获取注册信息, 需要
    #eureka.client.fetch-registry=true
    #设置服务注册中心的URL,用于client和server端交流
    #此节点应向其他节点发起请求
    eureka.client.serviceUrl.defaultZone=http://eureka1.com:7001/eureka/,http://eureka2.com:7002/eureka/
    #主机名,必填
    eureka.instance.hostname=eureka3.com
    #web端口,服务是由这个端口处理rest请求的
    server.port=7003
    

    打开http://localhost:7001,查看Eureka页面。
    在这里插入图片描述

四、Eureka原理

Register 服务注册

想要参与服务注册发现的实例首先需要向Eureka服务器注册信息。

注册在第一次心跳发生时提交

Renew 续租,心跳

Eureka客户需要每30秒发送一次心跳来续租

更新通知Eureka服务器实例仍然是活动的。如果服务器在90秒内没有看到更新,它将从其注册表中删除实例

Fetch Registry 获取注册表信息

Eureka客户端从服务器获取注册表信息并将其缓存在本地。

之后,客户端使用这些信息来查找其他服务。

通过获取上一个获取周期和当前获取周期之间的增量更新,可以定期(每30秒)更新此信息。

节点信息在服务器中保存的时间更长(大约3分钟),因此获取节点信息时可能会再次返回相同的实例。Eureka客户端自动处理重复的信息。

在获得增量之后,Eureka客户机通过比较服务器返回的实例计数来与服务器协调信息,如果由于某种原因信息不匹配,则再次获取整个注册表信息。

Cancel 发送取消请求

Eureka客户端在关闭时向Eureka服务器发送取消请求。这将从服务器的实例注册表中删除实例,从而有效地将实例从通信量中取出。

Time Lag 同步时间延迟

来自Eureka客户端的所有操作可能需要一段时间才能反映到Eureka服务器上,然后反映到其他Eureka客户端上。这是因为eureka服务器上的有效负载缓存,它会定期刷新以反映新信息。Eureka客户端还定期地获取增量。因此,更改传播到所有Eureka客户机可能需要2分钟。

Communication mechanism 通讯机制

Http协议下的Rest请求

默认情况下Eureka使用Jersey和Jackson以及JSON完成节点间的通讯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值