SpringCloud分布式开发五大组件详解

1、服务发现——Netflix Eureka

  • Eureka服务端:也称服务注册中心,同其他服务注册中心一样,支持高可用配置。如果Eureka以集群模式部署,当集群中有分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,集群中其他分片会把它们的状态再次同步回来
  • Eureka客户端:主要处理服务的注册与发现。客户端服务通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端想注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态
  • Eureka Server的高可用实际上就是将自己作为服务向其他注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用效果

2、服务消费者——客户负载均衡——Netflix Ribbon

  1. Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到服务均衡的作用。
  2. ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon。

3、服务消费者 ——Netflix Fegin

Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。

简而言之:

  1. Feign 采用的是基于接口的注解
  2. Feign 整合了ribbon,具有负载均衡的能力
  3. 整合了Hystrix,具有熔断的能力

4、断路器——Netflix Hystrix

在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定。为了解决这样的问题,产生了断路器等一系列的服务保护机制

在分布式架构中,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延

Hystrix具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能

Hystrix使用舱壁模式实现线程池的隔离,它会为每一个依赖服务创建一个独立的线程池,这样就算某个依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响,而不会拖慢其他的依赖服务

5、服务网关——Netflix Zuul

Spring Cloud Zuul通过与Spring Cloud Eureka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中获得了所有其他微服务的实例信息

对于路由规则的维护,Zuul默认会将通过以服务名作为ContextPath的方式来创建路由映射

Zuul提供了一套过滤器机制,可以支持在API网关无附上进行统一调用来对微服务接口做前置过滤,已实现对微服务接口的拦截和校验

小结

  • Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
  • Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
  • Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
  • Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
  • Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务

SpringCloud常见面试问题

1、springcloud 与dubbo的区别

服务调用方式不同,dubbo是采用rpc远程调用,srpingcloud是采用rest api远程调用.

注册中心:dubbo是采用zookeepe,springcloud是采用eureka

服务网关不同:dubbo本身是没有实现的,只是整合了第三方的技术.而springcloud是有一个组建zuul作为路由网关,springcloud还支持断路器,与git完美集成分布式配置文件支持版本控制.

2、微服务之间是如何独立通信的?

feign远程调用

优点:没有中间代理件,简单常见

缺点:可用性低,在请求过程中服务端和客户端都必须是可用的.

消息中间件

优点:解耦,提高可用性,可以支持多种相应模式(如:发布/订阅,请求/异步响应等等)。

缺点:增加系统的复杂度,万一消息中间件挂了,整个服务就挂了。

3、微服务的优缺点?

优点:

  • 每个服务都是高内聚,低耦合,代码通俗易懂
  • 容易与第三方集成
  • 微服务只是业务逻辑的代码,不会和html,css界面组合在一起,一般采用前后端分离的方法开发
  • 可以灵活开发,连接公共数据库/连接独立数据库

缺点:

  • 运维成本高
  • 数据一致性
  • 性能监控
  • 难度高

4、springcloud如何实现服务注册?

服务发布时,指定对应的服务名,将服务注册到注册中心

注册中心加上@EnableEurekaServer,服务用@EnableEurekaClient标记这个服务,然后通过ribbon和feign进行远程调用和发现.

5、eureka和zookeeper的区别

eureka取用cap的ap,而zookeeper选用cp注重一致性(C:一致性.A:可用性.P:分区容错性.)

在服务崩溃时,eureka有自我保护机制,各个节点都是平等关系,在一个节点崩溃时,微服务并不会盲目删除这个节点,而是进入保护状态,此时可以正常注册,也可以提供查询服务,但是不与其他节点同步信息,其他节点可以正常使用

zookeeper分为leader和follower两种角色,采用半数存活的原则,超过一般的节点挂机就会使整个服务崩溃 而且在leader崩溃之后需要重新选举,在此期间服务是不可用的.

更多推荐

【SpringCloud学习笔记】SpringCloud分布式开发五大组件详解