在学习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服务注册内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Spring Cloud Eureka服务注册中心入门流程分析的更多相关文章

  1. ios – Swift Eureka Form中的循环

    我正在构建一个Eureka表单,并希望在表单中放置一个循环来构建基于数组的步进器列表.我试图使用的代码是:但是,当我这样做时,我在StepperRow行上出现了一个错误:所以看起来Swift不再认为它在形式之内并且正在关注

  2. [快速学会Swift第三方库] Eureka篇

    [快速学会Swift第三方库]Eureka篇Eureka可以帮你简单优雅的实现动态table-view表单。目录快速学会Swift第三方库Eureka篇目录编码之前导入Eureka其他操作创建表单基础表单选择类型表单Segment风格选择器标准选择器pickerView风格选择器三种风格选择器效果对比带输入框的表单自定义Row深入学习编码之前导入Eureka推荐使用CocoaPods进行导入,CocoaPods是一个负责管理iOS项目中第三方开源库的工具,安装CocoaPods之后使用命令行就能轻松地对所

  3. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

  4. Spring JdbcTemplate执行数据库操作详解

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了Spring JdbcTemplate执行数据库操作,需要的朋友可以参考下

  5. Spring Batch批处理框架操作指南

    Spring Batch 是 Spring 提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作,这篇文章主要介绍了Spring Batch批处理框架操作指南,需要的朋友可以参考下

  6. Spring详细讲解@Autowired注解

    @Autowired注解可以用在类属性,构造函数,setter方法和函数参数上,该注解可以准确地控制bean在何处如何自动装配的过程。在默认情况下,该注解是类型驱动的注入

  7. 使用Spring AOP实现用户操作日志功能

    这篇文章主要介绍了使用Spring AOP实现了用户操作日志功能,功能实现需要一张记录日志的log表,结合示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. Spring Security认证器实现过程详解

    一些权限框架一般都包含认证器和决策器,前者处理登陆验证,后者处理访问资源的控制,这篇文章主要介绍了Spring Security认证器实现过程,需要的朋友可以参考下

  9. spring学习JdbcTemplate数据库事务管理

    这篇文章主要为大家介绍了spring学习JdbcTemplate数据库事务管理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. Spring Boot 集成Redisson实现分布式锁详细案例

    这篇文章主要介绍了Spring Boot 集成Redisson实现分布式锁详细案例,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

随机推荐

  1. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  4. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  5. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  6. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  7. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  8. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Spring JdbcTemplate执行数据库操作详解

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了Spring JdbcTemplate执行数据库操作,需要的朋友可以参考下

返回
顶部