SpringColud Eureka的服务注册与发现,程序员工作2年月薪12K

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

Eureka GIt官网:https://github.com/Netflix/Eureka

1.3 服务注册与发现

服务注册与发现关系图:

在这里插入图片描述

1.2 client功能和server功能

1.2.1 client功能
  1. 注册:每个微服务启动时,将自己的网络地址等信息注册到注册中心,注册中心会存储(内存中)这些信息。

  2. 获取服务注册表:服务消费者从注册中心,查询服务提供者的网络地址,并使用该地址调用服务提供者,为了避免每次都查注册表信息,所以client会定时去server拉取注册表信息到缓存到client本地。

  3. 心跳:各个微服务与注册中心通过某种机制(心跳)通信,若注册中心长时间和服务间没有通信,就会注销该实例。

  4. 调用:实际的服务调用,通过注册表,解析服务名和具体地址的对应关系,找到具体服务的地址,进行实际调用。

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

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

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

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

二、Eureka单节点搭建


2.1 pom.xml

在有的教程中,会引入spring-boot-starter-web,这个依赖其实不用,因为spring-cloud-starter-netflix-eureka-server的依赖已经包含了它,在pom依赖进去,就可以了

org.springframework.cloud

spring-cloud-starter-netflix-eureka-server

2.2 application.yml

server:

port: 8500

eureka:

client:

#是否将自己注册到Eureka Server,默认为true,由于当前就是server,故而设置成false,表明该服务不会向eureka注册自己的信息

register-with-eureka: false

#是否从eureka server获取注册信息,由于单节点,不需要同步其他节点数据,用false

fetch-registry: false

#设置服务注册中心的URL,用于client和server端交流

service-url:

defaultZone: http://localhost:8080/eureka/

2.3 服务端启动类

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

@EnableEurekaServer

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer

@SpringBootApplication

public class EurekaServerApplication {

public static void main(String[] args) {

SpringApplication.run(EurekaServerApplication.class, args);

}

}

2.4 启动

我们启动EurekaDemoApplication,然后在浏览器中输入地址 http://localhost:8500/,就可以启动我们的 Eureka 了,我们来看下效果,出现了这个画面,就说明我们已经成功启动~,只是此时我们的服务中是还没有客户端进行注册

在这里插入图片描述

三、服务注册


注意:在客户端pom里面我们需要加上spring-boot-starter-web,否则服务是无法正常启动的

3.1 pom.xml

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

3.2 application.yml

#注册中心

eureka:

client:

#设置服务注册中心的URL

service-url:

defaultZone: http://localhost:8500/eureka/

#服务名

instance:

appname: mxn

3.3 客户端启动类

在客户端启动类中我们需要加上 @EnableDiscoveryClient注解

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient

@SpringBootApplication

public class EurekaClientApplication {

public static void main(String[] args) {

SpringApplication.run(EurekaClientApplication.class, args);

}

}

3.4 查看效果

工程启动后,刷新http://localhost:8500/页面,我们可以发现服务注册成功了

在这里插入图片描述

并且我们可以在idea日志打印中看到DiscoveryClient_MXN/DESKTOP-5BQ3UK8 - registration status: 204,说明就是注册成功了

Eureka Server与Eureka Client之间的联系主要通过心跳的方式实现。心跳(Heartbeat)即Eureka Client定时向Eureka Server汇报本服务实例当前的状态,维护本服务实例在注册表中租约的有效性。

Eureka Client将定时从Eureka Server中拉取注册表中的信息,并将这些信息缓存到本地,用于服务发现

四、Eureka 端点


官网地址:https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

Eureka服务器还提供了一个端点(eureka/apps/{applicaitonName})可以查看所注册的服务详细信息 。applicaitonName就是微服务的名称,比如这里我们访问 http://localhost:8500/eureka/apps/mxn

在这里插入图片描述

五、Eureka 原理


5.1 本质

存储了每个客户端的注册信息。EurekaClient从EurekaServer同步获取服务注册列表。通过一定的规则选择一个服务进行调用

5.2 Eureka架构图

在这里插入图片描述

  • 服务提供者: 是一个eureka client,向Eureka Server注册和更新自己的信息,同时能从Eureka Server注册表中获取到其他服务的信息。

  • 服务注册中心: 提供服务注册和发现的功能。每个Eureka Cient向Eureka Server注册自己的信息,也可以通过Eureka Server获取到其他服务的信息达到发现和调用其他服务的目的。

  • 服务消费者: 是一个eureka client,通过Eureka Server获取注册到其上其他服务的信息,从而根据信息找到所需的服务发起远程调用。

  • 同步复制: Eureka Server之间注册表信息的同步复制,使Eureka Server集群中不同注册表中服务实例信息保持一致。

  • 远程调用: 服务客户端之间的远程调用。

  • 注册: Client端向Server端注册自身的元数据以供服务发现。

  • 续约: 通过发送心跳到Server以维持和更新注册表中服务实例元数据的有效性。当在一定时长内,Server没有收到Client的心跳信息,将默认服务下线,会把服务实例的信息从注册表中删除。

  • 下线: Client在关闭时主动向Server注销服务实例元数据,这时Client的服务实例数据将从Server的注册表中删除。

  • 获取注册表: Client向Server请求注册表信息,用于服务发现,从而发起服务间远程调用。

5.3 Eureka自我保护

有时候我们会看到这样的提示信息:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.,这是因为默认情况下,Eureka Server在一定时间内,没有接收到某个微服务心跳,会将某个微服务注销(90S)。但是当网络故障时,微服务与Server之间无法正常通信,上述行为就非常危险,因为微服务正常,不应该注销,它的指导思想就是 宁可保留健康的和不健康的,也不盲目注销任何健康的服务

我们也可以通过命令去关闭自我保护的功能:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值