亲宝软件园·资讯

展开

Spring Cloud 服务注册中心

、楽. 人气:0

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

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

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

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

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

在这里插入图片描述

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

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

集群搭建

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可以很好的应对因网络故障导致部分节点失联的情况,而不会像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项目地址

加载全部内容

相关教程
猜你喜欢
用户评论