Dubbo核心面试点整理
2021-02-21 16:16:54 5 举报
AI智能生成
Dubbo核心面试点整理
作者其他创作
大纲/内容
启动时检查
通过 spring 配置文件
通过 dubbo.properties
通过 -D 参数
集群容错
Failover Cluster
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录
Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作<br>
Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作<br>
Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数
Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息
负载均衡
Random LoadBalance
随机,按权重设置随机概率
RoundRobin LoadBalance
轮询,按公约后的权重设置轮询比率
LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差
ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者
配置
服务端服务级别
客户端服务级别
服务端方法级别<br>
客户端方法级别
线程模型
Dispatcher
all
所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等
direct
所有消息都不派发到线程池,全部在 IO 线程上直接执行
message
只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在 IO 线程上执行
execution
只有请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在 IO 线程上执行
connection
在 IO 线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池
ThreadPool
fixed
固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
cached
缓存线程池,空闲一分钟自动删除,需要时重建
limited
可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题
eager
优先创建Worker线程池。在任务数量大于corePoolSize但是小于maximumPoolSize时,优先创建Worker来处理任务。当任务数量大于maximumPoolSize时,将任务放入阻塞队列中。阻塞队列充满时抛出RejectedExecutionException。(相比于cached:cached在任务数量超过maximumPoolSize时直接抛出异常而不是将任务放入阻塞队列)
协议
dubbo
Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
http
基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现
hessian
Hessian协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。
grpc
Dubbo 自 2.7.5 版本开始支持 gRPC 协议,对于计划使用 HTTP/2 通信,或者想利用 gRPC 带来的 Stream、反压、Reactive 编程等能力的开发者来说, 都可以考虑启用 gRPC 协议
为期望使用 gRPC 协议的用户带来服务治理能力,方便接入 Dubbo 体系<br>
用户可以使用 Dubbo 风格的,基于接口的编程风格来定义和使用远程服务<br>
memcached
基于 memcached 实现的 RPC 协议<br>
thrift
当前 dubbo 支持的 thrift 协议是对 thrift 原生协议 的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等
redis
基于 Redis 实现的 RPC 协议
rest
基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写)实现的REST调用支持
rmi
RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式
webservice
基于 WebService 的远程调用协议,基于 Apache CXF 的 frontend-simple 和 transports-http 实现
过滤器
EchoFilter<br>
判断当前请求是不是一个回升测试,如果是,则不继续执行过滤器链了(服务实现者Invoker也不会调用了)
GenericFilter
把泛化调用发送过来的信息包装为RpcInvocation对象
TokenFilter<br>
检查令牌
AccessLogFilter<br>
请求访问日志记录
MonitorFilter
记录当前服务的执行次数
ClassLoaderFilter<br>
设置当前线程的classloader为当前要执行的服务接口所对应的classloader
ContextFilter<br>
设置RpcContext.getContext()的参数
ExceptionFilter<br>
调用时没有特别处理,在回调onResponse方法时,对不同的异常进行处理,详解Dubbo的异常处理
负载均衡
RandomLoadBalance
权重随机算法
RoundRobinLoadBalance<br>
权重轮询算法
LeastActiveLoadBalance<br>
最小活跃数算法
动态代理
JdkProxyFactory<br>
基于JDK自带的动态代理
JavassistProxyFactory<br>
基于Javassist的动态代理
序列化
avro
Avro是一个数据序列化系统,设计用于支持大批量数据交换的应用。它的主要特点有:支持二进制序列化方式,可以便捷,快速地处理大量数据;动态语言友好,Avro提供的机制使动态语言可以方便地处理Avro数据<br>
fastjson
json序列化<br>
fst
FST是一种较新的序列化实现,目前还缺乏足够多的成熟使用案例,但它还是非常有前途的
hessian2
hessian是一种跨语言的高效二进制序列化方式。但这里实际不是原生的hessian2序列化,而是阿里修改过的hessian lite,它是dubbo RPC默认启用的序列化方式
jdk
主要是采用JDK自带的Java序列化实现,性能很不理想
kryo
Kryo是一种非常成熟的序列化实现,已经在Twitter、Groupon、Yahoo以及多个著名开源项目(如Hive、Storm)中广泛的使用
protobuf-json
Google 的 ProtoBuf,在效率、兼容性等方面非常出色
protostuff<br>
Protocol Buffer是谷歌出品的一种数据交换格式,独立于语言和平台,类似于json。Google提供了多种语言的实现:java、c++、go和python。对象序列化城Protocol Buffer之后可读性差,但是相比xml,json,它占用小,速度快。适合做数据存储或 RPC 数据交换格式
Protocol Buffer门槛更高,因为需要编写.proto文件,再把它编译成目标语言,这样使用起来就很麻烦。但是现在有了protostuff之后,就不需要依赖.proto文件了,他可以直接对POJO进行序列化和反序列化,使用起来非常简单
传输层
etcd3
Etcd是一个分布式的,一致的 key-value 存储,主要用途是共享配置和服务发现。Etcd 已经在很多分布式系统中得到广泛的使用
grizzly
Grizzly是一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各种问题。使用JAVA NIO作为基础,并隐藏其编程的复杂性。容易使用的高性能的API。带来非阻塞socketd到协议处理层。利用高性能的缓冲和缓冲管理使用高性能的线程池
http
Http协议
mina
Apache MINA 是一个网络应用程序框架,可帮助用户轻松开发高性能和高可伸缩性的网络应用程序。它通过 Java NIO 通过各种传输(例如TCP / IP和UDP / IP)提供了一个抽象的事件驱动的异步API
netty<br>
Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。
netty4
Netty从4.x版本开始,需要使用JDK1.6及以上版本提供基础支撑
在设计上,针对多种传输类型的统一接口,采用简单但更强大的线程模型。
在性能上,比核心Java API更好的吞吐量,较低的延时,资源消耗更少,这个得益于共享池和重用,减少内存拷贝。
在健壮性上,消除由于慢、快或重连接产生的OutOfMemoryError。
在安全上,完整的SSL/TLS和StartTLS的支持。
zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
注册中心扩展<br>
zookeeper
Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用
multicast
Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现
nacos
Nacos 是 Dubbo 生态系统中重要的注册中心实现,其中 dubbo-registry-nacos 则是 Dubbo 融合 Nacos 注册中心的实现
redis
基于 Redis 实现的注册中心
从 2.1.0 版本开始支持。Redis 过期数据通过心跳的方式检测脏数据,服务器时间必须同步,并且对服务器有一定压力,否则过期检测会不准确
<br>
结果缓存
lru
基于最近最少使用原则删除多余缓存,保持最热的数据被缓存
threadlocal
当前线程缓存,比如一个页面渲染,用到很多 portal,每个 portal 都要去查用户信息,通过线程缓存,可以减少这种多余访问
jcache
与 JSR107 集成,可以桥接各种缓存实现
0 条评论
下一页