Ehcache RMI复制配置中remoteObjectPort的作用是什么
Ehcache RMI复制配置理解校验及
remoteObjectPort参数说明 现有运行逻辑理解校验
你的3点理解中,第2、3点表述正确,第1点存在偏差:
- 节点启动后40001端口是本地RMI注册中心的监听端口,并非所有Ehcache RMI相关服务都运行在这个端口上。
- 手动发现(
peerDiscovery=manual)模式下,节点启动时会直接加载拼接完成的rmiUrls列表作为集群对等节点地址,不会通过组播做自动节点发现。 - 节点启动后会注册缓存事件监听器,一方面捕获本地缓存的增删改事件同步给其他对等节点,另一方面接收其他节点发来的同步请求更新本地缓存,完成跨节点数据复制。
项目中peerProviderConfig的实现逻辑就是拼接所有对等节点的RMI访问地址,对应代码如下:
FactoryConfiguration peerProviderConfig = new FactoryConfiguration(); peerProviderConfig.setClass(RMICacheManagerPeerProviderFactory.class .getName()); for (CacheHost remoteHost : remoteHosts) { // 拼接RMI访问地址 rmiUrls += separator createRmiUrl(remoteHost, cacheName); separator = "|"; } // 写入配置 peerProviderConfig.setProperties("peerDiscovery=manual, rmiUrls=" + rmiUrls);
其中createRmiUrl()返回的//<hostname>:<hostport>/cacheName格式地址里的hostport,就是对应节点RMI注册中心的监听端口,也就是统一配置的40001。
remoteObjectPort参数的具体用途
项目中Peer监听器的配置代码如下:
String peerListenerProps = "port=" + rmiPort; peerListenerProps += ", remoteObjectPort=40002"; peerListenerProps += ", socketTimeoutMillis=" + socketTimeoutMillis; FactoryConfiguration peerListenerConfig = new FactoryConfiguration(); peerListenerConfig.setClass(RMICacheManagerPeerListenerFactory.class.getName()); peerListenerConfig.setProperties(peerListenerProps);
配置中两个端口参数的分工明确:
port(取值40001):节点本地RMI注册中心的监听端口,其他节点首次连接当前节点时,首先访问这个端口查询缓存远程服务的存根信息。remoteObjectPort(取值40002):真正处理缓存复制请求的远程服务对象实际绑定的端口。如果不手动指定这个参数,标准RMI机制会随机选择一个空闲端口绑定远程服务对象,在配置了防火墙的生产环境中,随机端口未被放行会直接导致跨节点复制失败。项目中把这个值固定为40002,就是为了规避随机端口带来的连通性问题,方便运维侧配置固定端口的防火墙放行规则。
补充提示:单台主机部署多个Ehcache节点时,需要保证每个节点的
port和remoteObjectPort全局唯一,否则会触发端口绑定错误。
内容的提问来源于stack exchange,提问作者theimpatientcoder
相关产品推荐
相关产品推荐

