什么是dubbo?Dubbo是一个分布式框架,一个用于远程服务调用的分布式框架。其核心部分包括:集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡、故障容错、地址路由、动态配置等集群支持。远程通信:提供对各种基于长连接的NIO框架的抽象封装,包括多线程模型、序列化、“请求-响应”模式下的信息交换方式。自动发现:基于注册中心的目录服务,服务消费者可以动态找到服务提供者,地址透明化,方便服务提供者平滑增减机器。dubbo能做到的是透明的远程方法调用,像调用本地方法一样调用远程方法,配置简单,无API侵入。软负载均衡和容错机制可以替代内网F5等硬件负载均衡器,降低成本和单点。自动服务注册和发现,不再需要硬编码服务提供者地址,注册中心根据接口名称查询服务提供者IP地址,可以平滑添加或删除服务提供者。1、默认使用什么通信框架,还有其他选择吗?答:netty框架和mina也是默认推荐的。2、服务电话是否被阻塞?答:默认是阻塞的,可以异步调用。如果没有返回值,你可以这样做。3、一般用什么注册中心?还有其他选择吗?答:推荐使用zookeeper注册中心,以及Multicast注册中心、Redis注册中心、Simple注册中心。ZooKeeper节点通过树状结构维护,每个节点都被标记并通过路径访问。另外,每个节点也有自己的一些信息,包括:数据、数据长度、创建时间、修改时间等。4、默认使用什么序列化框架,你还知道什么?答:默认使用Hessian序列化,Duddo、FastJson、Java都有自己的序列化。Hessian是一个以二进制格式传输的服务框架,比传统的soapweb服务更轻、更快。Hessian原理及协议简析:HTTP协议规定了数据的传输方式,Hessian不能改动太多:1)Hessian中client与server的交互基于http-post方式。2)Hessian在httpheader中封装了一些辅助信息,比如“授权令牌”等,我们可以基于http-header封装“安全验证”和“元数据”。Hessian提供了一种简单的“验证”机制。3)对于Hessian的交互核心数据,如“调用的方法”、参数列表信息等,会直接通过post请求的body发送,格式为字节流。4)对于Hessian的服务端响应数据,在响应中会直接以字节流输出。Hessian的协议本身并不复杂,这里不再赘述;所谓协议(protocol)就是约束数据的格式。客户端将请求信息按照协议序列化成字节序列发送给服务端。服务器根据协议对数据进行逆向。把它变成一个“对象”,然后执行指定的方法,把方法的返回值按照协议再次序列化成一个字节流,响应给客户端,客户端反序列化字节流变成一个“对象”根据协议。5、服务商实现失效的原理是什么?答:服务故障踢出基于zookeeper的临时节点原理。6、为什么上线不影响老版本?答:采用多版本开发,老版本不受影响。在配置中添加版本作为版本区分7.如何解决服务调用链过长的问题?答:可以结合zipkin实现分布式服务跟踪。8.核心配置有哪些?核心配置包括:1)dubbo:service/2)dubbo:reference/3)dubbo:protocol/4)dubbo:registry/5)dubbo:application/6)dubbo:provider/7)dubbo:consumer/8)dubbo:method/9,dubbo推荐什么协议?答:默认使用dubbo协议。10.同一个服务有多个注册时,我可以直接连接某个服务吗?答:可以直接连接,修改配置即可,也可以通过telnet直接连接某个服务。11、dubbo是如何解决安全机制的?Dubbo使用token来防止用户绕过注册中心直连,然后在注册中心进行授权管理。Dubbo提供了黑白名单来控制服务允许的调用者。12、集群容错怎么做?答:建议使用Failover,在读操作失败时自动切换。默认情况下,它会重试其他服务器两次。写操作推荐使用Failfast快速失败,调用失败会立即报错。13、您在使用过程中遇到过哪些问题?如何解决?1)如果同时配置了XML和properties文件,properties中的配置将失效。只有当没有配置XML时,属性才会生效。2)默认情况下,dubbo会在启动时检查依赖是否可用,如果不可用则抛出异常,阻止spring初始化完成。检查属性默认为true。测试过程中,有些服务不关心或者存在循环依赖,设置check为false3)为了方便开发测试,离线有所有服务可用的注册中心。这时候如果注册了开发中的服务提供者,可能会影响消费者的正常使用。解决方案:让服务商开发者只订阅服务,不注册开发中的服务,直接连接测试开发中的服务。将dubbo:registry标签的register属性设置为false。4)Spring2.x初始化死锁问题。当spring解析为dubbo:service时,service已经暴露了,spring还在初始化其他的bean。如果此时有请求进来,服务实现类中有调用applicationContext.getBean()的用法。getBean线程和spring初始化线程的加锁顺序不同,导致线程死锁,无法提供服务,无法启动。解决方法:不要在服务实现类中使用applicationContext.getBean();如果不想依赖配置顺序,可以将dubbo:provider的deplay属性设置为-1,让dubbo在容器初始化完成后对外暴露服务。5)服务无法注册。检查dubbojar包是否在classpath下,是否有重复的jar包。检查服务提供者机器上是否加载了暴露服务的spring配置,测试与注册中心的网络是否连通。6)出现RpcException:Noprovideravailableforremoteservice异常说明没有可用的服务提供者,a。检查连接的注册中心是否正确b.去注册中心查询是否存在对应的服务商c.检查服务提供者是否正常运行7)出现“消息发送失败”的异常,通常是因为接口方法的传入传出参数没有实现Serializable接口。14.dubbo和dubbox有什么区别?答:dubbox是当当网在dubbo的基础上做了一些扩展,比如增加了可以调用restful的服务,更新了开源组件等。15.你知道其他的分布式框架吗?答:其他还有spring的springcloud、facebook的thrift、twitter的finagle等。16、Dubbo支持哪些协议,每个协议的应用场景,优缺点?dubbo:单长连接和NIO异步通信,适用于数据量小的大并发服务调用,消费者远大于提供者。传输协议TCP、异步、Hessian序列化;rmi:使用JDK标准rmi协议实现,传输参数和返回参数对象需要实现Serializable接口,使用java标准序列化机制,使用阻塞短连接,传输数据包大小混合,消费者数量和providers差不多,可以传输文件,传输协议是TCP。多条短连接,TCP协议传输,同步传输,适用于常规的远程服务调用和rmi互操作。依赖低版本Common-Collections包的java序列化存在安全漏洞;webservice:基于WebService的远程调用协议,集成了CXF实现,提供与原生WebService的互操作。多条短连接,基于HTTP传输,同步传输,适用于系统集成和跨语言调用;http:基于Http表单提交的远程调用协议,使用Spring的HttpInvoke实现。多个短连接,传输协议HTTP,传入参数大小混合,提供者多于消费者,需要调用到应用和浏览器JS;hessian:集成Hessian服务,基于HTTP通信,使用Servlet暴露服务,Dubbo在嵌入Jetty作为服务端时默认实现,提供与Hession服务的互通。多个短连接,同步HTTP传输,Hessian序列化,传入参数大,提供者大于消费者,提供者压力更大,可以传输文件;memcache:RPCprotocolimplementedbasedonmemcachedredis:RPCimplementedbasedonredisProtocol17、Dubbo集群负载均衡有哪些策略?Dubbo提供了通用的集群策略实现,前置扩展点自行实现。RandomLoadBalance:随机选择provider策略,有利于动态调整provider权重。横截面碰撞率高,调用越多,分布越均匀;RoundRobinLoadBalance:round-robinprovider策略,均匀分布,但存在请求堆积问题;LeastActiveLoadBalance:最不活跃调用策略,解决慢provider收到较少Request的问题;ConstantHashLoadBalance:ConsistentHash策略,使相同参数的请求始终发送给同一个提供者。如果一台机器宕机,可以基于虚拟节点分发给其他供应商,避免供应商的剧烈变动;18、服务调用超时问题如何解决当dubbo调用服务失败时,默认会重试两次。这样,当服务器的处理时间超过了设置的超时时间,就会出现重复请求。例如,在发送邮件时,可能会发送多封重复的邮件,在执行注册请求时,会插入多封重复的注册数据,那么如何解决超时问题呢?对于核心服务中心,去掉dubbo超时重试机制,重新评估超时设置。业务处理代码必须放在服务器端,客户端只做参数校验和服务调用,不涉及业务流程处理全局配置实例。当然,Dubbo的重试机制其实是一个很好的QOS保证,它的路由机制会帮你将超时的请求路由到其他机器而不是本地尝试,所以dubbo的重试机也能在一定程度上保证服务质量。但请务必根据在线访问量给出综合评价。
