Spring Cloud 服务注册中心

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Spring Cloud 服务注册中心

、楽.   2022-06-28 我要评论

在学习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项目地址

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们