什么是SpringCloud?
在SpringBoot的基础上构建的微服务框架。它利用SpringBoot的开发便利性简化了分布式系统基础设施的开发,如服务发现注册,配置中心,智能路由,消息总线,负载均衡,断路器,数据监控等,都可以用SpringBoot的开发的风格做到一件启动和部署。
微服务之间是如何独立通讯的?
同步通讯:Dubbo基于RPC远程调用,SpringCloud通过REST接口json调用。
异步通讯:通过消息队列,比如RabbitMQ,ActiveMQ, Kafka.
什么是服务熔断?什么是服务降级?
熔断机制是应对雪崩效应的一种微服务链保护机制,当扇出链路的谋和微服务不可用,或者相应时间太久,会进行服务降级,进而熔断该节点微服务的调用。快速返回错误的相应信息。
当检测到该节点相应正常后恢复调用链路。
服务降级,一般是从整体负荷考虑,就是当某个服务熔断之后,服务器不在被调用,此时客户端可以自己准备一个本地的fallbacn回调,返回一个缺省值,这样,虽然水品下降,但好歹能用,比直接挂掉强。
你所知道的微服务技术栈有哪些,列举几个?
服务注册与发现:Eureka,zookeeper
服务调用:Rest、rpc、grpc
服务熔断器:Hystrix
服务器负载均衡:Ribbon、Nginx
服务接口调用:Feign
消息队列:kafka、RabbitMQ、ActiveMQ
服务配置中心管理:SpringCloudConfig
服务路由(API网关):Zuul
事件消息总线:SpringCloudBus
Eureka和zookeeper都可以提供服务注册于发现的功能,区别是什么?
Zookeeper:当注册中心查询到服务列表时,我们可以接受注册中心返回的是几分钟之前的消息,但是接受不了直接down掉不可用,也就是说服务注册功能对高可用性能要求比较高,但zk会出现这样一种情况,当master节点因为网络故障失去联系时,其他节点就会重新选取leader,而leader时间过长,选举期间zk集群都不可用,这样就导致选举期间注册服务瘫痪。
Eureka:保证了可用性,她的每个节点是平等的,几个节点挂掉不会影响正常节点的工作,
剩余的节点任然可以提供注册和查询服务,只要有一台Eureka的节点还在,就能保证注册服务可用,只是查到的信息可能不是最新的。
SpringCloud五大组件
微服务发现:Eureka 实现服务注册与发现
负载均衡:Ribbon 用来做客户端负载均衡
断路器:Hystrix 断路器,保护系统,控制故障范围
服务网关:Zuul 类似于Nginx 反向代理
服务调用:feign 远程调用组件
SpringCloud的优点:
产出于Spring大家族,Spring在企业级开发框架中无人能敌,来头很大,可以保证后续的更新、完善组件丰富,功能齐全。Spring Cloud 为微服务架构提供了非常完整的支持。例如、配置管理、服务发现、断路器、微服务网关等;
Spring Cloud 社区活跃度很高,教程很丰富,遇到问题很容易找到解决方案服务拆分粒度更细,耦合度比较低,有利于资源重复利用,有利于提高开发效率可以更精准的制定优化服务方案,提高系统的可维护性减轻团队的成本,可以并行开发,不用关注其他人怎么开发,先关注自己的开发微服务可以是跨平台的,可以用任何一种语言开发适于互联网时代,产品迭代周期更短。
缺点:项目结构复杂,每一个组件或者每一个服务都需要创建一个项目。部署门槛高,项目部署需要配合Docker等容器技术进行集群部署,而想要深入了解Docker,学习成本高。
SpringBoot和SpringCloud的区别?
SpringBoot专注于快速方便的单个个体微服务。
SpringCloud是关注全局的微服务协调整理框架,他将SpringBoot开发的一个一个单体服务整合并管理起来。为各个微服务之间提供,配置管理,服务发现,熔断器,路由,为代理,事件总线,全局锁,决策竞选,分布式回话等集成服务。SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关系SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。
使用 Spring Boot 开发分布式微服务时,我们面临以下问题
(1)与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题。
(2)服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
(3)冗余-分布式系统中的冗余问题
(4)负载平衡 --负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布
(5)性能-问题 由于各种运营开销导致的性能问题。
(6)部署复杂性-Devops 技能的要求。
服务注册和发现是什么意思?Spring Cloud 如何实现?
当我们开始一个项目时,我们通常在属性文件中进行所有的配置。随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化。手动更改属性可能会产生问题。 Eureka 服务注册和发现可以在这种情况下提供帮助。由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找,因此无需处理服务地点的任何更改和处理。
负载均衡(Hyxtrix)的意义什么?
在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。
什么是 Hystrix?它如何实现容错?
Hystrix 是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。通常对于使用微服务架构开发的系统,涉及到许多微服务。这些微服务彼此协作。随着微服务数量的增加,这个问题变得更加复杂。我们将使用 Hystrix 在这种情况下的 Fallback 方法功能。现在假设由于某种原因,公开的服务会抛出异常。我们在这种情况下使用 Hystrix 定义了一个回退方法。这种后备方法应该具有与公开服务相同的返回类型。如果暴露服务中出现异常,则回退方法将返回一些值。
什么是 Spring Cloud Bus?我们需要它吗?
考虑我们有多个应用程序使用 Spring Cloud Config 读取属性,而Spring Cloud Config 从 GIT 读取这些属性。下面的例子中多个员工生产者模块从 Employee Config Module 获取 Eureka 注册的财产。如果假设 GIT 中的 Eureka 注册属性更改为指向另一台 Eureka 服务器,会发生什么情况。在这种情况下,我们将不得不重新启动服务以获取更新的属性。这就是 Spring Cloud Bus 发挥作用的地方。Spring Cloud Bus 提供了跨多个实例刷新配置的功能。因此,在上面的示例中,如果我们刷新 Employee Producer1,则会自动刷新所有其他必需的模块。如果我们有多个微服务启动并运行,这特别有用。这是通过将所有微服务连接到单个消息代理来实现的。无论何时刷新实例,此事件都会订阅到侦听此代理的所有微服务,并且它们也会刷新。可以通过使用端点/总线/刷新来实现对任何单个实例的刷新。
Spring Cloud断路器的作用
当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应 当更多的服务请求到这些资源导致更多的请求等待,发生连锁效应(雪崩效应)断路器有完全打开状态:一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务半开:短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时 断路器关闭关闭:当服务一直处于正常状态 能正常调用
什么是Spring Cloud Config?
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。使用:
(1)添加pom依赖
(2)配置文件添加相关配置
(3)启动类添加注解@EnableConfigServer
什么是Spring Cloud Gateway?
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。使用了一个RouteLocatorBuilder的bean去创建路由,除了创建路由RouteLocatorBuilder可以让你添加各种predicates和filters,predicates断言的意思,顾名思义就是根据具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改。