使用dubbo过程中遇到的问题

来源:互联网 发布:mac pro文件怎么删除 编辑:程序博客网 时间:2024/05/22 00:31

1.同时配置了XML和properties文件,则properties中的配置无效

只有XML没有配置时,properties才生效。

 

2.dubbo缺省会在启动时检查依赖是否可用,不可用就抛出异常,阻止spring初始化完成,check属性默认为true。测试时有些服务不关心或者出现了循环依赖,将check设置为false

 

3.为了方便开发测试,线下有一个所有服务可用的注册中心,这时,如果有一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。解决:让服务提供者开发方,只订阅服务,而不注册正在开发的服务,通过直连测试正在开发的服务。设置dubbo:registry标签的register属性为false。

 

4.spring 2.x初始化死锁问题。在spring解析到dubbo:service时,就已经向外暴露了服务,而spring还在接着初始化其他bean,如果这时有请求进来,并且服务的实现类里有调用applicationContext.getBean()的用法。getBean线程和spring初始化线程的锁的顺序不一样,导致了线程死锁,不能提供服务,启动不了。

解决:不要在服务的实现类中使用applicationContext.getBean();如果不想依赖配置顺序,可以将dubbo:provider的deplay属性设置为-1,使dubbo在容器初始化完成后再暴露服务。

 

5.服务注册不上

检查dubbo的jar包有没有在classpath中,以及有没有重复的jar包

检查暴露服务的spring配置有没有加载

在服务提供者机器上测试与注册中心的网络是否通

 

6.出现RpcException: No provider available for remote service异常怎么办?

表示没有可用的服务提供者,

1). 检查连接的注册中心是否正确

2). 到注册中心查看相应的服务提供者是否存在

3). 检查服务提供者是否正常运行

 

7.出现"消息发送失败"异常怎么办?

通常是接口方法的传入传出参数未实现Serializable接口。

 

8.SpringCloud和Dubbo的比较

相同点:都能提供服务注册,调用,监控

spring cloud提供了一整套企业级分布式云应用的完美解决方案,能够结合spring boot,docker实现快速开发的目的,核心要素在于服务的发现,注册,路由,熔断降级,分布式配置,dubbo只有spring cloud的一部分rpc的功能服务治理

spring cloud的服务调用方式是rest api,可以跨平台,dubbo的服务调用方式是RPC,默认不能跨平台,需要实现一层代理,以rest方式提供对外服务。

spring cloud的常用服务注册中心是zookeeper,spring cloud常用服务注册中心是spring cloud netflix eureka

spring cloud的服务监控是spring boot admin, dubbo的服务监控是dubbo-monitor

 

 

 

9.为什么选择dubbo

提供了远程通讯,对多种基于单一长连接的NIO框架抽象封装,适用于小数据量,大并发的服务调用,如果数据量较大,可以使用多个连接。

提供了负载均衡和容错机制

服务自动注册与发现

与spring集成配置简单

支持多种协议,默认TCP协议

 

10.为什么消费者比提供者个数多?

dubbo采用单一长连接,根据测算经验数据,每条连接最多只能压满7M,理论上1个服务提供者需要20个消费者才能压满网卡。

 

11.为什么采用单一长连接

服务大多数服务提供者少,服务的消费者多,单一连接保证单一消费者不会压死提供者,长连接减少连接握手频率,节省资源。

 

12.为防止大量连接撑挂,可在服务提供方限制大接收连接数,以实现服务提供方自我保护,即设置dubbo:protocol中accept属性

 

13. 测试和生产公用一套zookeeper,怎么保证消费不冲突

可以通过自定义filter实现filter接口来实现dubbo接口的ip白名单,限制访问权限。

 

14.如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?

可以通信,启动dubbo时,消费者会从zk拉去注册的生产者的地址接口作为数据,缓存在本地,每次调用安装本地的缓存地址进行调用。

 

15.服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务提供者恢复。

 

16.注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了服务提供者列表,服务消费者可以直连提供者。

 

17.dubbo在安全机制方面如何解决的?

dubbo通过token令牌防止用户绕过注册中心直连,然后在注册中心管理授权,dubbo提供了黑白名单,控制服务所允许的调用方。

 

18.hession序列化失败hessionruntimeexception

检查服务方法传入传出参数是否实现serializable接口

 

19.rejectedExecutionexception异常

线程池到达最大值,在dubbo.properties中增加线程池最大值和最小值大小

 

20 .RpcLocalExceptionIoTargetIsNotConnected

检查注册中心是否开启白名单功能,如果开启了,当ip不在白名单列表中,注册中心拒绝连接。

检查端口是否正确,注册中心有2个端口,一个为控制台http端口,用于管理员查看数据,一个为程序注册服务用的tcp端口。

 

21.dubbo服务发布过程做了哪些事

暴露本地服务,暴露远程服务,启动netty,连接zookeeper,到zookeeper注册,监听zookeeper

 

22.dubbo有哪些协议,他们之间有什么特点

dubbo允许配置多协议,不同服务不同协议,大数据用短连接协议,小数据大并发用长连接协议。

 

23.什么是本地暴露和远程暴露,他们的区别

本地暴露:一个服务可能既是provider,又是consumer,自己调用自己的服务,暴露在jvm中,不需要网络通信。url是以injvm开头

远程暴露:将ip,端口等信息暴露给远程客户端,调用时需要网络通信。

dubbo处理服务暴露的关键在于Invoker转换到Exporter的过程。