Spring Cloud组件总结
微服务
微服务是将一个大的单体应用,根据服务拆分为多个功能专一的轻量服务。
各个微服务之间可以使用不同的语言和数据库,服务之间通过HTTP进行调用。
服务能很容易的横线扩展
服务之间松耦合
服务简单,内聚度高,开发效率高
微服务通信
数据一致性
调用性能监控
多服务运维
Spring Cloud与dubbo
dubbo与zookeeper实现了服务发现和RPC调用。而spring
cloud是定位于微服务治理全家桶。
像配置中心、熔断器、服务网关等,spring
cloud都有相应的组件实现,而dubbo则需要其他中间件的配合。
注册中心
微服务集群服务数量很多,如果通过配置指定依赖的服务的地址,当节点上下线的时候,会大大增加维护成本。
而注册中心提供服务注册和服务发现的功能。
每一个微服务都会向注册中心组成自己所提供的服务,并且从注册中心查询所需服务的地址。
每一个节点也会向注册中心上报健康情况,动态更新服务列表。
Eureka
Eureka是spring cloud的注册中心组件。
如上所说,其他服务会通过Eureka客户端连接到Eureka服务端,保持心跳,把自己的信息注册到注册中心。
- 高可用:使用Eureka集群,不同的Eureka节点之间相互注册,通过注册中心本身来监控Eureka节点的更新
- 自我保护模式:如果Eureka在一段时间里没有收到某服务的心跳,会进入自我保护模式。
并不会清除该服务的注册信息并正常对外提供。
直到心跳恢复正常才会退出自我保护模式,更新服务列表。简单来说就好有比没有好 - Eureka与ZooKeeper:如果zookeeper的主节点挂了要进行选举,在选举期间是无法对外提供服务的,重于一致性。
Eureka的各个节点之间是平等的,只要有节点正常就能对外提供服务,重于可用性。
客户端均衡负载
Ribbon
Ribbon是spring cloud的客户端均衡负载组件。
Ribbon会从注册中心获取服务的全部节点信息,使用轮询去均衡请求各个节点。
使用@LoadBalanced
注解开启均衡负载。
- Ribbon与Nginx:Nginx是在反代的过程中均衡负载,请求的流量会经过nginx。Ribbon是客户端请求时直接均衡负载到服务端。
声明式web客户端
Feign
Feign是一个声明式web客户端,帮助我就构造请求HTTP接口。
与Ribbon结合,就能实现轮询的声明式HTTP请求接口。
配置中心
微服务集群节点众多,与注册中心一样,需要一样统一的配置中心对不同服务的配置进行管理和更新。
配置中心基于git,通过git能原始实现对配置文件的版本控制。
熔断器
在分布式系统里,如果其中有一个服务不可用,服务请求阻塞直到超时,占用服务的全部线程,导致整个服务不可用。
新的服务不可用又会导致别的服务不可用,最后连锁效应导致整个服务集群发生雪崩效应。
隔离:熔断器会隔离不同服务之间的影响
监控:熔断器会对每次调用的成功失败、时间进行记录
熔断:熔断器监控服务的失败数或者失败率达到一定的值,会对这个服务进行熔断,不再请求这个服务
降级:熔断器在熔断后服务会进行降级,调用备用的降级方法,维持服务的可用性
关闭:熔断器关闭,请求正常
打开:发现某个服务不可用,熔断该服务,熔断器处于打开状态
半开:熔断的一段时间后,会将部分请求发给接口
Hystrix
Tomcat默认只有一个线程池来处理请求,会导致服务雪崩。
Hystrix会给每一个服务配一个线程池,通过线程池隔离不同的服务。除此以外还可以使用信号量方式。
服务网关
服务网关通过路由转发,统一暴露微服务集群的接口。
并且在服务网关里实现与业务逻辑无关的,如鉴权、限流、缓存、监控、统计等功能。
Zuul、Zuul2与Gateway
Zuul基于Servlet是BIO,Zuul2基于netty是NIO,Gateway是spring cloud推出的第二代网关,同样是NIO,用于替代zuul。
消息总线
可与配置中心结合,实现配置实时更新。
组件发音
- Eureka [jʊ'ri:kə]
- Ribbon [ˈrɪbən]
- Feign [fen]
- Hystrix [hɪst'rɪks]
- Zuul [zulu]
- Sleuth [sluθ]
- Turbine [ˈtɜ:rbaɪn]
参考文章: