面试题-SpringCloud

李博帅上海

SpringCloud

什么是微服务架构

微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微服务
运行在自己的进程中,并使用轻量级的机制通信。这些服务围绕业务能力来划分,并通过自动化部
署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限度的集中式管
理。

为什么需要学习SpringCloud

  • 随着我们应用业务逐渐变得复杂,传统的单体式架构已经不满足我们的日常开发了。这个时候我们就需要从传统的单体架构转变为微服务式的架构模式。
  • 传统的单体式架构,在业务越来越复杂,代码量越来越多的时候。会导致管理越来越困难,代码结构的越来越混乱。同时,这也会给业务的快速迭代带来巨大挑战;
  • 开发效率变低:开发人员同时开发一套代码,很难避免代码冲突。开发过程会伴随着不断解决冲突的过程,这会严重的影响开发效率;
    排查解决问题成本高:线上业务发现 bug,修复 bug 的过程可能很简单。但是,由于只有一套代码,需要重新编译、打包、上线,成本很高。
  • 由于单体结构的应用随着系统复杂度的增高,会暴露出各种各样的问题。近些年来,微服务架构逐渐取代了单体架构,且这种趋势将会越来越流行。Spring Cloud是目前最常用的微服务开发框架,已经在企业级开发中大量的应用。

SpringCloud的优缺点

优点
  • 产出于Spring大家族,Spring在企业级开发框架中无人能敌,来头很大,可以保证后续的更新、完善
  • 轻轻松松几行代码,注解或者配置就完成了熔断、负载均衡、注册中心的各种平台功能
  • Spring Cloud 社区活跃度很高,教程很丰富,遇到问题很容易找到解决方案
  • 服务拆分粒度更细,耦合度比较低,有利于资源重复利用,有利于提高开发效率
  • 可以更精准的制定优化服务方案,提高系统的可维护性
  • 减轻团队的成本,可以并行开发,不用关注其他人怎么开发,先关注自己的开发
  • 微服务可以是跨平台的,可以用任何一种语言开发
  • 适于互联网时代,产品迭代周期更短

    缺点
  • 微服务过多,治理成本高,不利于维护系统
  • 分布式系统开发的成本高(容错,分布式事务等)对团队挑战大
  • 总的来说优点大过于缺点,目前看来Spring Cloud是一套非常完善的分布式框架,目前很多企业开始用微服务、Spring Cloud的优势是显而易见的。因此对于想研究微服务架构的同学来说,学习Spring Cloud是一个不错的选择。

什么是SpringCloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

SpringCloud主要项目

Spring Cloud Config

  • Config能够管理所有微服务的配置文件
  • 集中配置管理工具,分布式系统中统一的外部配置管理,默认使用Git来存储配置,可以支持客户端配置的刷新及加密、解密操作

Spring Cloud Netflix

Netflix OSS 开源组件集成,包括Eureka、Hystrix、Ribbon、Feign、Zuul等核心组件。

  • Eureka:服务治理组件,包括服务端的注册中心和客户端的服务发现机制;
  • Ribbon:负载均衡的服务调用组件,具有多种负载均衡调用策略;
  • Hystrix:服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力;
  • Feign:基于Ribbon和Hystrix的声明式服务调用组件;
  • Zuul:API网关组件,对请求提供路由及过滤功能。

Spring Cloud Bus

  • 用于传播集群状态变化的消息总线,使用轻量级消息代理链接分布式系统中的节点,可以用来动态刷新集群中的服务配置信息。
  • 简单来说就是修改了配置文件,发送一次请求,所有客户端便会重新读取配置文件。

Spring Cloud Security

SpringBoot和SpringCloud的区别?

1.SpringBoot专注于快速方便的开发单个个体微服务。
2.SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并且管理起来,为各个服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、精选决策、分布式会话等集成服务。
3.SpringBoot可以离开SpringCloud独立开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。
4.SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

Spring Cloud Security

  • Spring Security是一套提供了完整的声明式安全访问控制的解决方案。
  • Spring Security是基于Spring AOP和Servlet过滤器的,它只能服务基于Spring的应用程序。
  • 核心概念

    1. Principal:代表用户的对象Principal,不仅指人类,还包括一切可以用于验证的设备。
    2. Authority:代表用户的角色Authority,每个用户都应该有一种角色(eg: 管理员或会员)。
    3. Permission:代表授权,需要对角色的权限进行表述。
  • 安全方案的实现通常分为认证(Authentication)和授权(Authorization)两部分。
  • Spring Security进行认证的步骤:

    1. 用户使用用户名和密码登陆
    2. 过滤器(UsernamePasswordAuthenticationFilter)获取到用户名和密码,将它们封装成Authentication
    3. AuthenticationManager认证Token(由Authentication实现类传递)
    4. AuthenticationManager认证成功,返回一个封装了用户权限信息的Authentication对象,包含用户的上下文信息(角色列表)
    5. 将Authentication对象赋值给当前的SecurityContext,建立这个用户的安全上下文(SecurityContextHolder.getContext.setAuthentication())
    6. 当用户进行一些受到访问控制机制保护的操作,访问控制机制会依据当前安全的上下文信息来检查这个操作所需的权限

SpringCloud 和 dubbo的区别?

  1. 服务调用方式: dubbo是RPC,而SpringCloud是rest api
  2. 注册中心:dubbo是zookeeper,springcloud默认是eureka,当然也可能替换为zookeeper
  3. 服务网关:dubbo本身没有实现服务网关,只能通过其他第三方激素整合。而springcloud又zuul路由网关,作为路由服务器,进行消费者的请求分发,springcould支持断路器,与git完美继承配置文件支持版本控制,事务总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素。

SpringCloud由什么组成?

  • Spring Cloud Eureka:服务注册与发现
  • Spring Cloud Zuul:服务网关
  • Spring Cloud Ribbon:客户端负载均衡
  • Spring Cloud Feign:声明性的Web服务客户端
  • Spring Cloud Hystrix:断路器
  • Spring Cloud Config:分布式统一配置管理
    等等

使用 Spring Boot 开发分布式微服务时,我们面临什么问题

  1. 与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。
  2. 服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
  3. 冗余-分布式系统中的冗余问题。
  4. 负载平衡 --负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机 集群,网络链路,中央处理单元,或磁盘驱动器的分布。
  5. 性能-问题 由于各种运营开销导致的性能问题。
  6. 部署复杂性-Devops 技能的要求。

Spring Cloud 和dubbo区别?

  1. springcloud 不是一个开发框架,而是一整套的解决方案,而 dubbo 仅仅是一个 rpc 的框架。
  2. dubbo 采用的是传输层 tcp 协议,是二进制传输的,占用带宽较少,序列化采用的是 jdk 自带的序列化协议。springcloud 是应用层 http 协议,占用带宽比较多,同时 springcloud 采用的是 json 报文传输,消耗会比较大。
  3. dubbo 调用使用的是长链接,适合传输数据量小的包,而对于 springcloud 是短连接,适合传输大数据量的信息,比如图片、文本之类的。
  4. dubbo 开发需要依赖 jar 包,对依赖的管理比较复杂。springcloud 的接口协议比较松散,约束性不强。
  5. 服务调用方式:dubbo是RPC springcloud Rest Api
  6. 注册中心使用的不同,dubbo 默认使用的是 zk, 而 springcloud 使用的注册中心为 eureka, 前者保证的是 cp ,而后者保证的是 ap, 但是随着 springcloud alibaba 的出现,又引入了 nacos 这样的神器,兼有注册中心和配置中心的功能。

服务注册和发现是什么意思?SpringCloud如何实现?

可以知道,随着服务的越来越多,越来越杂,服务之间的调用会越来越复杂,越来越难以管理。而当某个服务发生了变化,或者由于压力性能问题,多部署了几台服务,怎么让服务的消费者知晓变化,就显得很重要了。不然就会存在调用的服务其实已经下线了,但调用者不知道等异常情况。

这个时候有个服务组件去统一治理就相当重要了。简单来说,一个服务治理组件应该具备以下几个功能:

  • 服务注册表
    服务治理组件的核心,它用来记录各个微服务的信息,比如说微服务的名称、IP、端口等。服务注册组件提供查询API和管理API,查询API用来查询可用的微服务实例,管理API用于服务的注册和注销。
  • 服务注册与发现
    服务注册是指微服务在启动时,将自己的信息注册到服务治理组件上的过程。
    服务发现是指查询可用微服务列表及其网络地址的机制。
  • 服务检查
    服务治理组件使用一定机制定时检测已注册的服务,是否在线,或者是否无法连接等,若发现无法访问,就会从服务注册表中移除该实例,进行下线操作。

https://www.cnblogs.com/okong...

Eureka

什么是Eureka

Eureka作为SpringCloud的服务注册功能服务器,他是服务注册中心,系统中的其他服务使用Eureka的客户端将其连接到Eureka Service中,并且保持心跳,这样工作人员可以通过Eureka Service来监控各个微服务是否运行正常。

Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。

Eureka有三部分组成

+ Service Provider: 暴露服务的提供方。
+ Service Consumer:调用远程服务的服务消费方。
+ EureKa Server: 服务注册中心和服务发现中心

Eureka怎么实现高可用

集群: 注册多台Eureka,然后把SpringCloud服务互相注册,客户端从Eureka获取信息时,按
照Eureka的顺序来访问。

什么是Eureka的自我保护模式

默认情况下,如果Eureka Server在一定时间内(默认 90 秒,其实不止 90 秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。

DiscoveryClient的作用

可以从注册中心中根据服务别名获取注册的服务器信息。

什么是微服务架构

微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微服务
运行在自己的进程中,并使用轻量级的机制通信。这些服务围绕业务能力来划分,并通过自动化部
署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限度的集中式管
理。

为什么需要学习SpringCloud

  • 随着我们应用业务逐渐变得复杂,传统的单体式架构已经不满足我们的日常开发了。这个时候我们就需要从传统的单体架构转变为微服务式的架构模式。
  • 传统的单体式架构,在业务越来越复杂,代码量越来越多的时候。会导致管理越来越困难,代码结构的越来越混乱。同时,这也会给业务的快速迭代带来巨大挑战;
  • 开发效率变低:开发人员同时开发一套代码,很难避免代码冲突。开发过程会伴随着不断解决冲突的过程,这会严重的影响开发效率;
    排查解决问题成本高:线上业务发现 bug,修复 bug 的过程可能很简单。但是,由于只有一套代码,需要重新编译、打包、上线,成本很高。
  • 由于单体结构的应用随着系统复杂度的增高,会暴露出各种各样的问题。近些年来,微服务架构逐渐取代了单体架构,且这种趋势将会越来越流行。Spring Cloud是目前最常用的微服务开发框架,已经在企业级开发中大量的应用。

SpringCloud的优缺点

优点
  • 产出于Spring大家族,Spring在企业级开发框架中无人能敌,来头很大,可以保证后续的更新、完善
  • 轻轻松松几行代码,注解或者配置就完成了熔断、负载均衡、注册中心的各种平台功能
  • Spring Cloud 社区活跃度很高,教程很丰富,遇到问题很容易找到解决方案
  • 服务拆分粒度更细,耦合度比较低,有利于资源重复利用,有利于提高开发效率
  • 可以更精准的制定优化服务方案,提高系统的可维护性
  • 减轻团队的成本,可以并行开发,不用关注其他人怎么开发,先关注自己的开发
  • 微服务可以是跨平台的,可以用任何一种语言开发
  • 适于互联网时代,产品迭代周期更短

    缺点
  • 微服务过多,治理成本高,不利于维护系统
  • 分布式系统开发的成本高(容错,分布式事务等)对团队挑战大
  • 总的来说优点大过于缺点,目前看来Spring Cloud是一套非常完善的分布式框架,目前很多企业开始用微服务、Spring Cloud的优势是显而易见的。因此对于想研究微服务架构的同学来说,学习Spring Cloud是一个不错的选择。

什么是SpringCloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

SpringBoot和SpringCloud的区别?

1.SpringBoot专注于快速方便的开发单个个体微服务。
2.SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并且管理起来,为各个服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、精选决策、分布式会话等集成服务。
3.SpringBoot可以离开SpringCloud独立开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。
4.SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

SpringCloud 和 dubbo的区别?

  1. 服务调用方式: dubbo是RPC,而SpringCloud是rest api
  2. 注册中心:dubbo是zookeeper,springcloud默认是eureka,当然也可能替换为zookeeper
  3. 服务网关:dubbo本身没有实现服务网关,只能通过其他第三方激素整合。而springcloud又zuul路由网关,作为路由服务器,进行消费者的请求分发,springcould支持断路器,与git完美继承配置文件支持版本控制,事务总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素。

SpringCloud由什么组成?

  • Spring Cloud Eureka:服务注册与发现
  • Spring Cloud Zuul:服务网关
  • Spring Cloud Ribbon:客户端负载均衡
  • Spring Cloud Feign:声明性的Web服务客户端
  • Spring Cloud Hystrix:断路器
  • Spring Cloud Config:分布式统一配置管理
    等等

使用 Spring Boot 开发分布式微服务时,我们面临什么问题

  1. 与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。
  2. 服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
  3. 冗余-分布式系统中的冗余问题。
  4. 负载平衡 --负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机 集群,网络链路,中央处理单元,或磁盘驱动器的分布。
  5. 性能-问题 由于各种运营开销导致的性能问题。
  6. 部署复杂性-Devops 技能的要求。

Spring Cloud 和dubbo区别?

  1. springcloud 不是一个开发框架,而是一整套的解决方案,而 dubbo 仅仅是一个 rpc 的框架。
  2. dubbo 采用的是传输层 tcp 协议,是二进制传输的,占用带宽较少,序列化采用的是 jdk 自带的序列化协议。springcloud 是应用层 http 协议,占用带宽比较多,同时 springcloud 采用的是 json 报文传输,消耗会比较大。
  3. dubbo 调用使用的是长链接,适合传输数据量小的包,而对于 springcloud 是短连接,适合传输大数据量的信息,比如图片、文本之类的。
  4. dubbo 开发需要依赖 jar 包,对依赖的管理比较复杂。springcloud 的接口协议比较松散,约束性不强。
  5. 服务调用方式:dubbo是RPC springcloud Rest Api
  6. 注册中心使用的不同,dubbo 默认使用的是 zk, 而 springcloud 使用的注册中心为 eureka, 前者保证的是 cp ,而后者保证的是 ap, 但是随着 springcloud alibaba 的出现,又引入了 nacos 这样的神器,兼有注册中心和配置中心的功能。

服务注册和发现是什么意思?SpringCloud如何实现?

可以知道,随着服务的越来越多,越来越杂,服务之间的调用会越来越复杂,越来越难以管理。而当某个服务发生了变化,或者由于压力性能问题,多部署了几台服务,怎么让服务的消费者知晓变化,就显得很重要了。不然就会存在调用的服务其实已经下线了,但调用者不知道等异常情况。

这个时候有个服务组件去统一治理就相当重要了。简单来说,一个服务治理组件应该具备以下几个功能:

  • 服务注册表
    服务治理组件的核心,它用来记录各个微服务的信息,比如说微服务的名称、IP、端口等。服务注册组件提供查询API和管理API,查询API用来查询可用的微服务实例,管理API用于服务的注册和注销。
  • 服务注册与发现
    服务注册是指微服务在启动时,将自己的信息注册到服务治理组件上的过程。
    服务发现是指查询可用微服务列表及其网络地址的机制。
  • 服务检查
    服务治理组件使用一定机制定时检测已注册的服务,是否在线,或者是否无法连接等,若发现无法访问,就会从服务注册表中移除该实例,进行下线操作。

https://www.cnblogs.com/okong...

什么是Eureka

Eureka作为SpringCloud的服务注册功能服务器,他是服务注册中心,系统中的其他服务使用Eureka的客户端将其连接到Eureka Service中,并且保持心跳,这样工作人员可以通过Eureka Service来监控各个微服务是否运行正常。

Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。

Eureka有三部分组成

+ Service Provider: 暴露服务的提供方。
+ Service Consumer:调用远程服务的服务消费方。
+ EureKa Server: 服务注册中心和服务发现中心

Eureka怎么实现高可用

集群: 注册多台Eureka,然后把SpringCloud服务互相注册,客户端从Eureka获取信息时,按
照Eureka的顺序来访问。

什么是Eureka的自我保护模式

默认情况下,如果Eureka Server在一定时间内(默认 90 秒,其实不止 90 秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。

DiscoveryClient的作用

可以从注册中心中根据服务别名获取注册的服务器信息。

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

  1. ZooKeeper中的节点服务挂了就要选举 在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的, 选举就是改微服务做了集群,必须有一台主其他的都是从
  2. Eureka各个节点是平等关系,服务器挂了没关系,只要有一台Eureka就可以保证服务可用,数据都是最新的。 如果查询到的数据并不是最新的,就是因为Eureka的自我保护模式导致的
  3. Eureka本质上是一个工程,而Zookeeper只是一个进程
  4. Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像Zookeeper一样是的整个注册系统瘫痪。
  5. Zookeeper保证是CP,而Eureka保证的是AP。

    CAP原则:

    C:一致性;A:可用性;P:分区容错性

Zuul

什么是网关

网关相当于一个网络服务架构的入口,所有网络请求必须通过网关转发到具体的服务。

网关的作用是什么?

统一管理微服务请求,权限控制、负载均衡、路由转发、监控、安全控制黑名单和白名单等等。

什么是Spring Cloud Zuul(服务网关)

Zuul是从设备和网络到后端应用程序所有请求的后门,为内部服务提供可配置的对外URL到服务的映射关系,基于JVM的后端路由器。具有以下的功能:

  • 认证与授权
  • 压力测试
  • 金丝雀测试
  • 动态路由
  • 负载削减
  • 静态相应处理
  • 主动流量管理
    其底层是基于Servlet,本质就是一系列的Filter所构成的责任链。

网关与过滤器有什么区别

网关是对所有服务的请求进行分析过滤,而过滤器只是对单个服务的分析过滤。

常用网关框架有那些?

Nginx、Zuul、Gatewa

Zuul与Nginx有什么区别?

相同点
  1. Zuul和Nginx都可以实现负载均衡、反向代理(隐藏真实ip地址)

    不同点
  2. 所采用的编程语言不同:Nginx采用C语言开发的,而Zuul是采用Java语言开发的
  3. 负载均衡实现方式不同:Zuul采用ribbon+eureka实现本地负载均衡,而Nginx采用服务器实现负载均衡
  4. 所适合应用的领域不同:Nginx适合于服务器端负载均衡,Zuul适合微服务中实现网关
  5. Nginx相比zuul功能会更加强大,因为Nginx整合一些脚本语言(Nginx+lua)

既然Nginx可以实现网关?为什么还需要使用Zuul框架

Zuul是SpringCloud集成的网关,使用Java语言编写,可以对SpringCloud架构提供更灵活的服
务。

如何设计一套API接口

考虑到API接口的分类可以将API接口分为开发API接口和内网API接口

  • 内网API接口用于局域网,为内部服务器提供服务。
  • 开放API接口用于对外部合作单位提供接口调用,需要遵循Oauth2.0权限认证协议。同时还需要考虑安全性、幂等性等问题。

ZuulFilter常用有那些方法

  • Run():过滤器的具体业务逻辑
  • shouldFilter():判断过滤器是否有效
  • filterOrder():过滤器执行顺序
  • filterType():过滤器拦截位置

如何实现动态Zuul网关路由转发

通过path配置拦截请求,通过ServiceId到配置中心获取转发的服务列表,Zuul内部使用Ribbon实现本地负载均衡和转发。

Zuul网关如何搭建集群

使用Nginx的upstream设置Zuul服务集群,通过location拦截请求并转发到upstream,默认使用轮询机制对Zuul集群发送请求。

Ribbon

负载平衡的意义什么?

负载均衡是一种基础的网络服务,主要是为了解决公司业务并发压力,加强网络处理能力,降低单台设备的资源压力,提升整体的服务性能。客户端的流量首先会到达负载均衡服务器,由负载均衡服务器通过一定的调度算法将流量分发到不同的应用服务器上面,同时负载均衡服务器也会对应用服务器做周期性的健康检查,当发现故障节点时便动态的将节点从应用服务器集群中剔除,以此来保证应用的高可用。

Ribbon是什么?

  • Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法
  • Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。简单的说,就是在配置文件中列出后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。(有点类似Nginx)

Nginx与Ribbon的区别

  • Nginx是反向代理同时可以实现负载均衡,nginx拦截客户端请求采用负载均衡策略根据upstream配置进行转发,相当于请求通过nginx服务器进行转发。
  • Ribbon是客户端负载均衡,从注册中心读取目标服务器信息,然后客户端采用轮询策略对服务直接访问,全程在客户端操作。

Ribbon底层实现原理

Ribbon使用discoveryClient从注册中心读取目标服务信息,对同一接口请求进行计数,使用%取余算法获取目标服务集群索引,返回获取到的目标服务信息。

@LoadBalanced注解的作用

开启客户端负载均衡。

Hystrix

什么是Hystrix

Hystrix 是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能保证一个依赖出问题的情况下,不会导致整个服务失败,避免级联故障,以提高分布式系统的弹性。

Hystrix防雪崩的四种方式

  1. 服务降级:接口调用失败就调用本地的方法返回一个空
  2. 服务熔断:接口调用失败就会进入调用接口提前定义好的一个熔断的方法,返回错误信息
  3. 服务隔离:隔离服务之间相互影响
  4. 服务监控:在服务发生调用时,会将每秒请求数、成功请求数等运行指标记录下来。

谈谈服务雪崩效应

雪崩效应是在大型互联网项目中,当某个服务发生宕机时,调用这个服务的其他服务也会发生宕机,大型项目的微服务之间的调用是互通的,这样就会将服务的不可用逐步扩大到各个其他服务中,从而使整个项目的服务宕机崩溃.

在微服务中,如何保护服务?

一般使用使用Hystrix框架,实现服务隔离来避免出现服务的雪崩效应,从而达到保护服务的效果。

服务雪崩效应产生的原因

  • 硬件故障
  • 程序Bug
  • 缓存击穿
  • 用户请求量过大

重试造成的流量加大的原因

  • 用户的频繁重试
  • 代码逻辑重试

解决服务雪崩问题方案

  • 增加硬件设施
  • 流量控制(网关限流,nignx限流,AOP限流,关闭程序重试)
  • 缓存(缓存预加载)
  • 服务的降级、服务的熔断

谈谈服务降级、熔断、服务隔离

  • 服务降级:当客户端请求服务器端的时候,防止客户端一直等待,不会处理业务逻辑代码,直接返回一个友好的提示给客户端。
  • 服务熔断:是在服务降级的基础上更直接的一种保护方式,当在一个统计时间范围内的请求失败数量达到设定值或当前的请求错误率达到设定的错误率阈值时开启断路,之后的请求直接走fallback方法,在设定时间(sleepWindowInMilliseconds)后尝试恢复。
  • 服务隔离:就是Hystrix为隔离的服务开启一个独立的线程池,这样在高并发的情况下不会影响其他服务。服务隔离有线程池和信号量两种实现方式,一般使用线程池方式。

服务降级底层是如何实现的?

Hystrix实现服务降级的功能是通过重写HystrixCommand中的getFallback()方法,当Hystrix的run方法或construct执行发生错误时转而执行getFallback()方法。

Feign

什么是Feign?

Feign 是一个声明web服务客户端,这使得编写web服务客户端更容易。他将我们需要调用的服务方法定义成抽象方法保存在本地就可以了,不需要自己构建Http请求了,直接调用接口就行了,不过要注意,调用方法要和本地抽象方法的签名完全一致。

SpringCloud有几种调用接口方式?

  1. Feign
  2. RestTemplate

Ribbon和Feign调用服务的区别

  1. Ribbon: 是一个基于 HTTP 和 TCP 客户端 的负载均衡的工具。它可以在客户端配置 RibbonServerList(服务端列表),使用 HttpClient 或 RestTemplate 模拟http请求,步骤相当繁琐。
  2. Feign 是在 Ribbon的基础上进行了一次改进,是一个使用起来更加方便的 HTTP 客户端。采用接口的方式,只需要创建一个接口,然后在上面添加注解即可 ,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求。然后就像是调用自身工程的方法调用,而感觉不到是调用远程方法,使得编写客户端变得非常容易。

Bus

什么是 Spring Cloud Bus?

  1. Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。
  2. Spring Clud Bus目前支持RabbitMQ和Kafka。
  3. Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。
  4. Spring Cloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当作微服务间的通信通道。

分布式配置中心有那些框架?

Apollo、zookeeper、springcloud config。

分布式配置中心的作用?

动态变更项目配置信息而不必重新部署项目。

Gateway

什么是Spring Cloud Gateway?

  • Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。
  • 使用了一个RouteLocatorBuilder的bean去创建路由,除了创建路由RouteLocatorBuilder可以让你添加各种predicates和filters,predicates断言的意思,顾名思义就是根据具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改。
阅读 319
15 声望
2 粉丝
0 条评论
15 声望
2 粉丝
宣传栏