今天看了霸爷的
节点间通讯的通道微调和
谁引起busy_dist_port之后,自己将两章的内容连起来,组合成一个小程序,通过节点名查到相应的port,然后通过port查到相应的节点名,代码如下:
-module(busyPort).
-compile([export_all]).
start(Node) ->
Port = node_port(Node),
annotate_port(busy_dist_port, Port, get_node_map()).
node_port(Node)->
{_, Owner}=lists:keyfind(owner, 1, element(2, net_kernel:node_info(Node))),
hd([P|| P<-erlang:ports(), erlang:port_info(P, connected) == {connected,Owner}]).
get_node_map() ->
%% We're already peeking inside of the priave #net_address record
%% in kernel/src/net_address.hrl, but it's exposed via
%% net_kernel:nodes_info/0. Alas, net_kernel:nodes_info/0 has
%% a but in R14B* and R15B, so we can't use ... so we'll cheat.
%% e.g.
%% (foo@sbb)11> ets:tab2list(sys_dist).
%% [{connection,bar@sbb,up,<0.56.0>,undefined,
%% {net_address,{{10,1,1,34},57368},"sbb",tcp,inet},
%% [],normal}]
try
[begin
%% element(6, T) should be a #net_address record
%% element(2, #net_address) is an {IpAddr, Port} tuple.
if element(1, T) == connection,
size(element(2, element(6, T))) == 2 ->
{element(2, element(6, T)), element(2, T)};
true ->
{bummer, bummer}
end
end || T <- ets:tab2list(sys_dist)]
catch _X:_Y ->
%%error_logger:error_msg("~s:get_node_map: ~p ~p @ ~p\n",
%% [?MODULE, _X, _Y, erlang:get_stacktrace()]),
[]
end.
annotate_port(PortType, Port, NodeMap) ->
try
%% Need 'try': may race with disconnecting TCP peer
{ok, Peer} = inet:peername(Port),
case PortType of
busy_port ->
{busy_port, Peer};
busy_dist_port ->
{busy_dist_port, proplists:get_value(Peer, NodeMap, unknown)}
end
catch
_X:_Y ->
Port
end.
查看效果的时候,先启动两个erlang shell,
$ erl -sname liufan
$ erl -sname yansha
然后通过net_adm:ping(yansha).将两个节点联通起来。
之后再起一个节点$erl -sname yueping
[liufan@liufan busy_dist_port]$ erl -sname yueping
Erlang R16B01 (erts-5.10.2) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V5.10.2 (abort with ^G)
(yueping@liufan)1> net_kernel:connect(liufan@liufan).
true
(yueping@liufan)2> busyPort:start(liufan@liufan).
{busy_dist_port,liufan@liufan}
(yueping@liufan)3> net_kernel:nodes_info().
{ok,[{liufan@liufan,[{owner,<0.40.0>},
{state,up},
{address,{net_address,{{127,0,0,1},45314},
"liufan",tcp,inet}},
{type,normal},
{in,11},
{out,13}]},
{yansha@liufan,[{owner,<0.47.0>},
{state,up},
{address,{net_address,{{127,0,0,1},39923},
"liufan",tcp,inet}},
{type,normal},
{in,5},
{out,4}]}]}
(yueping@liufan)4>
这样就实现了一个查询和反查询。相关代码见附件
分享到:
相关推荐
4. **获取端点实现**:通过服务实例的`getPort`方法,可以获取到服务的具体实现,通常是一个实现了服务接口的代理类。 ```java HelloWorldPortType port = service.getPort(HelloWorldPortType.class); ``` 5. **...
7008节点的配置文件类似,但端口和配置文件名需相应更改。 步骤二: - 启动7007和7008节点。使用与启动原始节点相同的方式,即`redis-server`命令,指定新节点的配置文件。 5. 配置新节点: 为了将新节点加入现有...
它可以根据客户端请求将数据转发到相应的服务端口。 ### 2. compressnet (端口2/3) 这两个端口主要用于压缩网络服务,但现在已被废弃,通常不建议使用。 ### 3. Remote Job Entry (端口5) 远程作业入口(Remote ...
5. 集群管理:ZooKeeper可以监控集群中节点的状态,当节点发生变化时,可以触发相应的事件通知。 二、ZooKeeper 3.4.8的安装与启动 在Windows环境下,解压“zookeeper-3.4.8.zip”压缩包,你将得到一个包含配置...
节点间需要通过网络连接,并配置好相应的端口(默认为6379,集群通信端口为16379)。 接下来,创建Redis集群。在命令行中,使用`redis-trib.rb`工具(在Redis源码包的`src`目录下)初始化集群。执行以下命令,其中`...
4. **处理查询结果**: 查询结果通常是一个Node列表或单个Node,可以根据需求进行进一步处理,如获取节点值、修改节点属性等。 在实际开发中,可能会遇到多个命名空间的情况。在这种情况下,你需要注册并处理每个...
本文将总结一些常见的FastDFS错误,并提供相应的解决方法。 #### 二、常见错误及解决方案 ##### 2.1 存储节点没有开启 **错误代码**:`1.2000001512067` **错误描述**:该错误通常出现在FastDFS客户端向Tracker...
在接口测试中,Loadrunner 通过模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理,然后再把应答报文发送给客户端,客户端接收应答报文,这一个过程就是接口测试的原理。 在 Loadrunner ...
配置完成后,使用Redis命令创建集群,并通过相应的命令检查集群状态和节点信息。 4. 集群扩展与维护:搭建完成后,Redis集群可实现自动故障转移,并支持动态添加或删除节点,实现水平扩展。集群的维护涉及监控节点...
根据配置文件中的`dataDir`设置,创建相应的目录,并在该目录下创建一个名为`myid`的文件,文件内容为当前服务器在集群中的ID(1-255之间)。 4. **启动Zookeeper**: 使用`bin/zkServer.sh start`命令启动...
对于需要提供外部访问的交易服务(smartrm-trade),服务的类型需要选择NodePort(节点端口)或者LoadBalancer(负载均衡)。 Kubernetes容器编排技术原理和案例应用提供了一个高效、可靠、可扩展的容器化解决方案...
在每个节点的`dataDir`下创建一个名为`myid`的文件,内容为该节点的ID(1、2或3),这与`zoo.cfg`中的`server.x`相对应,用于标识节点身份。 4. **启动Zookeeper集群** 依次启动每个节点上的Zookeeper服务,检查...
在设置主从复制时,开发者需要在主节点和从节点上分别配置相应的参数。主节点配置通常包括开启复制服务,而从节点则需要指定要连接的主节点地址和端口。在.NET代码中,这可以通过创建`ConnectionMultiplexer`对象并...
1. **连接集群**:通过 `Redis.new(cluster: ['node1:port', 'node2:port', ...])` 初始化连接,其中 `node1:port` 和 `node2:port` 是集群中的节点地址。 2. **操作数据**:执行 `get`、`set`、`hgetall` 等命令,...
--cluster-replicas 1`命令,其中`node_ip:port`是各个节点的地址,`--cluster-replicas 1`表示每个主节点有一个副本节点。 5. **启动脚本编写** 脚本通常会包括以下几个步骤: - 检查依赖环境,如Python(用于...
在任意一个Redis的源码目录下,运行`./redis-trib.rb create --replicas 1 [node_ip:port ...]`,这里的`--replicas 1`表示每个主节点有一个副本,即从节点。在示例中,使用了6个节点,最终会形成3个主节点和3个从...
4. **创建myid文件**:在dataDir目录下创建一个名为myid的文件,内容为该节点在集群中的唯一ID(1-255之间的数字),与zoo.cfg中的配置对应。 5. **启动Zookeeper**:在每个节点上分别启动Zookeeper服务,通过bin/...
同样,可以通过源码编译或二进制包方式获取并安装。安装完成后,需要启动Sentinel服务,并配置相应的监控和通知规则。 在配置文件方面,Sentinel的配置文件一般命名为`sentinel.conf`,其中包含了哨兵系统的各种...
程序可通过该对象获取服务器的响应内容。 6. 释放连接。无论执行方法是否成功,都必须释放连接 //打印服务器返回的状态 System.out.println(method.getStatusLine()); //打印返回的信息 System.out.println(method....
**网络配置节点与netconf-node库** 在现代网络管理领域,Netconf(网络配置协议)是一种基于XML的协议,用于设备的配置、管理和监控。它提供了安全、标准的方法来远程配置网络设备,确保数据一致性并减少错误。...