Dubbo面试常见问题
一、dubbo是什么?
dubbo是⼀个分布式服务框架,提供⾼性能和透明化的RPC远程服务调⽤⽅案,以及SOA服务治理方案。说白了其实dubbo就是一个远程调用的分布式框架。
二、dubbo的核心服务是什么?
Dubbo的作用以及介绍
特性 描述
透明远程调用 就像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入;
负载均衡机制 Client端LB,可在内网替代F5等硬件负载均衡器;
容错重试机制 服务Mock数据,重试次数、超时机制等;
自动注册发现 注册中心基于接口名查询服务提 供者的IP地址,并且能够平滑添加或删除服务提供者;
性能日志监控 Monitor统计服务的调用次调和调用时间的监控中心;
服务治理中心 路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等手动配置。
自动治理中心 无,比如:熔断限流机制、自动权重调整等;
三、看一下dubbo架构图
四、服务提供者暴露一个服务的详细过程:
如果你仔细观察dubbo的启动日志你会发现,dubbo的provider启动主要是以下几个过程
1.首先provider启动时,先把想要提供的服务暴露在本地。
2.然后再把服务暴露到远程。
3.启动netty服务,建立长连接。
4.连接到注册中心zk上。
5.然后监控zk上的消费服务。
五、服务消费者消费一个服务的详细过程
首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例。接下来把Invoker转为客户端需要的接口。
六、下面来看本地暴露于远程暴露的区别:
本地暴露是暴露在本机JVM中,调用本地服务不需要网络通信.
远程暴露是将ip,端口等信息暴露给远程客户端,调用远程服务时需要网络通信.
七、什么情况下适用dubbo协议,什么时候适用rmi协议?
Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多种协议,但是dubbo协议是官网推荐使用的,dubbo 缺省协议是dubbo协议,采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。RMI协议采用阻塞式(同步)短连接和 JDK 标准序列化方式。适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。后面会对其他几种协议详细介绍,这里就不赘述了。
八、Dubbo主要的配置项有哪些,作用是什么?
provider配置
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="hello-world-app" /> <!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" /> <!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
consumer配置
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
九、Dubbo有几种容错机制
什么是容错机制?容错机制指的是某中系统控制在一定范围的一种允许或包容犯错情况的发生,举个简单的例子,我们在电脑上运行一个程序,有时候会出现无响应的情况,然后系统回弹出一个提示框让我们选择,是立即结束还是继续等待,然后根据我们的选择执行对应的操作,这就是“容错”。
在分布式架构下,网络,硬件,应用都可以发生故障,由于各个服务之间可能存在依赖关系,如果一条链路中的某一个节点出现故障,将会导致雪崩效应。为了减少某一个节点故障的影响范围,所以我们才需要去构建容错服务,来优雅的处理这种中断的响应结果
1.failsafe 失败安全,可以认为是把错误吞掉(记录日志)
2.failover(默认) 重试其他服务器;retries(2)重试的次数,默认为2次
3.failback 失败后自动恢复
4.forking forks. 设置并行数
5.Broadcast 广播,任意一台报错,则执行的方法报错,通过cluster方式,配置制定的容错方案
十、dubbo的服务降级
降级的目的是为了保证核心服务可用
降级可以有几个层面的分类:自动降级,人工降级;按照功能可以分为:读服务降级和写服务降级;
1.对一些非核心服务进行人工降级,在大促之前通过降级开关关闭那些推荐内容,评价等对主流程序没有影响的功能
2.故障降级,比如调用的远程服务挂了,网络故障,或者RPC服务返回异常。那么可以直接降级,降级的方案比如设置默认值,采用兜底数据(系统推荐的行为广告挂了,可以提前准备静态页面做返回)等等
3.限流降级,在秒杀这种流量比较集中并且流量特别大的情况下,因为突发访问量特别大可能导致系统支撑不了。这个时候可以采用限流来限制访问量。当达到阈值时,后续的请求被降级,比如进入排队页面,比如跳转到错误页面(活动火爆,请稍后重试)
Dubbo的降级方式:Mock
实现步骤
1.在client端创建一个testmock类,实现对应的IGphello的接口(需要对哪个接口进行mock,就实现哪个)名称必须以mock结尾
2.在client端的xml配置文件中,添加如下配置,增加一个mock属性指向创建的testmock
3.模拟错误(设置timeout)模拟超时异常,运行测试代码即可访问到testmock这个类,当服务端故障解除以后,调用过程将恢复正常
十一、dubbo的优先级配置
配置优先级别
1.以timeout为例,显示了配置的查找顺序,其他retries,loadbalance等类似。
(1)方法级优先,接口级次之,全局配置在次之
(2)如果级别一样,则消费方优先,提供方次之
(3)其中,服务提供方配置,通过URL经由注册中心传递给消费方
2.建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。
dubbo高可用之zookeeper宕机、Dubbo直连、负载均衡、服务降级、集群容错
1. zookeeper宕机
我们接下来讨论一下如果zookeeper宕机对我们的服务提供者消费者有什么影响
现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。
原因:
- 监控中心宕掉不影响使用,只是丢失部分采样数据
- 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
- 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
- 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
- 服务提供者无状态,任意一台宕掉后,不影响使用
- 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复
高可用:通过设计,减少系统不能提供服务的时间
例子:
我们在消费者中睡眠20秒,然后我们在这20秒时间内停掉注册中心,看看第二次消费能否成功
public class App
{ public static void main( String[] args ) throws Exception
{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "classpath:customer.xml" });
final IUserService demoService = (IUserService) context.getBean("userService");
System.out.println(demoService.getUser());
System.out.println("程序运行第一次......");
Thread.sleep(1000*20);
System.out.println(demoService.getUser());
System.out.println("程序运行第二次......");
System.in.read(); }
}
接下来我们一次启动服务提供者 消费者 然后停掉服务注册中心
可以看到
我们的服务消费者在注册中心宕机后让然可以调用服务提供者提供的服务。但是注册中心宕机后我们不能再注册新的服务。
2. Dubbo直连
在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直连方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表。
注意 为了避免复杂化线上环境,不要在线上使用这个功能,只应在测试阶段使用。我们可以在开发的时候使用此方式进行调试
<dubbo:reference id="userService" interface="com.yz.dubbo.api.IUserService" check="false" version="1.0.0" url="dubbo://127.0.0.1:20882"></dubbo:reference>
我们启动我们的服务注册中心与服务提供者消费
发现我们的消费者并没有注册到服务注册中心,但是我们仍然可以调用服务提供者提供的服务
我们实现了跨注册中心 直连服务提供者
3. 负载均衡
在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。
负载均衡策略
Random LoadBalance
随机,按权重设置随机概率。
RoundRobin LoadBalance
轮询,按公约后的权重设置轮询比率。
LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者。
接下来我们测试一下默认的随机方式
<dubbo:service interface="com.yz.dubbo.api.IUserService" ref="userService1" version="1.0.0" loadbalance="random"></dubbo:service>
我们启动多个服务提供者,并指定不同的端口号,在实现中通过来区分不同的提供者
System.out.println("被调用了1............");
System.out.println("被调用了2............");
接下来我们启动多个服务提供者来模拟,并通过Admin控制台中的 倍权 半权 来调节权重 ,结果如下
接下来我们启动服务消费者模拟消费者多次消费
我们模拟了六次可以看到控制台输出
被调用了0............
被调用了0............
被调用了1............
被调用了0............
被调用了0............
被调用了0............
实现了调用多个服务提供者,并实现了负载均衡
4. 服务降级
当我服务器的压力比较大的时候,我们可以通过服务降级功能 临时屏蔽某个出错的非关键服务,并定义降级后的返回策略,屏蔽掉不重要的服务如广告服务等,来降低核心业务的压力
mock=force:return+null
表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。- 还可以改为
mock=fail:return+null
表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
我们可以直接在Admin控制台来操作服务降级,服务消费者中的屏蔽相当于不发起远程调用,
容错相当于对该服务的方法调用在失败后,再返回 null 值
屏蔽
我们屏蔽我们的应用yzcustomer
发现提供者并没有调用且返回null
容错
我们容错我们的应用yzcustomer,并手动使我们的提供者出错,启动服务提供者和消费者
发现在调用服务提供者出错时,返回null
5. 集群容错
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。
Failover Cluster
失败自动切换,当出现失败,重试其它服务器 。通常用于读操作,但重试会带来更长延迟。可通过 retries="2"
来设置重试次数(不含第一次)。
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2"
来设置最大并行数。
Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。
集群模式配置
按照以下示例在服务提供方和消费方配置集群模式
<dubbo:service cluster="failsafe" />
或
<dubbo:reference cluster="failsafe" />
Dubbo面试常见问题的更多相关文章
- Java后台面试 常见问题
Java后台面试 常见问题 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米.百度.阿里.京东.新浪.CVTE.乐视家的研发岗offer.我找的是java后台开发,把常见的问题分享 ...
- 2019最新最全Java开发面试常见问题答案总结
2019最新最全Java开发面试常见问题答案总结 马上准备9月份出去面试Java开发,自己学习丢西瓜捡芝麻,学了的都忘了,所以有机会自己做个学习笔记,摘录自各个博文以及总结. 1.JAVA面向对象的特 ...
- C++面试常见问题——01预处理与宏定义
C++面试常见问题--------01预编译和宏的使用 C++预处理器 预处理器是一些指令,它将指示编译器在实际编译之前需要完成的预处理.预处理必须要在对程序进行词法与语义分析.代码生成与优化等通常的 ...
- Dubbo面试专题
Dubbo面试专题 1. 什么是dubbo Dubbo是阿里巴巴SOA服务化治理方案的核心框架,是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 2. ...
- MySQL索引知识点&面试常见问题
来源:BiggerBoy 作者:北哥 原文链接:https://mp.weixin.qq.com/s/fucHvdRK5wRrDfBOo6IBGw 大家好我是北哥,今天整理了MySQL索引相关的知识点 ...
- java 美团面试常见问题总
一 基础篇 1. System.out.println(3|9)输出什么? 2. 说一下转发(Forward)和重定向(Redirect)的区别 3. 在浏览器中输入url地址到显示主页的过程,整个过 ...
- Dubbo面试
DUBBO原理.应用与面经总结 SPI 你是否了解SPI,讲一讲什么是SPI,为什么要使用SPI? SPI具体约定:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/serv ...
- Dubbo面试20问!这些题你都遇到过吗?
作者:Dean Wang https://deanwang1943.github.io/bugs/2018/10/05/面试/饿了么/dubbo 面试题/ 1.dubbo是什么 dubbo是一个分布式 ...
- Java开发面试常见问题合集
次面试事故 面试官:你看过哪些源码?我:都挺熟悉的面试官:对hashMap了解程度怎么样?面试官:那你能讲讲 HashMap的实现原理吗?面试官:HashMap什么时候会进行 rehash?面试官:结 ...
随机推荐
- java树的遍历
java二叉树的遍历算法: http://blog.sina.com.cn/s/blog_70600f720100ujnp.html
- Centos,tomcat
1.下载tomcat9.0,解压,配置 wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.21/bin/apa ...
- linux 系统管理--进程管理
目录 linux 系统管理--进程管理 一.进程基本概述 二.监控进程状态 三.进程的优先级[进阶] 四.企业案例,Linux假死是怎么回事 五.后台进程管理 六.系统平均负载[进阶] linux 系 ...
- Codeforces 1203F (贪心, DP)
题意:有n个任务,你的初始rating是m, 这n个任务有两个指标:完成这项任务所需的最低rating(a[i]),以及完成这项任务后rating的变化(可能为负)(b[i]).rating不能为负. ...
- 入门phantomjs
前言 phantomjs是一个无界面浏览器,用来操作web页面的一个工具,比如登录,提交表单等等. 语法框 //创建一个浏览器对象 var page = require('webpage').crea ...
- Java 枚举和类的区别
枚举 包含一组常量合法的数据,不能创建枚举实例,也不能进行扩展. package com.jtfr.demo; public enum Week { MONDAY, TUESDAY, WEDNESDA ...
- Spring整合Struts2的配置与测试
整合目的 让Spring的IOC容器管理Struts2的Action 整合步骤 1.新建一个Web项目 2.加入Spring的jar包和添加Spring的配置文件 3.在Web.xml中配置Conte ...
- Vue路由组件vue-router
一.路由介绍 Creating a Single-page Application with Vue + Vue Router is dead simple. With Vue.js, we are ...
- boost库:事件处理
boost库的signal所实现的模式被命名为信号至插槽,当对应的信号被发出时,相关联的插槽即被执行. #include <boost/signal.hpp> #include <i ...
- while循环语句基础
while循环语句基础 一while循环语句介绍 循环语句命令常用于重复执行一条指令或一组指令,直到条件不再满足时停止, Shell脚本语言的循环语句常见的有while, until, for及s ...