其它问题

1. 关于容器环境下,将dubbo端口暴露为指定的端口,以便容器外可以访问到

(2019年3月7日 09:48:45)

考虑这样的场景,在容器集群内部,java应用默认监听在a.b.c.d:28080端口上,并自动将该ip端口注册到zookeeper上。对于外部而言是没法访问这个ip和端口,因此为了使外部可以访问,需要把内部的a.b.c.d:28080端口,映射为[宿主主机ip:指定端口]。

映射之后,是可以直接去调通这个端口的,但是应用注册到zookeeper的信息则还是a.b.c.d:28080端口,因此需要把这个信息改成[宿主主机ip:指定端口]。这篇文章则专门满足这个需求:https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-docker

最终做法:设置环境变量即可,这两个环境变量可以单独设置的

DUBBO_IP_TO_REGISTRY=宿主主机ip
DUBBO_PORT_TO_REGISTRY=指定端口

2. 关于dubbo传输异常对象

(2019年4月9日 09:53:37)

Dubbo默认可以传输异常Exception,也即接口上抛出有实现序列化接口的Exception对象,会传输到调用方,被调用方捕获并正常打印出来。要做到这样,需要在接口上声明throw XXXException才行。

3. 关于OpenFeign和Dubbo starter冲突的问题

https://github.com/apache/dubbo/issues/3990

当标记了@FeignClient的Service被dubbo provider的服务调用到时,会出现<dubbo:service interface="" /> interface not allow null!的异常,解决方法是对使用到的Feign的服务加上@Lazy注解,暂时这样解决。

4. 关于zookeeper中提供者的ip端口在应用强制关闭后,没有清除的问题

(2020年3月26日 14:26:07)

在容器集群下,应用的重启很可能用的是kill -9强制关闭的,它将导致dubbo 2.7.1版本的provider数据没法清除的问题,长达几个月都没有被清理,导致消费者启动时,一个一个去试这些端口而启动长达几分钟。

issue: https://github.com/apache/dubbo/issues/3920

这个问题在dubbo 2.7.2及以后的版本已经修复了。另外如果是正常kill -15kill -1kill -2结束应用的,2.7.1版本并不会出现没有清理的问题。如果原来已经出现了大量提供者没有被清理,那么解决方案是:把zk的数据清了重启就好了,会自动自测回去,启动过程不影响应用,因为应用有缓存ip地址。

一般来说,正确的优雅停机方式是先发送-15信号给进程,等待一段时间例如10秒钟,如果进程结束了,就完成了。如果进程还没结束,则再发送-9信号给进程,强制结束。docker的stop是会触发jvm的退出hook,也即是优雅的停机方式。

正常来说,dubbo的优雅停机默认是开启的,默认时间是10秒,会自动处理好生产者和消费者的事情,包括停止新请求、处理老请求、清理注册中心等

相关文章:
https://dubbo.apache.org/zh-cn/blog/dubbo-gracefully-shutdown.html
https://www.cnkirito.moe/dubbo-gracefully-shutdown/

文档更新时间: 2020-08-21 09:30   作者:nick