SpringCloud的特性

SpringCloud的特性是不同的组件来完成,在架构的演进过程中扮演者重要的角色;

  • 分布式、版本化配置
  • 服务注册和发现
  • 路由
  • 服务和服务之间的调用
  • 负载均衡
  • 断路器
  • 分布式消息传递

    SpringCloud 组件

    | 服务注册与发现 | 服务调用 | 服务熔断器 | 服务网关 | 服务配置 | 服务总线 | 分布式消息 | 负载均衡 | 分布式事务 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | Consul | Ribbon |
    | Zuul |
    |
    | | | | | Zookeeper | LoadBalancer | Resilience4J | Zuul2 | | | | | | | Eureka | OperFeign | Hystrix(豪猪) | gateway | Config | Bus | | | | | Nacos | Dubbo RPC | Sentinel | Dubbo Proxy | Nacos | | SCS RocketMQ | Dubbo LB | Seata |

FAQ

SpringCloud和SpringBoot区别

  1. Spring Boot是spring的一个脚手架,基于spring,快速开发单个微服务
  2. Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。
  3. Spring Cloud是一个基于Spring Boot实现的云应用开发工具;
  4. Spring boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;
  5. spring boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,
  6. Spring Cloud很大的一部分是基于Spring boot来实现。

SpringCloud和Dubbo

  • springcloud抛弃了dubbo的rpc通信,采用基于http的rest方式,两种方式各有优劣,后者牺牲了服务调用的性能,而rest相比rpc更为灵活,在强调快速演化的微服务环境下显得更为适用
  • dubbo和springcloud并不是完全的竞争关系,两者所解决的问题域不一样,dubbo的定位始终是一款rpc框架,而springcloud的目的是微服务架构下的一站式解决方案
  • 非要比较的话,dubbo可以类比netflix OSS技术栈,而springcloud集成了NetFlixOSS作为分布式服务治理的解决方案,但除此之外,springcloud还提供了包括config,stream,security、seluth等分布式解决方案,当前由于rpc协议、注册中心元数据不匹配等问题,在面临微服务基础框架选型时,dubbo与springcloud只能二选一,这也是两者总拿来对比的原因。dubbo之后会积极寻求适配到springcloud生态,比如作为springcloud二进制通信方案来发挥dubbo的性能优势,或者dubbo通过模块化以及对http的支持适配到spring

RestFull与RPC

  • RPC:Remot Procedure Call 远程过程调用,RPC基于socket 工作在会话层,自定义数据格式,速度快,效率快,早期的webservier,现在热门的dubbo都是rpc的典型代表
  • http:http其实是一种网络传输协议,基于tcp 工作在应用层,规定了数据传输格式,现在客户端浏览器与服务端通信基本都是采用http协议,也可以用来进行远程服务调用,缺点是消息封装臃肿,优势是对服务的提供和调用方都没有任何的技术限定,自由灵活,更符合微服务理念,现在热门的rest风格,就可以通过http协议来实现,如果公司全部采用java技术栈,那么使用dubbo作为微服务架构是一个不错的选择,相反,如果公司的技术多样化,而且你更青睐spring家族,那么springcloud搭建微服务是不二之选

微服务之间是如何建立通讯的

  • 远程过程调用
    • 服务的注册与发现,直接通过远程过程调用来访问别的service
      • 优点:简单,常见,因为没有中间件代理,系统更简单
      • 缺点:只支持请求/响应的模式
  • 消息
    • 使用异步消息来做服务间的通讯,服务间通过消息管道来交换消息,从而通讯
      • prc灵活整合机制比如通知、请求/异步响应、发布/订阅、发布/异步响应
      • 缺点:消息中间件有额外的复杂度

微服务的优缺点分别是什么 说说你在项目开发中遇到的坑

优点

  • 每一个服务足够内聚,代码更容易理解
  • 开发效率高,一个服务制作一件事
  • 微服务能够被小团队单独开发
  • 微服务是松耦合的,是有功能意义的服务
  • 可以用不同的语言开发,面向接口编程
  • 易于第三方集成
  • 微服务只是业务逻辑的代码,不会和html,css或者其他的页面组合
    • 开发中分为两种模式
      • 前后端分离
      • 全栈
  • 可以灵活搭配,连接公共库/连接独立库

缺点

  • 分布式系统的负责性
  • 多服务运维难度,随着服务的增加,运维的压力也在增大
  • 系统部署依赖
  • 服务间通信成本
  • 数据一致性
  • 系统集成测试
  • 性能监控

什么是Eureka 什么是服务注册与发现

Eureka 是NetFlix公司开源的一个服务注册与发现的组件

  • 服务发布时指定对应的服务器名,将服务注册到服务中心
  • 服务方使用@EnableEurekaServer来标注为
  • 消费方使用@EnableEurekaClient标注 并使用ribbon或者openfeign进行服务调用与发现

Eureka和Zookeeper都可以提供服务注册和发现的功能,说说两个的区别

  • zk保证的是CP (C:数据一致性,P:分区容错性)
    • 服务注册功能对可用性的要求要高于一致性
    • 但是zk会出现这样一种情况,zookeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间是不可用的
  • Eureka保证的AP(A:服务可用性,P分区容错性)
    • eureka各个节点是平等关系,只要有一台EurekaServer就可以保证服务可用,只不过查到的信息可能不是最新的(不保证强一致性)
    • eureka在自我保护机制中可能会出现以下几种情况
      • eureka不在从注册列表中移除因为长时间没收到心跳而应该过期的服务
      • eureka仍然能够接受新服务的注册和查询的请求,但是不会被其他节点同步(即保证当前节点依然可用)
      • 当网络恢复正常时,当前的新实例才会被同步到其他节点中

Eureka的自我保护机制是什么

当EurekaServer节点在短时间内丢失了过多实例的连接时,节点会自动进入自我保护机制,保护注册信息,不再删除注册数据,恢复正常时,自动退出自我保护机制

什么是Ribbon

Ribbon 是 NetFlix公司提供的一个基于HTTP和TCP的客户端负载均衡器

  • Ribbon主要有两个功能
    • 简化远程调用
    • 负载均衡

负载均衡的意义是什么

  • 在计算机中,负载均衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算机资源的工作负载分布。
  • 负载均衡主要在于优化资源使用,最大吞吐量,最小响应时间并避免任何单一资源的过载。使用多个组件进行负载均衡,而不是单个组件可能会通过冗余来提高可靠性和可用性。
  • 负载均衡通常涉及专用软件或硬件,硬件如多层交换机,软件如果系统服务进程

什么是Openfeign

Feign 最初是由NetFlix公司提供的,但是不支持SpringMVC注解,后由springcloud对其封装,支持了springmvc注解 称之为Openfeign

  • Openfeign是一个声明式的rest客户端,它用于基于接口的注解方式,很方便实现客户端配置
  • Openfeign可以吧rest的请求进行隐藏,伪装成类似springmvc和controller一样,省去了拼接url的步骤

什么是Hystrix

Hystrix是NetFlix公司提供的
Hystrix在英文里面的意思豪猪,它的logo也一个豪猪,它在微服务系统中是一款提供保护机制的组件,

  • Hystrix是一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败 (雪崩)
  • 雪崩:一个服务失败,导致整条链路的服务都失败的情形
  • 主要功能
    • 隔离
      • 线程池隔离
      • 信号量隔离
    • 降级
    • 熔断
    • 限流

什么是服务熔断,什么是服务降级

  • 服务熔断
    • 用于微服务调用情况,当失败的情况达到预定的阈值,会打开断路器,拒绝所有请求,直到服务恢复为止
  • 服务降级
    • 当服务发生异常或调用超时,返回默认数据 则被称为服务降级

SpringCloud断路器的作用是什么?

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

什么是Gateway

Gateway是spring官网基于spring5.0 springboot2.0 project reactor 等技术开发的网关服务

  • 基于filter链提供网关基本功能:安全,监控或埋点、限流等
  • 为微服务架构提供简单、有效且统一的API路由管理方式
  • 是替代NetFlixZuul的一套解决方案
  • 组件的核心是一系列的过滤器,通过这些过滤器可以将用户发送的请求转发到对应的微服务
  • 是加在整个微服务最前沿的防护墙和代理器,隐藏微服务节点IP端口信息,从而加强安全保护
  • 本身也是一个微服务,需要注册到Eureka服务注册中心
  • 网关的核心功能是:过滤和路由

什么是Config

SpringCloudConfig 是分布式场景下多环境配置文件的管理和维护

  • 集中管理配置文件(git协议)
  • 不同环境不同配置,动态化的配置更新
  • 配置信息改变时,不需要重启即可更新配置信息到服务

配置中心本质上也是一个微服务,同样需要注册到Eureka服务注册中心

什么是Bus

Spring Cloud Bus 是轻量级的消息中间件将分布式的节点连接起来,可以用在广播配置文件的更改或者服务的监控管理,关键的思想就是:消息总线可以为微服务做监控,也可以实现应用程序之间相通信

  • 可选的消息中间件包括 RabbitMQ 和 Kafka
  • 可以使用Spring Cloud Bus来实现配置的自动更新
  • 需要注意的是Spring Cloud Bus底层是基于RabbitMQ实现的,默认使用本地的消息队列服务,所以需要提前开启RabbitMQ服务

什么是Stream

  • Spring Cloud Stream 是一个构建消息驱动微服务应用的框架
  • Stream解决了开发人员无感知使用消息中间件的问题,因为Stream对消息中间件的进一步封装,可以做到代码层对中间件的无感知,甚至于动态的切换中间件,使得微服务开发的高度解耦,服务可以关注更多自己的业务流程
  • Spring Cloud Stream 目前支持两种消息中间件 RabbitMQ 和 Kafka
  • Stream构建的应用程序与消息中间件之间是通过绑定器Binder相关联的,绑定器对于应用程序而言起到了隔离作用,它使得不同消息中间件的实现细节对应用程序来说是透明的
    • binding 是我们通过配置把应用和stream的binder绑定在一起
    • output 发送消息Channel 内置Source接口
    • input 接收消息Channel 内置Sink接口

什么是Sleuth+Zipkin

Spring Cloud Sleuth 是一个工具,它在整个分布式系统中跟踪一个用户请求的过程, 捕获这些数据,就能构建微服务整个调用链的视图,这是调试和监控微服务的关键工具

  • 耗时分析
  • 可视化错误
  • 链路优化

Zipkin 是Twitter的一个开源项目,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现;