Spring Cloud探索之旅(二)——Spring Cloud Eureka

2.1 什么是服务注册与发现

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

在服务治理框架下,服务间的调用不再通过指定具体的实例地址来实现,而是通过服务名发起请求调用实现。服务调用方通过服务名从服务注册中心的服务清单中获取服务实例的列表清单,通过指定的负载均衡策略取出一个服务实例位置来进行服务调用。

2.2 Eureka客服端和服务端

Eureka服务端,即服务注册中心。它同其他服务注册中心一样,支持高可用配置。依托于强一致性(一致性弱于zk,但可用性高于zk)提供良好的服务实例可用性,可以应对多种不同的故障场景。

Eureka服务端支持集群模式部署,当集群中有分片发生故障的时候,Eureka会自动转入自我保护模式。它允许在分片发生故障的时候继续提供服务的发现和注册(故障服务进行下线操作,退出注册表),当故障分配恢复时,集群中的其他分片会把他们的状态再次同步回来。集群中的的不同服务注册中心通过异步模式互相复制各自的状态,这也意味着在给定的时间点每个实例关于所有服务的状态可能存在不一致的现象。

Eureka客户端,主要处理服务的注册和发现。客户端服务通过注册和参数配置的方式,嵌入在客户端应用程序的代码中。在应用程序启动时,Eureka客户端向服务注册中心注册自身提供的服务,并周期性的发送心跳来更新它的服务租约。同时,他也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期行的刷新服务状态

2.3 Eureka常用配置

(1)Eureka服务端的常用配置

#获取aws访问的id,主要用于弹性ip绑定,此配置是用于aws上的,默认为null
eureka.server.a-w-s-access-id=
#获取aws私有秘钥,主要用于弹性ip绑定,此配置是用于aws上的,默认为null
eureka.server.a-w-s-secret-key=
#获取服务器尝试绑定到候选的EIP的次数,默认为3
eureka.server.e-i-p-bind-rebind-retries=
#服务器检查ip绑定的时间间隔,单位为毫秒,默认为1 * 60 * 1000
eureka.server.e-i-p-binding-retry-interval-ms-when-unbound=
#与上面的是同一作用,仅仅是稳定状态检查,默认为5 * 60 * 1000
eureka.server.e-i-p-binding-retry-interval-ms=
#自我保护模式,当出现出现网络分区、eureka在短时间内丢失过多客户端时,会进入自我保护模式,即一个服务长时间没有发送心跳,eureka也不会将其删除,默认为true
eureka.server.enable-self-preservation=
#阈值因子,默认是0.85,如果阈值比最小值大,则自我保护模式开启
eureka.server.renewal-percent-threshold=
#阈值更新的时间间隔,单位为毫秒,默认为15 * 60 * 1000
eureka.server.renewal-threshold-update-interval-ms=
#集群里eureka节点的变化信息更新的时间间隔,单位为毫秒,默认为10 * 60 * 1000
eureka.server.peer-eureka-nodes-update-interval-ms=
#复制的数据在发送请求时是否被压缩,默认为false
eureka.server.enable-replicated-request-compression=
#获取集群里服务器尝试复制数据的次数,默认为5
eureka.server.number-of-replication-retries=
#服务器节点的状态信息被更新的时间间隔,单位为毫秒,默认为30 * 1000
eureka.server.peer-eureka-status-refresh-time-interval-ms=
#在Eureka服务器获取不到集群里对等服务器上的实例时,需要等待的时间,单位为毫秒,默认为1000 * 60 * 5
eureka.server.wait-time-in-ms-when-sync-empty=
#连接对等节点服务器复制的超时的时间,单位为毫秒,默认为200
eureka.server.peer-node-connect-timeout-ms=
#读取对等节点服务器复制的超时的时间,单位为毫秒,默认为200
eureka.server.peer-node-read-timeout-ms=
#获取对等节点上http连接的总数,默认为1000
eureka.server.peer-node-total-connections=
#获取特定的对等节点上http连接的总数,默认为500
eureka.server.peer-node-total-connections-per-host=
#http连接被清理之后服务器的空闲时间,默认为30秒
eureka.server.peer-node-connection-idle-timeout-seconds=
#客户端保持增量信息缓存的时间,从而保证不会丢失这些信息,单位为毫秒,默认为3 * 60 * 1000
eureka.server.retention-time-in-m-s-in-delta-queue=
#清理任务程序被唤醒的时间间隔,清理过期的增量信息,单位为毫秒,默认为30 * 1000
eureka.server.delta-retention-timer-interval-in-ms=
#过期实例应该启动并运行的时间间隔,单位为毫秒,默认为60 * 1000
eureka.server.eviction-interval-timer-in-ms=
#查询AWS上ASG(自动缩放组)信息的超时值,单位为毫秒,默认为300
eureka.server.a-s-g-query-timeout-ms=
#从AWS上更新ASG信息的时间间隔,单位为毫秒,默认为5 * 60 * 1000
eureka.server.a-s-g-update-interval-ms=
#缓存ASG信息的到期时间,单位为毫秒,默认为10 * 60 * 1000
eureka.server.a-s-g-cache-expiry-timeout-ms=
#当注册表信息被改变时,则其被保存在缓存中不失效的时间,默认为180秒
eureka.server.response-cache-auto-expiration-in-seconds=
#客户端的有效负载缓存应该更新的时间间隔,默认为30 * 1000毫秒
eureka.server.response-cache-update-interval-ms=
#目前采用的是二级缓存策略,一个是读写高速缓存过期策略,另一个没有过期只有只读缓存,默认为true,表示只读缓存
eureka.server.use-read-only-response-cache=
#增量信息是否可以提供给客户端看,默认为false
eureka.server.disable-delta=
#状态复制线程可以保持存活的空闲时间,默认为10分钟
eureka.server.max-idle-thread-age-in-minutes-for-peer-replication=
#被用于状态复制的线程的最小数目,默认为1
eureka.server.min-threads-for-status-replication=
#被用于状态复制的线程的最大数目,默认为1
eureka.server.max-threads-for-status-replication=
#可允许的状态复制池备份复制事件的最大数量,默认为10000
eureka.server.max-elements-in-status-replication-pool=
#当时间变化实例是否跟着同步,默认为true
eureka.server.sync-when-timestamp-differs=
#当eureka服务器启动时尝试去获取集群里其他服务器上的注册信息的次数,默认为5
eureka.server.registry-sync-retries=
#当eureka服务器启动时获取其他服务器的注册信息失败时,会再次尝试获取,期间需要等待的时间,默认为30 * 1000毫秒
eureka.server.registry-sync-retry-wait-ms=
#复制池备份复制事件的最大数量,默认为10000
eureka.server.max-elements-in-peer-replication-pool=
#复制线程可以保持存活的空闲时间,默认为15分钟
eureka.server.max-idle-thread-in-minutes-age-for-status-replication=
#获取将被用于复制线程的最小数目,默认为5
eureka.server.min-threads-for-peer-replication=
#获取将被用于复制线程的最大数目,默认为20
eureka.server.max-threads-for-peer-replication=
#尝试在丢弃复制事件之前进行复制的时间,默认为30000毫秒
eureka.server.max-time-for-replication=
#对集群中服务器节点的连接是否应该准备,默认为true
eureka.server.prime-aws-replica-connections=
#增量信息是否可以提供给客户端或一些远程地区,默认为false
eureka.server.disable-delta-for-remote-regions=
#连接到对等远程地eureka节点的超时时间,默认为1000毫秒
eureka.server.remote-region-connect-timeout-ms=
#获取从远程地区eureka节点读取信息的超时时间,默认为1000毫秒
eureka.server.remote-region-read-timeout-ms=
#获取远程地区对等节点上http连接的总数,默认为1000
eureka.server.remote-region-total-connections=
#获取远程地区特定的对等节点上http连接的总数,默认为500
eureka.server.remote-region-total-connections-per-host=
#http连接被清理之后远程地区服务器的空闲时间,默认为30秒
eureka.server.remote-region-connection-idle-timeout-seconds=
#eureka服务器中获取的内容是否在远程地区被压缩,默认为true
eureka.server.g-zip-content-from-remote-region=
#针对远程地区发现的网址域名的map
eureka.server.remote-region-urls-with-name.
#远程地区的URL列表
eureka.server.remote-region-urls=
#必须通过远程区域中检索的应用程序的列表
eureka.server.remote-region-app-whitelist.
#从远程区域取出该注册表的信息的时间间隔,默认为30秒
eureka.server.remote-region-registry-fetch-interval=
#用于执行远程区域注册表请求的线程池的大小,默认为20
eureka.server.remote-region-fetch-thread-pool-size=
#用来合格请求远程区域注册表的信任存储文件,默认为空
eureka.server.remote-region-trust-store=
#获取偏远地区信任存储文件的密码,默认为“changeit”
eureka.server.remote-region-trust-store-password=
#如果在远程区域本地没有实例运行,对于应用程序回退的旧行为是否被禁用, 默认为false
eureka.server.disable-transparent-fallback-to-other-region=
#表示集群节点之间的复制是否为了网络效率而进行批处理,默认为false
eureka.server.batch-replication=
#Eureka服务器是否应该登录clientAuthHeaders,默认为true
eureka.server.log-identity-headers=
#限流是否应启用或禁用,默认为false
eureka.server.rate-limiter-enabled=
#是否对标准客户端进行限流,默认false
eureka.server.rate-limiter-throttle-standard-clients=
#认证的客户端列表,这里是除了标准的eureka Java客户端。
eureka.server.rate-limiter-privileged-clients=
#速率限制的burst size ,默认为10,这里用的是令牌桶算法
eureka.server.rate-limiter-burst-size=
#速率限制器用的是令牌桶算法,此配置指定平均执行注册请求速率,默认为500
eureka.server.rate-limiter-registry-fetch-average-rate=
#速率限制器用的是令牌桶算法,此配置指定平均执行请求速率,默认为100
eureka.server.rate-limiter-full-fetch-average-rate=
#用来描述从AWS第三账户的自动缩放组中的角色名称,默认为“ListAutoScalingGroups”
eureka.server.list-auto-scaling-groups-role-name=
#如果没有设置默认的编解码器将使用全JSON编解码器,获取的是编码器的类名称
eureka.server.json-codec-name=
#如果没有设置默认的编解码器将使用xml编解码器,获取的是编码器的类名称
eureka.server.xml-codec-name=
#获取配置绑定EIP或Route53的策略。
eureka.server.binding-strategy=
#用于建立route53域的ttl,默认为301
eureka.server.route53-domain-t-t-l=
#服务器尝试绑定到候选Route53域的次数,默认为3
eureka.server.route53-bind-rebind-retries=
#服务器应该检查是否和Route53域绑定的时间间隔,默认为5 * 60 * 1000毫秒
eureka.server.route53-binding-retry-interval-ms=

(2)Eureka客户端的常用配置

#从eureka服务器注册表中获取注册信息的时间间隔(s),默认为30秒
eureka.client.registry-fetch-interval-seconds=
#复制实例变化信息到eureka服务器所需要的时间间隔(s),默认为30秒
eureka.client.initial-instance-info-replication-interval-seconds=
#最初复制实例信息到eureka服务器所需的时间(s),默认为40秒
eureka.client.instance-info-replication-interval-seconds=
#询问Eureka服务url信息变化的时间间隔(s),默认为300秒
eureka.client.eureka-service-url-poll-interval-seconds=
#获取eureka服务的代理主机,默认为null
eureka.client.proxy-host=
#获取eureka服务的代理端口, 默认为null
eureka.client.proxy-port=
#获取eureka服务的代理用户名,默认为null
eureka.client.proxy-user-name=
#获取eureka服务的代理密码,默认为null
eureka.client.proxy-password=
#eureka注册表的内容是否被压缩,默认为true,并且是在最好的网络流量下被压缩
eureka.client.g-zip-content=
#eureka需要超时读取之前需要等待的时间,默认为8秒
eureka.client.eureka-server-read-timeout-seconds=
#eureka需要超时连接之前需要等待的时间,默认为5秒
eureka.client.eureka-server-connect-timeout-seconds=
#获取实现了eureka客户端在第一次启动时读取注册表的信息作为回退选项的实现名称
eureka.client.backup-registry-impl=
#eureka客户端允许所有eureka服务器连接的总数目,默认是200
eureka.client.eureka-server-total-connections=
#eureka客户端允许eureka服务器主机连接的总数目,默认是50
eureka.client.eureka-server-total-connections-per-host=
#表示eureka注册中心的路径,如果配置为eureka,则为http://x.x.x.x:x/eureka/,在eureka的配置文件中加入此配置表示eureka作为客户端向注册中心注册,从而构成eureka集群。此配置只有在eureka服务器ip地址列表是在DNS中才会用到,默认为null
eureka.client.eureka-server-u-r-l-context=
#获取eureka服务器的端口,此配置只有在eureka服务器ip地址列表是在DNS中才会用到。默认为null
eureka.client.eureka-server-port=
#获取要查询的DNS名称来获得eureka服务器,此配置只有在eureka服务器ip地址列表是在DNS中才会用到。默认为null
eureka.client.eureka-server-d-n-s-name=
#eureka客户端是否应该使用DNS机制来获取eureka服务器的地址列表,默认为false
eureka.client.use-dns-for-fetching-service-urls=
#实例是否在eureka服务器上注册自己的信息以供其他服务发现,默认为true
eureka.client.register-with-eureka=
#实例是否使用同一zone里的eureka服务器,默认为true,理想状态下,eureka客户端与服务端是在同一zone下
eureka.client.prefer-same-zone-eureka=
#服务器是否能够重定向客户端请求到备份服务器。 如果设置为false,服务器将直接处理请求,如果设置为true,它可能发送HTTP重定向到客户端。默认为false
eureka.client.allow-redirects=
#是否记录eureka服务器和客户端之间在注册表的信息方面的差异,默认为false
eureka.client.log-delta-diff=
#默认为false
eureka.client.disable-delta=
#eureka服务注册表信息里的以逗号隔开的地区名单,如果不这样返回这些地区名单,则客户端启动将会出错。默认为null
eureka.client.fetch-remote-regions-registry=
# 获取实例所在的地区。默认为us-east-1
eureka.client.region=
#获取实例所在的地区下可用性的区域列表,用逗号隔开。
eureka.client.availability-zones.
#Eureka服务器的连接,默认为http://XXXX:X/eureka/,但是如果采用DNS方式获取服务地址,则不需要配置此设置。
eureka.client.service-url.
#是否获得处于开启状态的实例的应用程序过滤之后的应用程序。默认为true
eureka.client.filter-only-up-instances=
#Eureka服务的http请求关闭之前其响应的时间,默认为30 秒
eureka.client.eureka-connection-idle-timeout-seconds=
#此客户端是否获取eureka服务器注册表上的注册信息,默认为true
eureka.client.fetch-registry=false
#此客户端只对一个单一的VIP注册表的信息感兴趣。默认为null
eureka.client.registry-refresh-single-vip-address=
#心跳执行程序线程池的大小,默认为5
eureka.client.heartbeat-executor-thread-pool-size=
#心跳执行程序回退相关的属性,是重试延迟的最大倍数值,默认为10
eureka.client.heartbeat-executor-exponential-back-off-bound=
#执行程序指数回退刷新的相关属性,是重试延迟的最大倍数值,默认为10
eureka.client.cache-refresh-executor-exponential-back-off-bound=
#eureka服务器序列化/反序列化的信息中获取“$”符号的的替换字符串。默认为“_-”
eureka.client.dollar-replacement=
#eureka服务器序列化/反序列化的信息中获取“_”符号的的替换字符串。默认为“__”
eureka.client.escape-char-replacement=
#如果设置为true,客户端的状态更新将会点播更新到远程服务器上,默认为true
eureka.client.on-demand-update-status-change=
#这是一个短暂的编码器的配置,如果最新的编码器是稳定的,则可以去除,默认为null
eureka.client.encoder-name=
#这是一个短暂的解码器的配置,如果最新的解码器是稳定的,则可以去除,默认为null
eureka.client.decoder-name=
#客户端数据接收
eureka.client.client-data-accept=

(3)服务实例常用配置

#此实例注册到eureka服务端的唯一的实例ID,其组成为${spring.application.name}:${spring.application.instance_id:${random.value}}
eureka.instance.instance-id=
#获得在eureka服务上注册的应用程序的名字,默认为unknow
eureka.instance.appname=
#获得在eureka服务上注册的应用程序组的名字,默认为unknow
eureka.instance.app-group-name=
#实例注册到eureka服务器时,是否开启通讯,默认为false
eureka.instance.instance-enabled-onit=
#获取该实例应该接收通信的非安全端口。默认为80
eureka.instance.non-secure-port=
#获取该实例应该接收通信的安全端口,默认为443
eureka.instance.secure-port=
#该实例应该接收通信的非安全端口是否启用,默认为true
eureka.instance.non-secure-port-enabled=
#该实例应该接收通信的安全端口是否启用,默认为false
eureka.instance.secure-port-enabled=
#eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒
eureka.instance.lease-renewal-interval-in-seconds=
#Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
eureka.instance.lease-expiration-duration-in-seconds=
#此实例定义的虚拟主机名,其他实例将通过使用虚拟主机名找到该实例。
eureka.instance.secure-virtual-host-name=
#与此实例相关联 AWS自动缩放组名称。此项配置是在AWS环境专门使用的实例启动,它已被用于流量停用后自动把一个实例退出服务。
eureka.instance.a-s-g-name=
#与此实例相关联的主机名,是其他实例可以用来进行请求的准确名称
eureka.instance.hostname=
#获取与此实例相关联的元数据(key,value)。这个信息被发送到eureka服务器,其他实例可以使用。
eureka.instance.metadata-map.
#该实例被部署在数据中心
eureka.instance.data-center-info=
#获取实例的ip地址
eureka.instance.ip-address=
#获取此实例状态页的URL路径,然后构造出主机名,安全端口等,默认为/info
eureka.instance.status-page-url-path=
#获取此实例绝对状态页的URL路径,为其他服务提供信息时来找到这个实例的状态的路径,默认为null
eureka.instance.status-page-url=
#获取此实例的相关主页URL路径,然后构造出主机名,安全端口等,默认为/
eureka.instance.home-page-url-path=
#获取此实例的绝对主页URL路径,为其他服务提供信息时使用的路径,默认为null
eureka.instance.home-page-url=
#获取此实例的相对健康检查URL路径,默认为/health
eureka.instance.health-check-url-path=
#获取此实例的绝对健康检查URL路径,默认为null
eureka.instance.health-check-url=
#获取此实例的绝对安全健康检查网页的URL路径,默认为null
eureka.instance.secure-health-check-url=
#获取实例的网络地址,默认为[]
eureka.instance.default-address-resolution-order=
#获取用于查找属性的命名空间,默认为eureka
eureka.instance.namespace=

2.4 Eureka事件监听

Eureka的server端会发出5个事件通知,分别是:

EurekaInstanceCanceledEvent 服务下线事件
EurekaInstanceRegisteredEvent 服务注册事件
EurekaInstanceRenewedEvent 服务续约事件
EurekaRegistryAvailableEvent Eureka注册中心启动事件
EurekaServerStartedEvent Eureka Server启动事件

package com.tianyalei.server;

import com.netflix.appinfo.InstanceInfo;
import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceCanceledEvent;
import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRegisteredEvent;
import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRenewedEvent;
import org.springframework.cloud.netflix.eureka.server.event.EurekaRegistryAvailableEvent;
import org.springframework.cloud.netflix.eureka.server.event.EurekaServerStartedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class EurekaStateChangeListener {


    /**
     * 监听服务下线
     * @param eurekaInstanceCanceledEvent
     */
    @EventListener
    public void listen(EurekaInstanceCanceledEvent eurekaInstanceCanceledEvent) {
        //服务断线事件
        String appName = eurekaInstanceCanceledEvent.getAppName();
        String serverId = eurekaInstanceCanceledEvent.getServerId();
        System.out.println(appName);
        System.out.println(serverId);

    }

    /**
     * 监听服务注册
     * @param event
     */
    @EventListener
    public void listen(EurekaInstanceRegisteredEvent event) {
        InstanceInfo instanceInfo = event.getInstanceInfo();
        System.out.println(instanceInfo);

    }

    /**
     * 监听服务续约
     * @param event
     */
    @EventListener
    public void listen(EurekaInstanceRenewedEvent event) {
        event.getAppName();
        event.getServerId();

    }

    /**
     * 监听服务中心是否启动
     * @param event
     */
    @EventListener
    public void listen(EurekaRegistryAvailableEvent event) {
    }

    /**
     * 监听eureka是否启动
     * @param event
     */
    @EventListener
    public void listen(EurekaServerStartedEvent event) {
        //Server启动

    }
}

2.5 基本注解

@EnableEurekaServer

表明自身是一个注册中心

@EnableDiscoveryClient

向注册中心注册服务,并能被消费者发现

2.6 Eureka集群

第一步、做多环境eureka服务端配置

server:
  port: 18762
spring:
  application:
    name: config-server
  profiles:
    active: native
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/config/
eureka:
  client:
    service-url:
       defaultZone: http://localhost:8000/eureka/, http://localhost:8001/eureka/,http://localhost:8002/eureka/



第二步、启动多个eureka实例

第三步、配置eureka客服端

server:
  port: 18762
spring:
  application:
    name: config-server
  profiles:
    active: native
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/config/
eureka:
  client:
    service-url:#填入所有eureka地址
       defaultZone: http://localhost:8000/eureka/, http://localhost:8001/eureka/,http://localhost:8002/eureka/


第四步、启动检测

注册OK

猜你喜欢

转载自blog.csdn.net/qq_35813653/article/details/83757261