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

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

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

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

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

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

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

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

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

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

        项目搭建

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

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

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

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

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

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

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

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

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

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

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

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

        Spring Cloud 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上了。

        Spring Cloud 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服务注册中心入门流程分析

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

        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节点上也会有相应的服务。
        Spring Cloud Eureka服务注册中心入门流程分析

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

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

        多区域配置

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

        Spring Cloud 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项目,因为我们之前以及做了一个简易的集群,所以我们这里将配置文件复制出来,每个节点使用不同的配置文件。

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

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

        # 应用服务 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

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

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

        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节点停止。

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

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

        Spring Cloud 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的客户端没有续约,则进入自我保护机制。

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

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

        自我保护开关

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

        心跳机制

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

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

        Eureka实例信息存储

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

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

        项目地址

        cloud项目地址

        声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。