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. 二、整体比较
  2.  
  3. 1dubbo由于是二进制的传输,占用带宽会更少
  4.  
  5. 2springCloudhttp协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大
  6.  
  7. 3dubbo的开发难度较大,原因是dubbojar包依赖问题很多大型工程无法解决
  8.  
  9. 4springcloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级
  10.  
  11. 5dubbo的注册中心可以选择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次。

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

  4.2 feign设置

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

  4.3 hystrix设置

    配置如下:

  1. server:
  2. port: 8002
  3.  
  4. eureka:
  5. client:
  6. serviceUrl:
  7. defaultZone: http://localhost:5000/eureka/
  8. spring:
  9. application:
  10. name: service-hystrix
  11. feign:
  12. hystrix:
  13. enabled: true # 开启
  14. hystrix:
  15. command:
  16. default:
  17. execution:
  18. isolation:
  19. thread:
  20. timeoutInMilliseconds: 10000 # 断路器的超时时间需要大于ribbon的超时时间,不然重试没有意义
  21. ribbon:
  22. ReadTimeout: 2000
  23. ConnectionTimeout: 2000
  24. OkToRetryOnAllOperations: true
  25. MaxAutoRetriesNextServer: 1
  26. MaxAutoRetries: 0

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

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

5.hystrix的隔离策略

  5.1 隔离策略有两种:

    线程隔离、信号量隔离。

  5.2 隔离策略的区别

    详见:https://blog.csdn.net/dengqiang123456/article/details/75935122

6.hystrix功能实现的具体方式

  6.1 服务降级,设置超时时间

  6.2 服务限流,通过隔离策略进行限流按制。

  6.3 服务熔断:

    6.3.1 熔断的三种状态:

  1. 正常状态下,电路处于关闭状态(Closed),如果调用持续出错或者超时,电路被打开进入熔断状态(Open),后续一段时间内的所有调用都会被拒绝(Fail Fast),
    这个拒绝时间withCircuitBreakerSleepWindowInMilliseconds控制默认是5s
  2. 一段时间以后,保护器会尝试进入半熔断状态(Half-Open),允许少量请求进来尝试,如果调用仍然失败,则回到熔断状态,如果调用成功,则回到电路闭合状态;

断路器

(1)hystrix.command.default.circuitBreaker.requestVolumeThreshold(当在配置时间窗口内达到此数量的失败后,进行短路。默认20个)

    For example, if the value is 20, then if only 19 requests are received in the rolling window (say a window of 10 seconds) the circuit will not trip open even if all 19 failed.

    简言之,10s内请求失败数量达到20个,断路器开。

(2)hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds(短路多久以后开始尝试是否恢复,默认5s)

(3)hystrix.command.default.circuitBreaker.errorThresholdPercentage(出错百分比阈值,当达到此阈值后,开始短路。默认50%)
    6.3.2 熔断机制简述:

  1. 当出现问题时,Hystrix会检查一个一定时长(图中为10s)的一个时间窗(window),在这个时间窗内是否有足够多的请求,如果有足够多的请求,是否错误率已经达到阈值,
    如果达到则启动断路器熔断机制,这时再有请求过来就会直接到fallback路径。在断路器打开之后,
    会有一个sleep window(图中为5s),每经过一个sleep window,当有请求过来的时候,断路器会放掉一个请求给remote 服务,
    让它去试探下游服务是否已经恢复,如果成功,断路器会恢复到正常状态,让后续请求重新请求到remote 服务,否则,保持熔断状态。

  参考自:https://www.cnblogs.com/amazement/p/8445294.html

      https://www.jianshu.com/p/6e9619cbdfc3?tdsourcetag=s_pctim_aiomsg

      https://blog.csdn.net/tongtong_use/article/details/78611225

7.项目中zuul常用的功能

  7.1 提供动态路由

  7.2 提供安全、鉴权处理

  7.3 跨域处理

  7.4 全局动态路由的hystrix(熔断、降级、限流)处理

【springcloud】常见面试题总结的更多相关文章

  1. 小D课堂 - 新版本微服务springcloud+Docker教程_3-03CAP原理、常见面试题

    笔记 3.分布式系统CAP原理常见面试题和注册中心选择         简介:讲解CAP原则在面试中回答和注册中心选择 C A 满足的情况下,P不能满足的原因:             数据同步(C) ...

  2. JAVA常见面试题问题简述(持续更新中)

    JAVA常见面试题问题简述 1. springcloud和dubbo的区别 ①相比之下springcloud 的社区会更加活跃,解决问题的速度也会越来越快,dubbo相对来说如果碰到没有解决的问题,就 ...

  3. java常见面试题及答案 1-10(基础篇)

    java常见面试题及答案 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程.Java 源文件被 ...

  4. Web开发的常见面试题HTML和HTML5等

    作为一名前端开发人员,HTML,HTML5以及网站优化都是必须掌握的技术,下面列举一下HTML, HTML5, 网站优化等常见的面试题: HTML常见面试题: 1. 什么是Semantic HTML( ...

  5. 常见面试题之ListView的复用及如何优化

    经常有人问我,作为刚毕业的要去面试,关于安卓开发的问题,技术面试官会经常问哪些问题呢?我想来想去不能一股脑的全写出来,我准备把这些问题单独拿出来写,并详细的分析一下,这样对于初学者是最有帮助的.这次的 ...

  6. iOS常见面试题汇总

    iOS常见面试题汇总 1. 什么是 ARC? (ARC 是为了解决什么问题而诞生的?) ARC 是 Automatic Reference Counting 的缩写, 即自动引用计数. 这是苹果在 i ...

  7. JDBC常见面试题

    以下我是归纳的JDBC知识点图: 图上的知识点都可以在我其他的文章内找到相应内容. JDBC常见面试题 JDBC操作数据库的步骤 ? JDBC操作数据库的步骤 ? 注册数据库驱动. 建立数据库连接. ...

  8. Mybatis常见面试题

    Mybatis常见面试题 #{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是 ...

  9. JavaSE:数据类型之间的转换(附常见面试题)

    数据类型之间的转换 分为以下几种情况: 1)低级到高级的自动类型转换: 2)高级到低级的强制类型转换(会导致溢出或丢失精度): 3)基本类型向类类型转换: 4)基本类型向字符串的转换: 5)类类型向字 ...

  10. 整理的最全 python常见面试题(基本必考)

    整理的最全 python常见面试题(基本必考) python 2018-05-17 作者 大蛇王 1.大数据的文件读取 ① 利用生成器generator ②迭代器进行迭代遍历:for line in ...

随机推荐

  1. navicate for mysql命令中输入中文报错

    insert into xsxx(name,xb) values('李四','男') 错误提示: [SQL]insert into xsxx3(name,xb) values('李四','男') [E ...

  2. Day12 抽象类、接口、内部类-面向对象编程(3)

    抽象类 abstract修饰符可以用来修饰方法也可以用来修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类: 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类. ...

  3. PphpStorm常用操作整理

    本地修改记录:在项目名称上右键,点击Local History | Show History.你可以看到项目文件各个历史版本:Alt+Shift+C,可以看到项目最近的修改.这就是它的版本集成功能特性 ...

  4. 如何反编译Python写的exe到py

    参考链接: https://blog.csdn.net/qq_44198436/article/details/97314626?depth_1-utm_source=distribute.pc_re ...

  5. linux 之awk 次数统计

    sort +awk+uniq 统计文件中出现次数 jps -v |grep jar|grep -v Jps|awk  'BEGIN{FS=".jar "} {print $1}'  ...

  6. solr(CVE-2019-0193)远程命令执行

    影响版本 Apache Solr < 8.2.0 并且开启了DataImportHandler模块(默认情况下该模块不被启用) 安装 重启daoker  更新配置文件 systemctl dae ...

  7. 博主从零开始学习HTML(入门基础)

    目录 从零开始学习HTML(入门基础) 互联网三大基石 HTML的Head标签中的常用元素 字体格式化标签 字符实体,以下写最常用的几个 html常用标签及解析 a标签 img标签 媒体标签audio ...

  8. Java 反射(一)反射简介、原理和应用场景

    目录 一.动态语言和动态语言的比较 动态语言 静态语言 二.反射 简介 反射的常见使用 1. 代码编辑器 2. Spring等框架的IoC容器 3. 和注解的配合使用 原理 反射优缺点 调试查看 Cl ...

  9. K8S为什么要弃用Docker?Dockershim将移除

    一.背景由于最近知道了 K8s 新版本(v1.20)确定弃用 Docker 的消息,为了明确是否会对现有系统架构产生响,所以对涉及到的相关技术进行了一定的梳理(索性的是对现有的系统架构基本无影响:&g ...

  10. Golang中如何正确的使用sarama包操作Kafka?

    Golang中如何正确的使用sarama包操作Kafka? 一.背景 在一些业务系统中,模块之间通过引入Kafka解藕,拿IM举例(图来源): 用户A给B发送消息,msg_gateway收到消息后,投 ...