Spring Cloud Eureka服务注册中心入门流程分析

目录
  • 项目搭建
  • 客户端注册
  • 聚合层处理
  • Eureka架构
  • 集群搭建
  • 多区域配置
    • 自我保护开关
  • 心跳机制
  • Eureka实例信息存储
  • 项目地址

在学习Ribbon使用的时候,我们是直接在配置文件中写死服务地址的,是不是特别的不方便?我们是不是需要一个统一的地方来维护这些服务,以及这些配置发生变化后,我们不需要重启服务。

所以这个时候需要引出一个新组件——eureka。

它主要可以帮助我们实现如下功能:

  • 地址的统一维护服务提供者的动态上下线通知
  • 服务提供者可以将服务注册到eureka上,eureka通过键值对的形式将信息进行保存。

服务消费者可以直接根据KEY去eureka上获取服务即可。

这里我们首先来看下eureka的整体架构图,逐步分析下具有那些流程:

Eureka 实现服务注册与发现的流程如下:

  • 搭建一个 Eureka Server 作为服务注册中心;
  • 服务提供者 Eureka Client 启动时,会把当前服务器的信息以服务名(spring.application.name)的方式注册到服务注册中心;
  • 服务消费者 Eureka Client 启动时,也会向服务注册中心注册;
  • 服务消费者还会获取一份可用服务列表,该列表中包含了所有注册到服务注册中心的服务信息(包括服务提供者和自身的信息);这个列表会缓存到消费者本地,然后会定时轮询更新。
  • 在获得了可用服务列表后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。
  • 然后在Eureka中还有一个心跳检测机制,从而实现我们的动态上下线感知。

项目搭建

了解了它的整体流程之后,我们来搭建一个Eureka服务。

搭建其实很简单,我们直接创建一个Spring Boot 项目即可,然后选择Eureka Server依赖即可。

最后只需在启动程序上添加@EnableEurekaServer注解即可。

这个时候启动项目即可进入Eureka的控制面板。(默认端口8761,创建完项目后自行修改)

启动项目之后,大家可能会遇到如下错误:Cannot execute request on any known server

简单翻译就是不能请求到任何确定的服务上。因为我们的eureka-server本身既是服务提供者又是一个项目,所以我们也需要将他自己注册上去,那如何自己注册自己呢?

我们只需要通过如下命令制定好注册中心的地址即可,然后重新启动项目,即可发现我们的服务已经注册上去了。这个地方的话可以不注册,因为会默认注册到8761端口,但是如果搭建集群的话就需要我们自己指定了。

server.port=8761
# 指向服务注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

我们也可以默认不注册,添加如下配置信息:

# 是否要注册
eureka.client.register-with-eureka=false
# 是否要更新注册信息
eureka.client.fetch-registry=false

客户端注册

注册中心搭建完成之后,我们需要将项目进行注册,首先需要引入相关依赖:

<!--        eureka 客户端注册-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

然后需要进行注册地址的配置:

# 注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

这个时候我们重新启动这些项目,即可发现他们已经注册到eureka上了。

但是我们点击后面的状态时,是看不到任何数据的,这个时候我们需要引入actuator

<!--actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

然后需要暴露相关端口,我这边是直接暴露了所有,生产环境可不能这么操作。

management.endpoints.web.exposure.exclude=*

聚合层处理

既然我们已经将各个模块的项目注册到eureka上了,我们在聚合层中就不需要在使用写死的配置信息了。

我们将之前的配置信息注释,然后将聚合层注册到eureka上。这个时候可以发现我们的接口是可以正常下单的,说明我们的配置中心生效了,首先就完成了对地址信息统一维护的功能。

这就是我们为什么引入spring cloud的原因,极大的减少了我们的工作量。

Eureka架构

上图是Eureka的整体架构的设计。

我们知道在微服务中,任何节点都是需要做高可用的,也就是不能是单节点。我们的Eureka也是,但是它的集群和我们之前接触的集群是不同的,它没有主从的概念,它所有的节点都是水平的,两两节点间的数据是可以相互复制的,任何一个客户端都可以访问任何一个节点。

因为Eureka遵守的是一个AP理论,这里主要需要保持一个高可用性,因为如果是主从模型,我们在主从同步的时候,如果发生延迟就会存在短期不可用,所以为了保持高可用性,就采用了这种无中心化的集群节点。

上图中的一些关键名词说明如下:

  • Application Service: 作为Eureka Client,扮演了服务的提供者,提供业务服务, 向Eureka Server注册和更新自己的信息,同时能从Eureka Server的注册表中获取到 其他服务的信息。
  • Eureka Server: 扮演服务注册中心的角色,提供服务注册和发现的功能,每个Eureka Cient向Eureka Server注册自己的信息,也可以通过Eureka Server获取到其他服务的 信息达到发现和调用其他服务的目的。
  • Application Client: 作为Eureka Client,扮演了服务消费者,通过Eureka Server获取到注册到上面的其他服务的信息,从而根据信息找到所需的服务发起远程调 用。
  • Replicate: Eureka Server中的注册表信息的同步拷贝,保持不同的Eureka Server 集群中的注册表中的服务实例信息的一致性。提供了数据的最终一致性。
  • Make Remote Call: 服务之间的远程调用。
  • Register: 注册服务实例,Client端向Server端注册自身的元数据以进行服务发现。
  • Renew: 续约,通过发送心跳到Server维持和更新注册表中的服务实例元数据的有效 性。当在一定时长内Server没有收到Client的心跳信息,将默认服务下线,将服务实例 的信息从注册表中删除。
  • Cancel: 服务下线,Client在关闭时主动向Server注销服务实例元数据,这时Client 的的服务实例数据将从Server的注册表中删除。

集群搭建

Eureka的集群搭建是很简单的,我们重新创建一个eureka-server模块。和上文一样的步骤即可,然后在配置文件中互相指定注册地址。

eureka-server

# 应用名称
spring.application.name=eureka-server
server.port=8761
# 指向服务注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:8762/eureka
# 是否要注册
#eureka.client.register-with-eureka=false
# 是否要更新注册信息
#eureka.client.fetch-registry=false

eureka-server-replica

# 应用名称
spring.application.name=eureka-server-replica
server.port=8762

# 指向服务注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

然后启动项目,可以发现两个项目已经互相注册了 。

由于我们之前的服务都是注册到8761节点上的,这个时候我们随便启动一个服务,可以发现8762节点上也会有相应的服务。

我们需要让其他服务也注册到新的节点上吗?其实是需要的,因为我们是去中心化的节点,所以如果8761节点挂了,那我们还能继续注册到8762节点上,保持我们的高可用性。多个节点我们只需要使用逗号隔开就可以。

eureka.client.service-url.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka

多区域配置

我们搭建集群的时候为了实现灾备的功能,可以将各节点部署在不同的区域,然后客户端获取服务的时候可以从就近的区域获取,如果就近区域节点宕机后照样可以去获取其他正常的节点服务。

实现这个功能也很简单,接下来我们对各个项目进行相关的配置。

我们这里主要对两个eureka-server服务以及portal,goods-service项目进行配置,首先因为是分区,我们需要加上如下配置信息,表示地点在北京,以及北京地区的两个区域机房。几个项目都需要进行如下的配置。

# 区域
eureka.client.region=beijing
# 配置不同的机房
eureka.client.availability-zones.beijing=zone-1,zone-2
eureka.client.service-url.zone-1=http://localhost:8761/eureka
eureka.client.service-url.zone-2=http://localhost:8762/eureka

然后我们来处理goods-service项目,因为我们之前以及做了一个简易的集群,所以我们这里将配置文件复制出来,每个节点使用不同的配置文件。

每个配置文件中最后都需要指定该节点是属于那个区域的。

# 应用服务 WEB 访问端口
server.port=9090

# 注册中心地址
#eureka.client.service-url.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka

eureka.client.region=beijing
eureka.client.availability-zones.beijing=zone-1,zone-2

eureka.client.service-url.zone-1=http://localhost:8761/eureka
eureka.client.service-url.zone-2=http://localhost:8762/eureka

# 所属区域
eureka.instance.metadata-map.zone=zone-1

我们的另一个节点需要指定配置文件。

goods-service处理完成后,我们在protal项目中进行相同的配置,但是需要额外添加配置让服务默认调用同区域的服务。

eureka.client.region=beijing
eureka.client.availability-zones.beijing=zone-1,zone-2

eureka.client.service-url.zone-1=http://localhost:8761/eureka
eureka.client.service-url.zone-2=http://localhost:8762/eureka

eureka.instance.metadata-map.zone=zone-1
# 默认调用同区域的服务
eureka.client.prefer-same-zone-eureka=true

这个时候我们将所有服务启动,查看相应效果。

可以看到所有的请求默认都是到9090节点上的,这个时候我们将9090节点停止。

停止后,我们再次访问可能会请求失败,可以稍等会请求,这是由于停止后,9090节点的服务并没有立刻从eureka下线,属于自我保护机制的问题。

以上便是使用eureka进行多区域配置的一个简单演示。

Eureka自我保护机制

官方对于自我保护机制的定义:

自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。

自我保护机制的工作机制是:如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:

  • Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
  • Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
  • 当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。

因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。

我们可以通过如下参数配置比例:

eureka.server.renewal-percent-threshold=0.85

我们怎么确定是谁的85%没有心跳则会触发呢,是图中所示的预期renew值,如果低于10*0.85的客户端没有续约,则进入自我保护机制。

Renews threshold = 服务总数 * 每分钟的续约数量 (60s/客户端续约(心跳)间隔时间) * renewal-percent-threshold

自我保护开关

Eureka自我保护机制,通过配置 eureka.server.enable-self-preservationtrue打开/false禁用自我保护机制,默认打开状态,建议生产环境打开此配置。

心跳机制

上文的续约说到底就是我们的心跳机制,整体流程可以参考下图。

Eureka实例信息存储

上文说过我们是通过键值对来存储服务信息的,整体结构大致如下图所示:

项目地址

cloud项目地址

到此这篇关于Spring Cloud Eureka服务注册中心入门的文章就介绍到这了,更多相关Spring Cloud Eureka服务注册内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring cloud Eureka注册中心搭建的方法

    前提  系统安装jdk1.8及以上,配置好maven的ide(这里用idea进行演示,maven版本3.5,配置阿里云源) 项目搭建 新建一个maven项目,创建最简单的那种就好,项目名这里为EurekaServerDemo,包名什么的随意,项目打包方式为jar, 也可以使用spring官方的生成器,官方的生成器会创建基础的springboot项目结构.这里为了演示,都可以 修改pom文件,参考如下,版本推荐和本文相同,springboot和cloud版本的坑很多 <?xml version=&qu

  • 详解spring-cloud与netflixEureka整合(注册中心)

    基础依赖 compile('org.springframework.boot:spring-boot-starter-actuator') compile('org.springframework.boot:spring-boot-starter-web') compile('org.springframework.cloud:spring-cloud-starter') eureka(单机) 服务端: 依赖 compile('org.springframework.cloud:spring-c

  • Spring Cloud 系列之注册中心 Eureka详解

    1.1 简介 1.1.1 概述   Netflix Eureka 是由 Netflix 开源的一款基于 REST 的服务发现组件,包括 Eureka Server 及 Eureka Client.2012 年 9 月在 GitHub 上发布 1.1.2 版本,目前 Netflix 以宣布闭源,所以市面上还是以 1.x 版本为主.Eureka 提供基于 REST 的服务,在集群中主要用于服务管理.Eureka 提供了基于 Java 语言的客户端组件,客户端组件实现了负载均衡的功能,为业务组件的集群

  • 详解spring cloud eureka注册中心

    注册中心呢 就是springcloud的一个核心组件 所有微服务的基石 微服务的核心思想就是分布式 所有的服务分开管理 但这些服务分开后该如何协同呢 就需要注册中心的介入 怎么使用注册中心 首先在gradle引入它的依赖 compile 'org.springframework.cloud:spring-cloud-starter-eureka-server' 这里再讲一下 springcloud会分布很多模块 很难管理 所以在整个项目的build.gradle中可以对所有模块的build.gr

  • springcloud实现注册中心Eureka

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组件之一. 背景介绍 服务中心 服务中心又称注册中心,管理各种服务功能包括服务的注册.发现.熔断.负载.降级等,比如dubbo admin后台的各种功能. 有了服务中心调用关系会有什么变化,画几个简图来帮忙理解 项目A调用项目B 正常调用项目A请求项目B 有了服务中心之后,任何一个服务都不能直接去掉用

  • spring cloud实现Eureka注册中心的HA的方法

    前言: 在前面的例子中,我们的Eureka Server都是单节点的,一旦该节点在生产中挂掉,就无法再提供服务的注册,为了保证注册中心的高可用,在生产中一般采用多节点的服务注册中心. 一.在hosts文件中加入如下配置 127.0.0.1 peer1 127.0.0.1 peer2 二.修改application.yml配置文件 --- spring: profiles: peer1 # 指定profile=peer1 application: name: Eureka-Server1 serv

  • Spring Cloud Eureka服务注册中心入门流程分析

    目录 项目搭建 客户端注册 聚合层处理 Eureka架构 集群搭建 多区域配置 自我保护开关 心跳机制 Eureka实例信息存储 项目地址 在学习Ribbon使用的时候,我们是直接在配置文件中写死服务地址的,是不是特别的不方便?我们是不是需要一个统一的地方来维护这些服务,以及这些配置发生变化后,我们不需要重启服务. 所以这个时候需要引出一个新组件——eureka. 它主要可以帮助我们实现如下功能: 地址的统一维护服务提供者的动态上下线通知 服务提供者可以将服务注册到eureka上,eureka通

  • spring cloud eureka 服务启动失败的原因分析及解决方法

    目录 环境: 错误log 环境: <spring-boot-version>2.3.5.RELEASE</spring-boot-version> <spring-cloud-version>Hoxton.SR8</spring-cloud-version> 错误log Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerEx

  • SpringCloud Eureka服务注册中心应用入门详解

    目录 1.多节点无缝切换问题 2.服务注册与发现 Eureka 3.Springboot集成Eureka 3.1 父包pom依赖 3.2 eureka服务端 3.3 客户端 pom依赖 yml配置 3.4 控制台 1.多节点无缝切换问题 分布式节点中的服务宕机或者重启不影响客户端使用 分布式节点中的服务宕机重启不影响业务服务内部通信 如果在某个分布式系统中想要解决上述问题,那么这篇文章就是精华之处. 回顾一下以前的常用手段: 单节点运行,其他节点备用,无法无缝连接,内网通信无法保证 多节点运行,

  • 5分钟搭建SpringCloud Eureka服务注册中心的实现

    创建父级项目 只需保留pom.xml文件 这里只需搭建一个微服务 其他操作并无 <?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=&qu

  • spring cloud alibaba Nacos 注册中心搭建过程详解

    这篇文章主要介绍了spring cloud alibaba Nacos 注册中心搭建过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 nacos下载地址 什么是 Nacos? nacos主要起到俩个作用一个是注册中心,另外一个是配置中心. 下面图 是nacos的功能结构图 运行环境 JDK 1.8+: Maven 3.2.x+: 下载 你可以通过源码和发行包两种方式来获取 Nacos. nacos发行包下载地址 选择版本解压 unzip

  • SpringBoot + Spring Cloud Consul 服务注册和发现详细解析

    什么是Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更"一站式",内置了服务注册与发现框架.分布一致性协议实现.健康检查.Key/Value 存储.多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等).使用起来也较为简单.Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux.windows和Mac OS X):安装包仅包含一个可执行文件

  • Spring Cloud Eureka服务治理的实现

    什么是Spring Cloud Eureka Spring Cloud Eureka 是 Spring Cloud 中的一个组件,它是基于 Netflix Eureka 做了二次封装,主要是负责完成微服务框架中服务治理的功能.Spring Cloud通过为 Eureka 增加了 Spring Boot 风格的自动化配置,我们只需要通过简单的引用依赖和注解就能让 Spring Boot 够将的微服务应用轻松的与 Eureka 服务治理体系进行整合. 服务治理 服务治理是微服务框架中最为核心和基础的

  • Spring Cloud Eureka 服务上下线监控的实现

    之前我们有介绍通过Spring Boot Admin来检测服务的上下线,然后进行通知功能. https://www.jb51.net/article/130943.htm 今天为大家介绍另外一种实现的方式,在Eureka服务中进行检测通知,Eureka中提供了事件监听的方式来支持扩展. EurekaInstanceCanceledEvent 服务下线事件 EurekaInstanceRegisteredEvent 服务注册事件 EurekaInstanceRenewedEvent 服务续约事件

  • 详解Spring Cloud Zuul 服务网关

    有了Eureka服务注册发现.Hystrix断路器.Ribbon服务调用负载均衡,以及spring cloud config 集群配置中心,似乎一个微服务框架已五脏俱全,last but not least,一个服务网关却不可或缺. Spring Cloud Zuul路由是微服务架构的不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务.Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器. Zuul介绍 在整个Spring Cloud微服务框架里,Zuul扮演着"智能网

随机推荐