一、Spring Cloud 介绍
Spring Cloud是一个基于Spring Boot来实现的一系列工具框架的集合体。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
什么是微服务:
- 微服务是一种软件架构
- 微服务是由多个服务组成的集合体
- 微服务里面的每个服务都是独立存在的
- 微服务是一种去中心化的思想
微服务的特点(优点):
- 开发相对简单
- 技术栈灵活
- 服务独立解耦
- 可用性高
微服务的缺点:
- 维护和部署复杂度增加
- 服务间通信成本增加(单应用我们可以直接调用,而多应用需要通过HTTP协议做通讯)
- 数据一致性(传统单服务直接用事物来控制;而多应用中服务间是解耦的,就不能用传统的事物来控制而是用分布式事物,这个也是增加成本)
- 系统集成测试(服务与服务间测试成本增加)
spring boot 和 spring cloud 的关系:
- Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务,Spring Boot,看名字就知道是Spring的引导,就是用于启动Spring的,使得Spring的学习和使用变得快速无痛。不仅适合替换原有的工程结构,更适合微服务开发。
- Spring Cloud基于Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。
- Spring Cloud是一个基于Spring Boot实现的云应用开发工具;Spring boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;spring boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring boot来实现。
- Spring boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring boot,属于依赖的关系。
- 你可以把spring boot的官方的包分为两类,一种是为了搭建一个服务用的,比如hibernate jpa,比如 message。另外一种含有cloud关键字的,是为了各个spring boot之前管理和使用的包。
重点:
- 基于 Spring Boot
- 云服务、分布式框架集合(众多)
核心功能:
- 分布式/版本化配置
- 服务注册和发现
- 路由
- 服务和服务之间的调用
- 负载均衡
- 断路器
- 分布式消息传递
Spring Cloud 完整技术
( 该图片来源于网络 )
我的学习线路
问:请说说eureka和 zookeeper,两个的区別?
首先 说CAP 是什么 所谓的CAP C强一致性 A可用性 P 分区容错性
著名的CAP理论指出,
一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性 P 在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。
zookeeper 遵守 CP
当向注册中心查询服务列表时, 我们可以容忍注册中心返回的是几分钟以前的注册信息, 但不能接受服务直接down掉不可用。
也就是说,服务注册功能对一致性的要求要高于可用性。
但是zookeeper 会出现这样一种情况, 当 master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行 leader选举。
问题在于,选举 leader的时间太长,30~120s,目选举期间整个zookeeper 集群都是不可用的,这就导致在选举期间注册服务瘫痪。
在云部署的环境下,因网络问题使得zookeeper 集群失去 master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。
或许 这个回答太过于抽象 用一种其他说法来说 就是 :
当有一个zookeeper 挂了 那其他的zookeeper 会进行 一次选举 (强一致性 : 我一定要保持数据一致性) 而在此选举期间 zookeeper 是不可用的 而当前 有用户正在使用 用户就不爽了 。
Eureka遵守 AP
Eureka:看明白了这一点,因此在设计时就优先保证可用性。
Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。
而 Eureka的客户端在向某个 Eureka注册或时如果发现连接失败,则会自动切换至其它节点
只要有一台 Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的不保证强一致性)。
除此之外, Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么 Eurekas就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
- Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
- Eureka仍然能够接受新服务的注册和査询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
- 当网络稳定时,当前实例新的注册信息会被同步到其它节点中
因此, Eureka可以很好的应对因网络故障导致部分节点失去联系的情況,而不会像 zookeeper那样使整个注册服务瘫痪。
二、Spring Cloud 核心子项目及组件
( 该图片来源于网络 )
Spring Cloud Netflix(重要)
是对Netflix开发的一套分布式服务框架的封装,包括服务的发现和注册,负载均衡、断路器、REST客户端、请求路由等。
- Eureka:服务治理组件,包含服务注册与发现
- Hystrix:容错管理组件,实现了熔断器(熔断降级)
- Ribbon:客户端负载均衡的服务调用组件
- Feign:基于Ribbon和Hystrix的声明式服务调用组件
- Zuul:服务网关组件,提供智能路由、访问过滤等功能
- Archaius:外部化配置组件
Spring Cloud Config
配置管理工具,分布式配置,实现应用配置的外部化存储,支持客户端配置信息刷新、加密/解密配置内容等;将配置信息中央化保存, 配置Spring Cloud Bus可以实现动态修改配置文件
Spring Cloud Bus
事件、消息总线,用于传播集群中的状态变化或事件,以及触发后续的处理;分布式消息队列,是对Kafka, MQ的封装
Spring Cloud Security
基于spring security的安全工具包,为我们的应用程序添加安全控制;对Spring Security的封装,并能配合Netflix使用
Spring Cloud Consul
封装了Consul操作,Consul是一个服务发现与配置工具(与Eureka作用类似),与Docker容器可以无缝集成
Spring Cloud Zookeeper
对Zookeeper的封装,使之能配置其它Spring Cloud的子项目使用
Spring Cloud Eureka
Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能。
三、Spring Cloud Netflix组件
Spring Cloud Netflix通过自动配置和绑定到Spring Environment和其他Spring编程模型成语,为Spring Boot应用程序提供了Netflix OSS集成。 通过一些简单的注解,您可以快速启用和配置应用程序内的通用模式,并使用经过测试的Netflix组件构建大型分布式系统。 提供的模块包括服务注册与发现(Eureka),断路器(Hystrix),智能路由(Zuul)和 客户端负载平衡(Ribbon)
- Eureka:服务治理组件,包含服务注册与发现
- Hystrix:容错管理组件,实现了熔断器(熔断降级)
- Ribbon:客户端负载均衡的服务调用组件
- Feign:基于Ribbon和Hystrix的声明式服务调用组件
- Zuul:服务网关组件,提供智能路由、访问过滤等功能
- Archaius:外部化配置组件