原springcloud常见面试题

Posted wjqhuaxia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原springcloud常见面试题相关的知识,希望对你有一定的参考价值。

1.springcloud与dubbo的区别?

  https://jingyan.baidu.com/article/b0b63dbf3784294a483070fa.html

  1.1 springcloud与dubbo支持技术栈比较


技术图片

  1.2 springcloud和dubbo的最大区别:springcloud抛弃了dubbo的rpc通信,采用的是基于http的rest方式。

  1.3 springboot与dubbo就相当于品牌机与组装机的区别。

  1.4 springcloud与dubbo的社区活跃度对比。

  

二、整体比较

1、dubbo由于是二进制的传输,占用带宽会更少

2、springCloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大

3、dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决

4、springcloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级

5、dubbo的注册中心可以选择zk,redis等多种,springcloud的注册中心只能用eureka或者自研

 2.ribbon的负载均衡策略

  2.1 RoundRobinRule: 轮询策略,Ribbon以轮询的方式选择服务器,这个是默认值。所以示例中所启动的两个服务会被循环访问;

  2.2 RandomRule: 随机策略,也就是说Ribbon会随机从服务器列表中选择一个进行访问;

  2.3 BestAvailableRule: 最大可用策略,即先过滤出故障服务器后,选择一个当前并发请求数最小的;

  2.4 WeightedResponseTimeRule: 带有加权的轮询策略,对各个服务器响应时间进行加权处理,然后在采用轮询的方式来获取相应的服务器;

  2.5 AvailabilityFilteringRule: 可用过滤策略,先过滤出故障的或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个;

  2.6 ZoneAvoidanceRule: 区域感知策略,先使用主过滤条件(区域负载器,选择最优区域)对所有实例过滤并返回过滤后的实例清单,依次使用次过滤条件列表中的过滤条件对主过滤条件的结果进行过滤,判断最小过滤数(默认1)和最小过滤百分比(默认0),最后对满足条件的服务器则使用RoundRobinRule(轮询方式)选择一个服务器实例。

3.ribbon和feign的区别

  3.1 启动类使用的注解不同,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。

  3.2 服务的指定位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。

  3.3 调用方式不同Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。

  Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,

  不需要自己构建http请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。

4.ribbon、feign以及hystrix的超时、重试设置

  参考:https://blog.csdn.net/hsz2568952354/article/details/89508707

     https://blog.csdn.net/hsz2568952354/article/details/89466511

  4.1 ribbon的设置:

    默认是没有超时,需开启,把ribbon.http.client.enabled设置为true。开启后,而如果不配超时时间,默认超时时间是1秒,超时后默认会重试一次。

    做如下配置,以上配置最多会调用6次((MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1)),也就是最多会重试5次。

ribbon:
  ReadTimeout: 2000
  ConnectionTimeout: 2000
  OkToRetryOnAllOperations: true
  MaxAutoRetriesNextServer: 1 # 当前实例全部失败后可以换1个实例再重试
  MaxAutoRetries: 2 # 在当前实例只重试2次
  http:
    client:
      enabled: true

  4.2 feign设置

    feign默认的超时时间是1秒,重试1次。

  4.3 hystrix设置

    配置如下:

server:
  port: 8002

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:5000/eureka/
spring:
  application:
    name: service-hystrix
feign:
  hystrix:
    enabled: true # 开启
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 10000 # 断路器的超时时间需要大于ribbon的超时时间,不然重试没有意义
ribbon:
  ReadTimeout: 2000
  ConnectionTimeout: 2000
  OkToRetryOnAllOperations: true
  MaxAutoRetriesNextServer: 1
  MaxAutoRetries: 0

  当超时并且重试也超时时,会执行降级逻辑,而不会报错。这里,断路器的超时时间需要大于ribbon的超时时间,不然重试没有意义。比如将一下设置去掉(默认值是1秒)或设置较低。

  可以看到,第一次超时了并重试一次,第二次没有超时,但是页面已经显示error,执行降级逻辑,是因为远程调用的超时时间已经超过了断路器的超时时间,意思是第一次还没执行完就已经执行降级逻辑返回,虽然后台还在重试。

 

 

以上是关于原springcloud常见面试题的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud常见面试题(2020最新版)

182期SpringCloud常见面试题(2020最新版)

开启springcloud全家桶:springcloud常见面试题

几个SpringCloud常见面试题及答案

谈谈几个SpringCloud常见面试题及答案

122期谈谈几个SpringCloud常见面试题及答案