dubbo使用注意点
1.父子类有相同属性时值丢失
原因分析:dubbo默认采用的是hessian序列化&反序列化方式,JavaDeserializer在获取fileds时,采用了Map去重。但是在读取值时,根据serializer的顺序,对于同名字段,子类的该字段值会被赋值两次,总是被父类的值覆盖,导致子类的字段值丢失。
解决:删掉子类中与父类同名属性
2. 自定义异常被包装成RuntimeException
如果Provider中的api和自定义Exception定义都是在一个api.jar中,那么是不会有任何问题的。但是如果自定义Exception是在一个单独的比如common.jar包中就会出现这个问题(此时api和model在另一个api.jar中)因为dubbo Provider的ExceptionFilter.java对异常统一封装导致;
解决:将自定义异常和接口类放到一个包中即可
3.IP暴露问题
如果你服务的调用方和消费方不在同一个内网中,那么就会希望Dubbo服务通过外网IP暴露。不过不好意思,dubbo默认的服务暴露行为搞不定,因为dubbo默认暴露的是内网IP地址。
这个时候,我们就需要借助两个参数:dubbo.protocol.host和dubbo.protocol.port,通过这两个参数显示申明我们暴露服务的IP和Port,这两个参数即可以通过配置文件方式指定,也可以通过JVM参数方式指定;
dubbo服务不能调用原因:
- 服务提供者的ip与注册中心ip不一致
1 、如何进行异常查找:
rpc调用异常,不能正常调用
日志、控制台异常核对关键信息
接口对接,从调用方与提供方
核对配置信息是否正常,
在核对是否匹配
2、开发时消费者端ip配置
在程序配置文件中 配置dubbo 的注册中心“dubbo.registry.address” 时要
注意不要配置127.0.0.1 要配置为 localhost。
127.0.0.1 localhost localhost.localdomain
3、ip不一致原因
serviceIp并非本地en0 Ip(本地物理网卡ip),而是utunN IP(虚拟网卡IP)。
导致服务消费者启动失败,原因是找不到服务提供者。根本问题是因为双网卡
或者本地开了VPN。