分布式面试 - 如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?

面试题

如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?

面试官心理分析

服务治理,这个问题如果问你,其实就是看看你有没有服务治理的思想,因为这个是做过复杂微服务的人肯定会遇到的一个问题。

服务降级,这个是涉及到复杂分布式系统中必备的一个话题,因为分布式系统互相来回调用,任何一个系统故障了,你不降级,直接就全盘崩溃?那就太坑爹了吧。

失败重试,分布式系统中网络请求如此频繁,要是因为网络问题不小心失败了一次,是不是要重试?

超时重试,同上,如果不小心网络慢一点,超时了,如何重试?

面试题剖析

服务治理

1. 调用链路自动生成

一个大型的分布式系统,或者说是用现在流行的微服务架构来说吧,分布式系统由大量的服务组成。那么这些服务之间互相是如何调用的?调用链路是啥?说实话,几乎到后面没人搞的清楚了,因为服务实在太多了,可能几百个甚至几千个服务。

那就需要基于 dubbo 做的分布式系统中,对各个服务之间的调用自动记录下来,然后自动将各个服务之间的依赖关系和调用链路生成出来,做成一张图,显示出来,大家才可以看到对吧。

2. 服务访问压力以及时长统计

需要自动统计各个接口和服务之间的调用次数以及访问延时,而且要分成两个级别。

  • 一个级别是接口粒度,就是每个服务的每个接口每天被调用多少次,TP50/TP90/TP99,三个档次的请求延时分别是多少;
  • 第二个级别是从源头入口开始,一个完整的请求链路经过几十个服务之后,完成一次请求,每天全链路走多少次,全链路请求延时的 TP50/TP90/TP99,分别是多少。

这些东西都搞定了之后,后面才可以来看当前系统的压力主要在哪里,如何来扩容和优化啊。

3. 其它

  • 服务分层(避免循环依赖)
  • 调用链路失败监控和报警
  • 服务鉴权
  • 每个服务的可用性的监控(接口调用成功率?几个9?99.99%,99.9%,99%。)

服务降级

比如说服务 A调用服务 B,结果服务 B 挂掉了,服务 A 重试几次调用服务 B,还是不行,那么直接降级,走一个备用的逻辑,给用户返回响应。

举个栗子,我们有接口 HelloServiceHelloServiceImpl 有该接口的具体实现。

public interface HelloService {void sayHello();}public class HelloServiceImpl implements HelloService {public void sayHello() {System.out.println("hello world......");}}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><dubbo:application name="dubbo-provider" /><dubbo:registry address="zookeeper://127.0.0.1:2181" /><dubbo:protocol name="dubbo" port="20880" /><dubbo:service interface="com.zhss.service.HelloService" ref="helloServiceImpl" timeout="10000" /><bean id="helloServiceImpl" class="com.zhss.service.HelloServiceImpl" /></beans><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><dubbo:application name="dubbo-consumer"  /><dubbo:registry address="zookeeper://127.0.0.1:2181" /><dubbo:reference id="fooService" interface="com.test.service.FooService"  timeout="10000" check="false" mock="return null"></dubbo:reference></beans>

我们调用接口失败的时候,可以通过 mock 统一返回 null。

mock 的值也可以修改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规则是 “接口名称+Mock” 后缀。然后在 Mock 类里实现自己的降级逻辑。

public class HelloServiceMock implements HelloService {public void sayHello() {// 降级逻辑}
}

失败重试和超时重试

所谓失败重试,就是 consumer 调用 provider 要是失败了,比如抛异常了,此时应该是可以重试的,或者调用超时了也可以重试。配置如下:

<dubbo:reference id="xxxx" interface="xx" check="true" async="false" retries="3" timeout="2000"/>

举个栗子。

某个服务的接口,要耗费 5s,你这边不能干等着,你这边配置了 timeout 之后,我等待 2s,还没返回,我直接就撤了,不能干等你。

可以结合你们公司具体的场景来说说你是怎么设置这些参数的:

  • timeout:一般设置为 200ms,我们认为不能超过 200ms 还没返回。
  • retries:设置 retries,一般是在读请求的时候,比如你要查询个数据,你可以设置个 retries,如果第一次没读到,报错,重试指定的次数,尝试再次读取。

转载来源:https://github.com/doocs/advanced-java/blob/master/docs/distributed-system/dubbo-service-management.md

分布式面试 - 如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?相关推荐

  1. 面试系列26 如何基于dubbo进行服务治理、服务降级、失败重试以及超时重试

    (1)服务治理 1)调用链路自动生成 一个大型的分布式系统,或者说是用现在流行的微服务架构来说吧,分布式系统由大量的服务组成.那么这些服务之间互相是如何调用的?调用链路是啥?说实话,几乎到后面没人搞的 ...

  2. dubbo k8s 服务发现_工商银行基于 Dubbo 构建金融微服务架构的实践-服务发现篇

    作者 | 张远征来源|阿里巴巴云原生公众号 导读:Dubbo 作为分布式微服务框架,众多公司在实践中基于 Dubbo 进行分布式系统架构.重启开源后,我们不仅看到 Dubbo 3.0 最新的 Road ...

  3. 浅谈RPC服务治理服务

    面向服务的架构SOA 任何大型网站的发展都伴随着网站架构的演进.网站架构一般最初是单应用设计,然后逐渐经历面向对象设计和模块化设计的架构,最终发展到面向服务的服务化架构.在单应用设计架构体系当中,我们 ...

  4. 微服务架构 — 服务治理 — 服务注册与发现、服务订阅与通知

    目录 文章目录 目录 应用与服务的关系 服务注册与发现(Service Registration and Discovery) Service Registration Service Registr ...

  5. 微服务架构 — 服务治理 — 服务限流、服务降级、服务熔断

    目录 文章目录 目录 服务限流 服务降级 服务熔断 服务限流 C ⇄ S 的异常问题:C 的请求太多,超出 S 的服务能力,导致 S 不可用.例如:DoS 攻击,企图耗尽被攻击对象的资源,让目标系统无 ...

  6. 微服务架构 — 服务治理 — 服务监控与告警、服务日志与审计

    目录 文章目录 目录 日志与审计 监控与告警 配置中心 文档中心 日志与审计 日志分析组件应该在微服务兴起之前就被广泛使用了.即使单体应用架构,当访问数变大.或服务器规模增多时,日志文件的大小会膨胀到 ...

  7. 微服务架构 — 服务治理 — 服务调用链可视化

    微服务架构所面临的问题 微服务架构中,服务之间会有错综复杂的依赖关系,例如:一个前端请求一般会依赖于多个后端服务,称为 "1=>N 扇出".在实际生产环境中,服务往往不是百分 ...

  8. 分布式服务框架原理与实践pdf_深度解析微服务治理的技术演进和架构实践

    为什么需要服务治理? 第一.业务需求 随着业务的发展,服务越来越多,如何协调线上运行的各个服务,保障服务的SLA,对服务架构和运维人员是一个很大的挑战.随着业务规模的不断扩大,小服务资源浪费等问题逐渐 ...

  9. eureka hostname作用_springcloud使用Eureka实现服务治理替代dubbo加zookeeper

    使用Eureka实现服务治理 作用:实现服务治理(服务注册与发现) 简介: Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块.而Spring Clo ...

最新文章

  1. JNI的native代码中打印日志到eclipse的logcat中
  2. python list合并拼接
  3. 成功解决 bs4\__init__.py:219: UserWarning: b'.' looks like a filename, not markup. You should probably
  4. 数据结构与算法—栈详解
  5. linux怎么删除mysql用户和组_linux下在mysql数据库中创建和删除用户
  6. 99%的数据中心都会面临的痛点,现在终于有好的解决方案了!
  7. Java 运算符及优先级
  8. CWinThread
  9. 程序员面试金典 - 面试题 04.04. 检查平衡性(二叉树高度)
  10. 开源压缩算法brotli_Google的Brotli压缩算法,C ++核心准则以及更多新闻
  11. number2chinese php,php 数字转换为中文
  12. 图解TCPIP-传输层 UDP报文格式
  13. java bean参数清空_给bean的属性赋值
  14. linux远程桌面密钥,使用 SSH 密钥连接到 Linux VM - Azure Virtual Machines | Microsoft Docs...
  15. NoWritableEnvsDirError: No writeable envs directories configured.
  16. 怎么样对阿里云ECS主机进行绑定域名
  17. java模拟键盘输入中文_Appium+java 模拟键盘输入
  18. 使用Tensorflow Object Detection API对集装箱号进行OCR识别
  19. 两位数的加减乘除计算器
  20. 毕业生之瞳——《技术之瞳——叩开阿里之门之在线笔试》

热门文章

  1. Shopify:管理一个顶级域名绑定shopify网店
  2. WordPress: 通过数据库(phpMyAdmin)添加admin用户
  3. LeetCode 167. Two Sum II - Input array is sorted
  4. 谷歌上线数据搜索引擎 Dataset Search
  5. MySQL—设置数据库(库、表等)不区分大小写
  6. 大连印象_2010暑期实训有感【一】
  7. mysql 连接查询 子查询 备份 笔记
  8. 媒体控件的暂停与播放 0130 winform
  9. 爬虫-14-利用代理爬取数据
  10. dj鲜生-通过邮箱发送加密的激活链接