Spring Cloud 随笔3 ——服务治理:Spring Cloud Eureka

前言:

        Spring Cloud通过为Eureka增加了Spring Boot风格的自动化配置,我们只需要通过简单的引入依赖和注解配置就能让Spring Boot构建的微服务应用轻松地与Eureka服务治理体系进行整合。

------------------------------------------------服务治理-----------------------------------------------------

一、服务治理

       主要用来实现各个微服务地自动化注册与发现。

       1、服务注册:在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单。注册中心、来维护这个服务清单。另外,服务注册中心还需要以心跳的方式去监测清单中的服务是否可用,若不可用,需要从服务清单中剔除,达到排除故障服务的效果。

        2、服务发现:由于在服务治理框架下运作,服务间的调用不再指定具体的实例地址来实现,而是通过向服务名发起请求调用实现,所以,服务调用方在调用服务提供方接口的时候,并不知道具体的服务实例位置。因此,调用方需要向注册中心咨询服务,并获取所有服务的实例清单,以实现对具体服务实例的访问。

二、Netflix Eureka

       Spring Cloud Eureka,使用Netflix Eureka来实现服务注册与发现,它既包含了服务端组件,也包含了客户端组件。

       Eureka服务端,我们也称为服务注册中心。

       Eureka客户端,主要处理服务的注册与发现。

三、搭建服务注册中心

       参考:Spring Cloud (一)、搭建服务注册中心

四、注册服务提供者

       参考:Spring Cloud (二)、向注册中心注册服务提供者

五、高可用注册中心

       参考:Spring Cloud (三)、高可用注册中心

       Eureka Server的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组相互注册的服务注册中心,以实现服务清单的相互同步,达到高可用(HA)的效果。

       如果Eureka以集群模式部署,当集群中分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,集群中的其他分片会把它们的状态再次同步回来。

六、服务发现与服务消费

       以Ribbon为例,来实现服务消费。

       参考:Spring Cloud (四)、服务发现与服务消费

------------------------------------------------基础架构-----------------------------------------------------

七、基础架构

       1、服务注册中心:Eureka提供的服务端,提供服务注册与发现的功能。

       2、服务提供者:提供服务的应用,可以是Spring Boot应用,也可以是其他技术平台且遵循Eureka通信机制的应用。它将自己提供的服务注册到Eureka,以供其他应用发现。

       3、服务消费:消费者应用从服务注册中心获取服务列表,从而使消费者可以知道去何处调用其所需要的服务。

       很多时候,客户端既是服务提供者,也是服务消费者。

八、服务治理机制

 服务提供者:

       1、服务注册:“服务提供者”在启动的时候会通过发送REST请求将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息。Eureka Server接收到这个REST请求之后,将元数据信息存储在一个双层结构Map中,其中第一层的key是服务名,第二层的key是具体服务的实例名。

       在服务注册时,需要确认一下eureka.client.register-with-eureka=true参数是否正确,该值默认为true。若设置为false将不会启动注册操作。

        2、服务同步:使用高可用的注册中心,如果两个服务提供者分别注册到了两个不同的服务注册中心上,他们的信息分被两个服务注册中心所维护。此时,由于注册中心之间因互相注册为服务,当服务提供者发送注册请求到一个服务注册中心时,它会将该请求转发给集群中相连的其他注册中心,从而实现注册中心之间的服务同步。通过服务同步,两个服务者的服务信息就可以通过这两台服务注册中心中的任意一台获取到。

也就是说:对于服务提供者,注册一个注册中心就相当于注册所有注册中心。

                  对于服务消费者,请求一个注册中心就相当于请求所有注册中心。

       3、服务续约:在注册完成之后,服务提供者会维护一个心跳用来告诉 Eureka Server:“我还活着”,以防止Eureka Server的“”除任务”将该服务实例从服务列表中排除出去,我们称该操作为服务续约

     关于服务续约的两个重要属性:

//用于定义服务续约任务的调用间隔时间,默认为30秒

eureka.instance.lease-renewal-interval-in-seconds=30

//用于定义服务失效的时间,默认为90秒

eureka.instance.lease-expiration-duration-in-seconds=90

服务消费者:

      1、获取服务 :启动服务消费者的时候,会发送一个REST请求给服务注册中心,来获取上面注册的服务清单(该服务的所有实例)。Eureka Server会维护一份只读的服务清单来返回给客户端。同时该缓存清单会每隔30秒更新一次。

       获取服务的时候,必须要确保eureka.client.fetch-registry=true参数没有被修改成false,该值默认为true。

       若希望修改缓存清单的更新时间,可以通过eureka.client.registry-fetch-interval-seconds=30参数进行修改。

      2、服务调用:服务消费者在获取服务清单后,通过服务名可以获得具体提供服务的实例名和该实例的元数据信息。使用Ribbon会默认采用轮询的方式进行调用来实现客户端的负载均衡。

       每个客户端需要被注册到一个Zone中,所以每个客户端对应一个Region和一个Zone,在进行服务调用的时候,优先访问处于同一个Zone中的服务提供方,若访问不到,就访问其他的Zone。

       3、服务下线:当服务关闭,将该服务状态置为下线(DOWN),并把该下线时间传播出去。客户端将不会继续调用关闭了的服务。

服务注册中心:

       1、失效剔除:将出现故障的服务实例(无法提供服务)剔除。Eureka Server在启动的时候会创建一个定时任务,默认每隔一 段时间(默认60秒)将当前清单中超时(默认为90秒)没有续约的服务剔除出去。

       2、自我保护:由于本地调试很容易出发注册中心的保护机制,这会使得注册中心维护的服务实例不那么准确。所以,我们在本地进行开发的时候,可以使用eureka.server.enable-self-preservation=false参数来关闭自我保护机制。             

       当我们在本地调试基于Eureka的程序时,基本上在服务注册中心的信息面板中出现类似下面的红色警告信息,该警告就是触发了Eureka Server的自我保护机制。

       该机制就是Eureka Server会将但钱的实例注册信息保护起来,让实例不会过期,尽可能保护这些注册信息。但是,在这段保护期间内实例若出现问题,那么客户端就很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,比如可以使用请求重试、断路由等机制。

        断路由机制可以是使用Spring Cloud Hystrix。      

------------------------------------------------配置详解-----------------------------------------------------

        在Eureka的服务治理体系中,主要分为服务端客户端两个不同的角色,服务端为服务注册中心,而客户端为各个提供接口的微服务。

       在实际使用Spring Cloud Eureka的过程中,我们所做的配置内容几乎都是对Eureka Client客户端配置进行操作。

       Eureka Client客户端的配置主要分为以下两个方面:

  • 服务注册相关的信息,包括服务注册中心地址、服务获取的时间间隔、可用区域等。以eureka.client为前缀。
  • 服务实例相关的配置信息,包括服务实例的名称、IP地址、端口号、健康检查路径等。以eureka.instance为前缀。

九、服务注册类配置 EurekaClientConfigBean

        1、指定注册中心:通过eureka.client.service-url参数实现,默认值的key为defaultZone、value为

http://localhost:8761/erueka/

            例子:eureka.client.service-url.defaultZone=http://localhost:1111/eureka/

            当构建了高可用的服务注册中心集群时,可以为参数的value值配置多个注册中心地址(通过逗号分隔)。

十、服务实例配置 EurekaInstanceConfigBean

       1、元数据:Eureka客户端在向服务注册中心发送注册请求时,用来描述自身服务信息的对象,比如:服务名称、实例名       称、实例IP、实例端口等。

      在注册的时候会包装成InstanceInfo对象发送给Eureka服务端。

      通过eureka.instance.<peoperties>=<value>的格式对标准化元数据直接进行配置。

      通过eureka.instance.metadataMap.<key>=<value>的格式对自定义元数据进行配置。

       2、实例名配置:通过euraka.instance.instance-id参数来进行配置。

            例子:eureka.instance.instance-id=${spring.application.name}:${random.int}

  

              我们可以直接通过设置server.port=0或者使用随机数server.port=${random.int[10000,19999]}来让Tomcat启动的时候采         用随即端口。 再利用应用名加随机数的方式来区分不同的实例,从而实现在同一主机上,不指定端口就能轻松启动多个实例       的效果。

      3、端点配置:状态页(statusPageUrl)和检查页(healthCheckUrl)的URL在Spring Cloud Eureka中默认使用了spring-       boot-actuator模块提供的/info端点和/health端点。大多数情况下,我们并不需要修改这几个URL,少数情况下我们会修改他们的访问路径。                               

       4、健康检测:在Spring Cloud Eureka中,我们可以通过简单的配置,把Eureka客户端的健康检测交给spring-boot-actuator   模块的/health端点,以实现更加全面的健康状态维护。

           步骤:

                   (1)、在pom.xml中引入spring-boot-starter-actuator模块的依赖。

                   (2)、在application.properties中增加参数配置eureka.client.healthcheck.enable=true。

------------------------------------------------跨平台支持-----------------------------------------------------

        Eureka的通信机制使用了HTTP的REST接口实现,这也是Eureka同其他服务注册工具的一个关键不同点。由于HTTP的平台无关性,虽然Eureka通过Java实现,但是在其下的微服务应用并不限于使用Java来进行开发。

十一、跨平台支持

          通信协议:默认情况下,Eureke使用Jersey和XStream配合JSON作为Server与Client之间的通信协议。

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值