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区别
- Spring Boot是spring的一个脚手架,基于spring,快速开发单个微服务
- Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。
- Spring Cloud是一个基于Spring Boot实现的云应用开发工具;
- Spring boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;
- spring boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,
- 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
- 优点:简单,常见,因为没有中间件代理,系统更简单
- 缺点:只支持请求/响应的模式
- 服务的注册与发现,直接通过远程过程调用来访问别的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的一个开源项目,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现;