【SpringCloud】笔记——Eureka

【SpringCloud】笔记——Eureka

Eureka是Spring Cloud Netflix微服务套件中的一部分,主要任务是在微服务架构中提供服务治理的功能。Spring Cloud中的Eureka针对Spring Boot应用风格进行了适配,从而可以更加方便地将Eureka服务治理体系应用到基于Spring Boot构建的微服务应用中去。

说到服务治理,就得提一下微服务架构。微服务架构将传统单体系统分解成了多个微服务组件,每一个微服务组件可以单独进行开发调试,并且可以部署到不同的位置通过RPC进行远程调用。那么为什么要进行服务治理,如果只是很少的几个微服务,那么确实简单的静态配置就可以将这些微服务整合起来构成一个具有一定功能的系统,但是我们的系统是在不断迭代的,越来越多的微服务组件会被加入进来,同时之前的微服务配置信息还会有所变化,可想而知,一旦微服务数量上来,系统变复杂,那么维护这些微服务的配置将会非常困难,而Eureka正是这样一个专门用于管理微服务的利器。

 Eureka服务治理体系中包含三个核心要素:服务注册中心、服务提供者和服务消费者。

  • 服务注册中心

服务注册中心是由Eureka提供的客户端,主要用于服务的注册与发现功能,其相当于微服务架构中的管理中心。比如你开发了一个微服务想要提供出来,那么你就需要向注册中心注册你的服务,如果你想要调用一个特定的微服务,那么你首先需要向注册中心提交申请。打个比方的话,就类似于拍卖行一样,不管你是买东西还是卖东西,都得过来登记一下,拍卖行(注册中心)负责管理商品信息(微服务配置)以及撮合买卖交易(微服务的调用)。

搭建一个服务注册中心的过程也比较简单,首先在pom文件里添加Eureka相关依赖,然后在启动应用的类上添加@EnableEurekaServer注解即可,该注解的功能就是启动一个服务注册中心。在application.properties里可以配置一些相关参数,比如:

server.port=1234   
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:{server.port}/eureka/

其中register-with-eureka表示是否要向注册中心注册自己,默认是注册的,也就是默认你是一个服务提供者,而单独存在的注册中心并不需要向自己注册,所以设为false。fetch-registry表示是否要检索服务,默认是检索的。这两项默认为true是因为大多数情况下,一个微服务中还会调用其他的微服务,因此对于注册中心来说,它即是服务提供者,又是服务消费者。

服务治理不仅包含了对于微服务配置的管理,同时还包含了对于大量服务调用请求下的高可用问题。微服务架构本身就属于分布式架构,考虑到微服务节点以及注册中心本身都存在故障的可能,因此我们经常部署多个服务注册节点来增强可用性。通过构建多个服务注册中心,将defaultZone标记为其他注册中心,并将上面提到的参数设为true,便可以搭建起多个注册中心的集群。就和一个局域网内部的路由器之间会相互同步更新路由信息一样,集群中的注册中心节点也会通过一定的策略互相更新服务注册信息来保持高可用。

除此之外,注册中心还有失效剔除和自我保护等功能。已经注册的服务会维持一个心跳连接时不时得告诉注册中心自己还活着,有时由于一些异常故障等原因,已经注册的服务可能会突然下线,为了将这些失效任务及时清理掉,Eureka会创建一个定时任务每隔一段时间去清理没有续约的服务。为了防止误伤网络原因导致的心跳未传达,Eureka还会统计15分钟内的心跳失败比率,如果低于85%的话,那么Eureka会认为不是服务挂了,而是网络不稳定,然后将该服务保护起来不进行剔除。

  • 服务提供者

服务提供者是被调用的一方,想要被调用首先需要向服务注册中心注册自己,上文中的register-with-eureka和fetch-registry属性默认true就可以。除此之外,还需要在相关接口中利用@Autowired注入一个DiscoveryClient对象,这个对象是由Eureka实现的,再在主类上添加@EnableDiscoveryClient注解便可以激活该实例。服务名称在配置文件中根据spring.application.name来命名,defaultZone指向要注册的注册中心地址即可。注册完成之后分别启动注册中心和相应服务便可以在控制台看到输出信息,在Eureka的控制面板里也可以看到相应信息。

在注册服务时,一般是通过发送REST请求的方式来将自己注册到注册中心的,请求中还会包含一些元数据信息。注册中心一般将这些元数据信息存储在一个双层Map中,第一层key是服务名,第二层key是实例名,即调用服务时,注册中心会首先根据服务名称来确定其对应的实例集合,然后再从中挑选一个实例取出。注册完成后,为了防止注册中心把自己剔除掉,还需要维护一个心跳来告诉注册中心自己一直活着,对于该功能可以进行如下配置:

eureka.instance.lease-remewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90

其中 lease-remewal-interval-in-seconds表示服务续约任务的间隔时间,lease-expiration-duration-in-seconds表示服务失效的时间。

  • 服务消费者

服务消费者是调用服务的一方,在微服务架构中想要调用微服务需要向注册中心提交申请,服务的发现与消费除了Eureka以外还有Ribbon的参与,Eureka负责发现对应的服务,Ribbon则负责从相应服务实例中进行选择。服务消费者的配置和上述服务提供者基本一直,也是添加@EnableDiscoveryClient注解,注入DisvoveryClient实例来发现服务。@LoadBalanced注解可以实现客户端的负载均衡,这个功能需要添加对Ribbon的依赖。这样便可以在相应方法内通过之前注册的服务名称来进行调用了。

在注册中心收到消费方的请求时,会返回其一个只读的服务清单列表,这个列表里包含了调用服务的相关信息,该清单会进行缓存,每隔30秒更新一次。这个间隔时间可以通过修改如下参数来调整:

eureka.client.registry-fetch-interval-seconds=30

 当某个服务关闭或者重启时,关闭期间会触发一个服务下线的通知,该通知以REST请求的形式发送给注册中心,表明自己要下线了。然后注册中心便会将其状态设置为DOWN,如果有集群的话,还会在集群中将该事件传播出去。

最后列具一下Eureka相关的详细配置参数。

以eureka.client为前缀的:

参数名说明默认值
enabled启用Eureka客户端true
registryFetchIntervalSeconds从Eureka服务端获取注册信息的间隔时间,单位为秒30
instanceInfoReplicationIntervalSeconds更新实例信息的变化到Eureka服务端的间隔时间,单位为秒30
initialInstanceInfoReplicationIntervalSeconds初始化实例信息到Eureka服务端的间隔时间,单位为秒40
eurekaServiceUrlPollIntervalSeconds轮询Eureka服务端地址更改的间隔时间,单位为秒300
eurekaServerReadTimeoutSeconds读取Eureka Server信息的超时时间,单位为秒8
eurekaServerConnectTimeoutSeconds连接Eureka Server的超时时间,单位为秒5
eurekaServerTotalConnections从Eureka客户端到所有Eureka服务端的连接总数200
eurekaServerTotalConnectionsPerHost从Eureka客户端到每个Eureka服务端主机的连接总数50
eurekaConnectionIdleTimeoutSecondsEureka服务端连接的空闲关闭时间,单位为秒30
heartbeatExecutorThreadPoolSize心跳连接池的初始化线程数2
heartbeatExecutorExponentialBackOffBound心跳超时重试延迟时间的最大乘数值10
cacheRefreshExecutorThreadPoolSize缓存刷洗线程池的初始化线程数2
cacheRefreshExecutorExponentialBackOffBound缓存刷新重试延迟时间的最大乘数值10
useDnsForFetchingServiceUrls使用DNS来获取Eureka服务端的serviceUrlfalse
registerWithEureka是否要将自身的实例信息注册到Eureka服务端true
preferSameZoneEureka是否偏好使用处于相同Zone的Eureka服务端true
filterOnlyUpInstances获取实例时是否过滤,仅保留UP状态的实例true
fetchRegistry是否从Eureka服务端获取注册信息true

以eureka.instance为前缀的:

参数名说明默认值
preferIpAddress是否优先使用IP地址作为主机名的标识false
leaseRenewalIntervalInSecondsEureka客户端向服务端发送心跳的时间间隔,单位为秒30
leaseExpirationDurationInSecondsEureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒90
nonSecurePort非安全的通信端口号80
securePort安全的通信端口号443
nonSecurePortEnabled是否启用非安全的通信端口号true
securePortEnabled是否启用安全的通信端口号 
appname服务名,默认取spring.application.name的配置值,没有则为unknown 
hostname主机名,不配置的时候将根据操作系统的主机名来获取 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值