Spring cloud的服务治理组件使用spring cloud netflix,它是大多集成了netflix公司开发的eureka(服务发现和服务注册),ribbon(负载均衡),Hystrix(断路器)、Feign(RESTful Web Service客户端,整合了Ribbon和Hystrix)等
一、eureka (服务发现和注册组件)
eureka是spring cloud 推荐的,它和spring cloud完美融合,相比较其他二款服务发现和服务注册组件zookeper,consul,推荐使用eureka。次之使用consul,最后才是zookeeper。
Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client。为了便于理解,我们将Eureka client再分为Service Provider和Service Consumer。
Eureka本身是Netflix开源的一款提供服务注册和发现的产品,并且提供了相应的Java封装。 在它的实现中,节点之间是相互平等的,部分注册中心的节点挂掉也不会对集群造成影响,即使集群只剩一个节点存活,也可以正常提供发现服务。 哪怕是所有的服务注册节点都挂了,Eureka Clients上也会缓存服务调用的信息。这就保证了我们微服务之间的互相调用是足够健壮的。
Eureka Server 高可用集群
Eureka Server 集群采用peer to peer(对等)的对等通信,集群中的每个节点都是对等的,这是一种去中心化的架构,无master/salve之分,每一个peer都是对等。
如果某台Eureka Server宕机,Eureka Client的请求会自动切换到新的Eureka Server节点,当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会进行replicateToPeer(节点间复制)操作,将请求复制到其他Eureka Server当前所知的所有节点中。
二、Ribbon
Ribbon为rest客户端提供负载均衡,它主要包括六个组件
- ServerList,负载均衡使用的服务器列表。这个列表会缓存在负载均衡器中,并定期更新。当Ribbon与Eureka结合使用时,ServerList的实现类就是DiscoveryEnabledNIWSServerList,它会保存Eureka Server中注册的服务实例表。
- ServerListFilter,服务器列表过滤器。这是一个接口,主要用于对Service Consumer获取到的服务器列表进行预过滤,过滤的结果也是ServerList。Ribbon提供了多种过滤器的实现。
- IPing,探测服务实例是否存活的策略。
- IRule,负载均衡策略,其实现类表述的策略包括:轮询、随机、根据响应时间加权等。
- ILoadBalancer,负载均衡器。这也是一个接口,Ribbon为其提供了多个实现,比如ZoneAwareLoadBalancer。而上层代码通过调用其API进行服务调用的负载均衡选择。一般ILoadBalancer的实现类中会引用一个IRule。
- RestClient,服务调用器。顾名思义,这就是负载均衡后,Ribbon向Service Provider发起REST请求的工具。
Ribbon工作时会做四件事情:
- 1.优先选择在同一个Zone且负载较少的Eureka Server;
- 2、定期从Eureka更新并过滤服务实例列表;
- 3、根据用户指定的策略,在从Server取到的服务注册列表中选择一个实例的地址;
- 4、通过RestClient进行服务调用。
三、服务调用端熔断——Hystrix
todo
四、服务调用端代码抽象和封装——Feign
Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。它整合了Ribbon和Hystrix,从而让我们不再需要显式地使用这两个组件。Feign还提供了HTTP请求的模板,通过编写简单的接口和插入注解,我们就可以定义好HTTP请求的参数、格式、地址等信息。接下来,Feign会完全代理HTTP的请求,我们只需要像调用方法一样调用它就可以完成服务请求。
Feign具有如下特性:
- 可插拔的注解支持,包括Feign注解和JAX-RS注解
- 支持可插拔的HTTP编码器和解码器
- 支持Hystrix和它的Fallback
- 支持Ribbon的负载均衡
- 支持HTTP请求和响应的压缩