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

作者: Dubbo开发者

面试官心理分析

服务治理,这个问题如果问你,其实就是看看你有没有服务治理的思想,因为这个是做过复杂微服务的人肯定会遇到的一个问题。 服务降级,这个是涉及到复杂分布式系统中必备的一个话题,因为分布式系统互相来回调用,任何一个系统故障了,你不降级,直接就全盘崩溃?那就太坑爹了吧。 失败重试,分布式系统中网络请求如此频繁,要是因为网络问题不小心失败了一次,是不是要重试? 超时重试,跟上面一样,如果不小心网络慢一点,超时了,如何重试?

面试题剖析

服务治理

1. 调用链路自动生成

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

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

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,如果第一次没读到,报错,重试指定的次数,尝试再次读取。

更多推荐

更多
  • ||运算你真的了解吗? ||运算你真的了解吗?,或运算介绍,总结,通过如上逻辑关系图,文章列表,高效读书,实用阅读指南,面试官:你说说ReentrantLock和Synchronized区别
  • 什么是域名? ,什么是域名?,,背景,域名,访问 B 站的栗子,通过 IP 访问网站,顶级域名、一级域名、二级域名,顶级域名,子区域,二级区域,常见的 www 开头的网站,指向服务器 IP 地址,为什么都喜欢取 www?,总结,,所以要重新看看 *
  • 详解 Session 和 Cookie ,详解 Session 和 Cookie,,前提,为什么要用Session和Cookie?,背景一:动态网页的出现,背景二:HTTP是无状态协议,举栗子:百度,Seesion和Cookie的诞生,Session,Cookie,浏览器中看
  • 软件测试52讲 读书笔记 互联网产品的测试策略 ,《软件测试52讲》读书笔记 —— 互联网产品的测试策略,,互联网产品,传统软件产品的测试策略设计,互联网产品的测试策略,单元测试, API测试,GUI测试,GUI测试,API测试,单元测试,短测试执行时间呢?这就是今天的主题啦! 传
  • 测试基础篇二 面试挺常见 ,测试基础篇二—— 面试挺常见,,测试流程各有千秋,黑盒测试相关,自动化测试相关,app常见测试点,app测试和web测试的区别,冒烟测试和回归测试的区别,静态测试和动态测试的区别,α、β、λ测试的区别,负载测试(Load testin
  • 测试基础篇一 面试终极常见 ,测试基础篇(一)—— 面试终极常见,,什么是软件测试?,软件测试的目的是什么?,黑盒、白盒的区别,什么是灰度测试?,负载测试、压力测试、性能测试、容量测试的区别,什么是回归测试?,什么是冒烟测试?,系统测试的16个测试策略,和缺陷 *
  • 软件测试52讲 读书笔记 如何高效填写软件缺陷报告? ,《软件测试52讲》读书笔记 —— 如何高效填写软件缺陷报告?,,缺陷标题,缺陷影响,环境配置,前置条件,重现步骤,期望结果和实际结果,优先级和严重程度,变通方案,根原因分析Root Cause Analysis,First,Secon
  • 软件测试52讲 读书笔记 软测的核心竞争力 ,《软件测试52讲》读书笔记 —— 软测的核心竞争力,业务功能测试应该具备的核心竞争力,,竞争力一,竞争力二,七项核心竞争力,测试策略设计核心竞争力,测试用例设计,快速学习,探索性测试思维,缺陷分析,自动化测试,沟通能力,简述,详解,简
  • 软件测试52讲 读书笔记 如何做好测试计划 ,《软件测试52讲》读书笔记 —— 如何做好测试计划,测试计划的好处,测试计划,,测试范围,测试策略,测试资源,测试进度,测试风险预估,第一:功能测试,第二:兼容性测试,第三:性能测试,性能测试实施相关,度是可控的,实时知道目前测试完成
  • 软件测试52讲 读书笔记 为什么要做自动化测试 ,《软件测试52讲》读书笔记 —— 为什么要做自动化测试,,为什么需要自动化测试?,自动化测试的一些劣势,什么样的项目适合自动化测试?,第一:需求稳定,不会频繁变更,第二:研发和维护周期长,需要频繁执行回归测试,第三:需要在多平台上重复
  • 近期文章

    更多
    文章目录

      推荐作者

      更多