Spring cloud Eureka 专题

什么是Spring Cloud Eureka?

Spring Cloud Eureka 模块提供的功能是被动式的服务发现.

什么是服务发现?

服务发现就像聊天室一个,每个用户来的时候去服务器上注册,这样他的好友们就能看到你,你同时也将获取好友的上线列表.

大家先看下Eureka的一个图例:

Spring cloud Eureka 专题

这边有两个应用分别是order service与customer service都注册到Eureka,customer service在生产是由若干个部署实例(节点)构成的,对于order service来说只要知道customer这个服务名称就可以拉取到注册在上面的实例信息,那么在客户端如果使用Feign或者RestTemplate调用的时候你只要关心serviceId就行了(客户端fegin与restTemplate默认集成的Ribbon组件),在下面会提到相关配置。

这边按照上面的host: eureka-a,eureka-b,eureka-c

application.yml配置如下:

# java -jar eureka-server.jar -Dspring.profiles.active=primary,java -jar eureka-server.jar -Dspring.profiles.active=secondary,java -jar eureka-server.jar -Dspring.profiles.active=tertiary
---
spring:
application:
name: eureka-server-clustered
#redis:
# host: 192.168.2.28
#port: 6379
session:
store-type: hash-map
profiles: primary
server:
port: 8671
eureka:
instance:
hostname: eureka-a
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://superuser:HukIl20209293923@eureka-b:8672/eureka/,http://superuser:HukIl20209293923@eureka-c:8673/eureka/
---
spring:
application:
name: eureka-server-clustered
profiles: secondary
session:
store-type: hash-map
server:
port: 8672

eureka:
instance:
hostname: eureka-b
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://superuser:HukIl20209293923@eureka-c:8673/eureka/,http://superuser:HukIl20209293923@eureka-a:8671/eureka/
---
spring:
application:
name: eureka-server-clustered
profiles: tertiary
session:
store-type: hash-map
server:
port: 8673
eureka:
instance:
hostname: eureka-c
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://superuser:HukIl20209293923@eureka-a:8671/eureka/,http://superuser:HukIl20209293923@eureka-b:8672/eureka/
---
eureka:
server:
enable-self-preservation: true # 自我保护模式(缺省为打开,建议开启)
eviction-interval-timer-in-ms: 5000 # 续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
security:
basic:
enabled: true
path:
- /autoconfig
- /beans
- /configprops
- /dump
- /env
- /health
- /info
- /metrics
- /mappings
- /trace
- /
# 启用http basic认证

user:
name: superuser
password: HukIl20209293923

三个应用分别启动

java -jar eureka-server.jar -Dspring.profiles.active=primary
java -jar eureka-server.jar -Dspring.profiles.active=secondary
java -jar eureka-server.jar -Dspring.profiles.active=tertiary

就可以看到下面的界面

Spring cloud Eureka 专题

Eureka客户端配置

eureka: 
client:
service-url:
defaultZone: http://superuser:HukIl20209293923@eureka-a:8673/eureka/,http://superuser:HukIl20209293923@eureka-b:8671/eureka/,http://superuser:HukIl20209293923@eureka-c:8673/eureka/
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port} # 根据ip:port定义为实例名称
prefer-ip-address: true #默认是使用hostname

客户端参数详细说明(可以从EurekaClientConfigBean类找到相关定义):

1、RegistryFetchIntervalSeconds

从eureka服务器注册表中获取注册信息的时间间隔(s),默认为30秒

2、InstanceInfoReplicationIntervalSeconds

复制实例变化信息到eureka服务器所需要的时间间隔(s),默认为30秒

3、InitialInstanceInfoReplicationIntervalSeconds

最初复制实例信息到eureka服务器所需的时间(s),默认为40秒

4、EurekaServiceUrlPollIntervalSeconds

询问Eureka服务url信息变化的时间间隔(s),默认为300秒

5、ProxyHost

获取eureka服务的代理主机,默认为null

6、ProxyProxyPort

获取eureka服务的代理端口, 默认为null

7、ProxyUserName

获取eureka服务的代理用户名,默认为null

8、ProxyPassword

获取eureka服务的代理密码,默认为null

9、GZipContent

eureka注册表的内容是否被压缩,默认为true,并且是在最好的网络流量下被压缩

10、EurekaServerReadTimeoutSeconds

eureka需要超时读取之前需要等待的时间,默认为8秒

11、EurekaServerConnectTimeoutSeconds

eureka需要超时连接之前需要等待的时间,默认为5秒

12、BackupRegistryImpl

获取实现了eureka客户端在第一次启动时读取注册表的信息作为回退选项的实现名称

13、EurekaServerTotalConnections

eureka客户端允许所有eureka服务器连接的总数目,默认是200

14、EurekaServerTotalConnectionsPerHost

eureka客户端允许eureka服务器主机连接的总数目,默认是50

15、EurekaServerURLContext

表示eureka注册中心的路径,如果配置为eureka,则为http://x.x.x.x:x/eureka/,在eureka的配置文件中加入此配置表示eureka作为客户端向注册中心注册,从而构成eureka集群。此配置只有在eureka服务器ip地址列表是在DNS中才会用到,默认为null

16、EurekaServerPort

获取eureka服务器的端口,此配置只有在eureka服务器ip地址列表是在DNS中才会用到。默认为null

17、EurekaServerDNSName

获取要查询的DNS名称来获得eureka服务器,此配置只有在eureka服务器ip地址列表是在DNS中才会用到。默认为null

18、UseDnsForFetchingServiceUrls

eureka客户端是否应该使用DNS机制来获取eureka服务器的地址列表,默认为false

19、RegisterWithEureka

实例是否在eureka服务器上注册自己的信息以供其他服务发现,默认为true

20、PreferSameZoneEureka

实例是否使用同一zone里的eureka服务器,默认为true,理想状态下,eureka客户端与服务端是在同一zone下

21、AllowRedirects

服务器是否能够重定向客户端请求到备份服务器。 如果设置为false,服务器将直接处理请求,如果设置为true,它可能发送HTTP重定向到客户端。默认为false

22、LogDeltaDiff

是否记录eureka服务器和客户端之间在注册表的信息方面的差异,默认为false

23、DisableDelta(*)

默认为false

24、fetchRegistryForRemoteRegions

eureka服务注册表信息里的以逗号隔开的地区名单,如果不这样返回这些地区名单,则客户端启动将会出错。默认为null

25、Region

获取实例所在的地区。默认为us-east-1

26、AvailabilityZones

获取实例所在的地区下可用性的区域列表,用逗号隔开。

27、EurekaServerServiceUrls

Eureka服务器的连接,默认为http://XXXX:X/eureka/,但是如果采用DNS方式获取服务地址,则不需要配置此设置。

28、FilterOnlyUpInstances(*)

是否获得处于开启状态的实例的应用程序过滤之后的应用程序。默认为true

29、EurekaConnectionIdleTimeoutSeconds

Eureka服务的http请求关闭之前其响应的时间,默认为30 秒

30、FetchRegistry

此客户端是否获取eureka服务器注册表上的注册信息,默认为true

31、RegistryRefreshSingleVipAddress

此客户端只对一个单一的VIP注册表的信息感兴趣。默认为null

32、HeartbeatExecutorThreadPoolSize(*)

心跳执行程序线程池的大小,默认为5

33、HeartbeatExecutorExponentialBackOffBound(*)

心跳执行程序回退相关的属性,是重试延迟的最大倍数值,默认为10

34、CacheRefreshExecutorThreadPoolSize(*)

执行程序缓存刷新线程池的大小,默认为5

35、CacheRefreshExecutorExponentialBackOffBound

执行程序指数回退刷新的相关属性,是重试延迟的最大倍数值,默认为10

36、DollarReplacement

eureka服务器序列化/反序列化的信息中获取“$”符号的的替换字符串。默认为“_-”

37、EscapeCharReplacement

eureka服务器序列化/反序列化的信息中获取“_”符号的的替换字符串。默认为“__”

38、OnDemandUpdateStatusChange(*)

如果设置为true,客户端的状态更新将会点播更新到远程服务器上,默认为true

39、EncoderName

这是一个短暂的编码器的配置,如果最新的编码器是稳定的,则可以去除,默认为null

40、DecoderName

这是一个短暂的解码器的配置,如果最新的解码器是稳定的,则可以去除,默认为null

41、ClientDataAccept(*)

客户端数据接收

42、Experimental(*)

当尝试新功能迁移过程时,为了避免配置API污染,相应的配置即可投入实验配置部分,默认为null

Eureka服务端配置

1、AWSAccessId

获取aws访问的id,主要用于弹性ip绑定,此配置是用于aws上的,默认为null

2、AWSSecretKey

获取aws私有秘钥,主要用于弹性ip绑定,此配置是用于aws上的,默认为null

3、EIPBindRebindRetries

获取服务器尝试绑定到候选的EIP的次数,默认为3

4、EIPBindingRetryIntervalMsWhenUnbound(*)

服务器检查ip绑定的时间间隔,单位为毫秒,默认为1 * 60 * 1000

5、EIPBindingRetryIntervalMs

与上面的是同一作用,仅仅是稳定状态检查,默认为5 * 60 * 1000

6、EnableSelfPreservation

自我保护模式,当出现出现网络分区、eureka在短时间内丢失过多客户端时,会进入自我保护模式,即一个服务长时间没有发送心跳,eureka也不会将其删除,默认为true

7、RenewalPercentThreshold(*)

阈值因子,默认是0.85,如果阈值比最小值大,则自我保护模式开启

8、RenewalThresholdUpdateIntervalMs

阈值更新的时间间隔,单位为毫秒,默认为15 * 60 * 1000

9、PeerEurekaNodesUpdateIntervalMs(*)

集群里eureka节点的变化信息更新的时间间隔,单位为毫秒,默认为10 * 60 * 1000

10、EnableReplicatedRequestCompression

复制的数据在发送请求时是否被压缩,默认为false

11、NumberOfReplicationRetries

获取集群里服务器尝试复制数据的次数,默认为5

12、PeerEurekaStatusRefreshTimeIntervalMs

服务器节点的状态信息被更新的时间间隔,单位为毫秒,默认为30 * 1000

13、WaitTimeInMsWhenSyncEmpty(*)

在Eureka服务器获取不到集群里对等服务器上的实例时,需要等待的时间,单位为毫秒,默认为1000 * 60 * 5

14、PeerNodeConnectTimeoutMs

连接对等节点服务器复制的超时的时间,单位为毫秒,默认为200

15、PeerNodeReadTimeoutMs

读取对等节点服务器复制的超时的时间,单位为毫秒,默认为200

16、PeerNodeTotalConnections

获取对等节点上http连接的总数,默认为1000

17、PeerNodeTotalConnectionsPerHost(*)

获取特定的对等节点上http连接的总数,默认为500

18、PeerNodeConnectionIdleTimeoutSeconds(*)

http连接被清理之后服务器的空闲时间,默认为30秒

19、RetentionTimeInMSInDeltaQueue(*)

客户端保持增量信息缓存的时间,从而保证不会丢失这些信息,单位为毫秒,默认为3 * 60 * 1000

20、DeltaRetentionTimerIntervalInMs

清理任务程序被唤醒的时间间隔,清理过期的增量信息,单位为毫秒,默认为30 * 1000

21、EvictionIntervalTimerInMs

过期实例应该启动并运行的时间间隔,单位为毫秒,默认为60 * 1000

22、ASGQueryTimeoutMs(*)

查询AWS上ASG(自动缩放组)信息的超时值,单位为毫秒,默认为300

23、ASGUpdateIntervalMs

从AWS上更新ASG信息的时间间隔,单位为毫秒,默认为5 * 60 * 1000

24、ASGCacheExpiryTimeoutMs(*)

缓存ASG信息的到期时间,单位为毫秒,默认为10 * 60 * 1000

25、ResponseCacheAutoExpirationInSeconds(*)

当注册表信息被改变时,则其被保存在缓存中不失效的时间,默认为180秒

26、ResponseCacheUpdateIntervalMs(*)

客户端的有效负载缓存应该更新的时间间隔,默认为30 * 1000毫秒

27、UseReadOnlyResponseCache(*)

目前采用的是二级缓存策略,一个是读写高速缓存过期策略,另一个没有过期只有只读缓存,默认为true,表示只读缓存

28、DisableDelta(*)

增量信息是否可以提供给客户端看,默认为false

29、MaxIdleThreadInMinutesAgeForStatusReplication(*)

状态复制线程可以保持存活的空闲时间,默认为10分钟

30、MinThreadsForStatusReplication

被用于状态复制的线程的最小数目,默认为1

31、MaxThreadsForStatusReplication

被用于状态复制的线程的最大数目,默认为1

32、MaxElementsInStatusReplicationPool

可允许的状态复制池备份复制事件的最大数量,默认为10000

33、SyncWhenTimestampDiffers

当时间变化实例是否跟着同步,默认为true

34、RegistrySyncRetries

当eureka服务器启动时尝试去获取集群里其他服务器上的注册信息的次数,默认为5

35、RegistrySyncRetryWaitMs

当eureka服务器启动时获取其他服务器的注册信息失败时,会再次尝试获取,期间需要等待的时间,默认为30 * 1000毫秒

36、MaxElementsInPeerReplicationPool(*)

复制池备份复制事件的最大数量,默认为10000

37、MaxIdleThreadAgeInMinutesForPeerReplication(*)

复制线程可以保持存活的空闲时间,默认为15分钟

38、MinThreadsForPeerReplication(*)

获取将被用于复制线程的最小数目,默认为5

39、MaxThreadsForPeerReplication

获取将被用于复制线程的最大数目,默认为20

40、MaxTimeForReplication(*)

尝试在丢弃复制事件之前进行复制的时间,默认为30000毫秒

41、PrimeAwsReplicaConnections(*)

对集群中服务器节点的连接是否应该准备,默认为true

42、DisableDeltaForRemoteRegions(*)

增量信息是否可以提供给客户端或一些远程地区,默认为false

43、RemoteRegionConnectTimeoutMs(*)

连接到对等远程地eureka节点的超时时间,默认为1000毫秒

44、RemoteRegionReadTimeoutMs(*)

获取从远程地区eureka节点读取信息的超时时间,默认为1000毫秒

45、RemoteRegionTotalConnections

获取远程地区对等节点上http连接的总数,默认为1000

46、RemoteRegionTotalConnectionsPerHost

获取远程地区特定的对等节点上http连接的总数,默认为500

47、RemoteRegionConnectionIdleTimeoutSeconds

http连接被清理之后远程地区服务器的空闲时间,默认为30秒

48、GZipContentFromRemoteRegion(*)

eureka服务器中获取的内容是否在远程地区被压缩,默认为true

49、RemoteRegionUrlsWithName

针对远程地区发现的网址域名的map

50、RemoteRegionUrls

远程地区的URL列表

51、RemoteRegionAppWhitelist(*)

必须通过远程区域中检索的应用程序的列表

52、RemoteRegionRegistryFetchInterval

从远程区域取出该注册表的信息的时间间隔,默认为30秒

53、RemoteRegionFetchThreadPoolSize

用于执行远程区域注册表请求的线程池的大小,默认为20

54、RemoteRegionTrustStore

用来合格请求远程区域注册表的信任存储文件,默认为空

55、RemoteRegionTrustStorePassword

获取偏远地区信任存储文件的密码,默认为“changeit”

56、disableTransparentFallbackToOtherRegion(*)

如果在远程区域本地没有实例运行,对于应用程序回退的旧行为是否被禁用, 默认为false

57、BatchReplication(*)

表示集群节点之间的复制是否为了网络效率而进行批处理,默认为false

58、LogIdentityHeaders(*)

Eureka服务器是否应该登录clientAuthHeaders,默认为true

59、RateLimiterEnabled

限流是否应启用或禁用,默认为false

60、RateLimiterThrottleStandardClients

是否对标准客户端进行限流,默认false

61、RateLimiterPrivilegedClients(*)

认证的客户端列表,这里是除了标准的eureka Java客户端。

62、RateLimiterBurstSize(*)

速率限制的burst size ,默认为10,这里用的是令牌桶算法

63、RateLimiterRegistryFetchAverageRate(*)

速率限制器用的是令牌桶算法,此配置指定平均执行注册请求速率,默认为500

64、RateLimiterFullFetchAverageRate(*)

速率限制器用的是令牌桶算法,此配置指定平均执行请求速率,默认为100

65、ListAutoScalingGroupsRoleName(*)

用来描述从AWS第三账户的自动缩放组中的角色名称,默认为“ListAutoScalingGroups”

66、JsonCodecName(*)

如果没有设置默认的编解码器将使用全JSON编解码器,获取的是编码器的类名称

67、XmlCodecName(*)

如果没有设置默认的编解码器将使用xml编解码器,获取的是编码器的类名称

68、BindingStrategy(*)

获取配置绑定EIP或Route53的策略。

69、Route53DomainTTL(*)

用于建立route53域的ttl,默认为301

70、Route53BindRebindRetries(*)

服务器尝试绑定到候选Route53域的次数,默认为3

71、Route53BindingRetryIntervalMs(*)

服务器应该检查是否和Route53域绑定的时间间隔,默认为5 * 60 * 1000毫秒

72、Experimental(*)

当尝试新功能迁移过程时,为了避免配置API污染,相应的配置即可投入实验配置部分,默认为null

以上是Eureka配置项的详细说明,分为Eureka客户端配置、Eureka服务端配置和微服务端配置,一共100多项,其中有很多配置参数并不需要我们去修改,使用默认的就好,有些跟我们业务相关的配置参数可根据需要自行设置。

Eureka 提供了我们管理应用restful接口,大家可以在https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

Spring cloud Eureka 专题

上面需要注意的是'v2'这个不要放置进去,否则是404错误,这个可能是spring cloud这边有调整过。

http://ip:{port:8761}/eureka/apps 查看所有的应用meta信息

也可以通过http://ip:{port:8761}/eureka/apps/{application_name} 查看具体的应用信息

使得member-service实例192.168.1.41:8090下线那么可以使用下面的接口

curl -X PUT -i -u superuser:HukIl20209293923 curl -X PUT -i -u mbkj:mbkj http://192.168.2.181:8761/eureka/apps/member-service/192.168.100.131:8080/status?value=OUT_OF_SERVICE

上线

curl -X PUT -i -u superuser:HukIl20209293923 http://192.168.2.181:8761/eureka/apps/order-service/192.168.1.41:8090/status?value=UP

Spring cloud Eureka 专题

Spring cloud Eureka 专题

那么就看到了该节点下线,我们在status?value=UP就上线。这个我们可以集群中节点更新过程中应用需要启停,可以用这种方式会更友好。如果结合API网关zuul那么还要等30秒才能使得zuul从eureka获取上游节点的状态变化,我们后面的章节会讲到灰度发布到时候会具体用到。

eureka是为服务发现而生在,当然可选的服务发现的开源工具还有zookeeper,consul ,Etcd等但是这些在使用体验上如部署,可管理,二次开发上成本偏高;所以spring cloud 首选的服务发现是eureka.

这边有不清楚的非常欢迎大家留言讨论


分享到:


相關文章: