`
liumengfan
  • 浏览: 33137 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过port获取相应的节点名

阅读更多
今天看了霸爷的节点间通讯的通道微调谁引起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> 

这样就实现了一个查询和反查询。相关代码见附件
分享到:
评论

相关推荐

    Java解析wsdl文档获取具体的方法与参数

    4. **获取端点实现**:通过服务实例的`getPort`方法,可以获取到服务的具体实现,通常是一个实现了服务接口的代理类。 ```java HelloWorldPortType port = service.getPort(HelloWorldPortType.class); ``` 5. **...

    redis集群操作文档.doc

    7008节点的配置文件类似,但端口和配置文件名需相应更改。 步骤二: - 启动7007和7008节点。使用与启动原始节点相同的方式,即`redis-server`命令,指定新节点的配置文件。 5. 配置新节点: 为了将新节点加入现有...

    TCP_port端口号说明

    它可以根据客户端请求将数据转发到相应的服务端口。 ### 2. compressnet (端口2/3) 这两个端口主要用于压缩网络服务,但现在已被废弃,通常不建议使用。 ### 3. Remote Job Entry (端口5) 远程作业入口(Remote ...

    zookeeper-3.4.8.zip

    5. 集群管理:ZooKeeper可以监控集群中节点的状态,当节点发生变化时,可以触发相应的事件通知。 二、ZooKeeper 3.4.8的安装与启动 在Windows环境下,解压“zookeeper-3.4.8.zip”压缩包,你将得到一个包含配置...

    springcloud部署redis集群

    节点间需要通过网络连接,并配置好相应的端口(默认为6379,集群通信端口为16379)。 接下来,创建Redis集群。在命令行中,使用`redis-trib.rb`工具(在Redis源码包的`src`目录下)初始化集群。执行以下命令,其中`...

    XPATH读取有命名空间的节点

    4. **处理查询结果**: 查询结果通常是一个Node列表或单个Node,可以根据需求进行进一步处理,如获取节点值、修改节点属性等。 在实际开发中,可能会遇到多个命名空间的情况。在这种情况下,你需要注册并处理每个...

    FastDFS错误

    本文将总结一些常见的FastDFS错误,并提供相应的解决方法。 #### 二、常见错误及解决方案 ##### 2.1 存储节点没有开启 **错误代码**:`1.2000001512067` **错误描述**:该错误通常出现在FastDFS客户端向Tracker...

    Loadrunner在接口测试中的应用

    在接口测试中,Loadrunner 通过模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理,然后再把应答报文发送给客户端,客户端接收应答报文,这一个过程就是接口测试的原理。 在 Loadrunner ...

    2018.4.27公开课文档轻松搭建Redis缓存高可用集群.pdf

    配置完成后,使用Redis命令创建集群,并通过相应的命令检查集群状态和节点信息。 4. 集群扩展与维护:搭建完成后,Redis集群可实现自动故障转移,并支持动态添加或删除节点,实现水平扩展。集群的维护涉及监控节点...

    apache-zookeeper-3.8.1-bin.tar.gz

    根据配置文件中的`dataDir`设置,创建相应的目录,并在该目录下创建一个名为`myid`的文件,文件内容为当前服务器在集群中的ID(1-255之间)。 4. **启动Zookeeper**: 使用`bin/zkServer.sh start`命令启动...

    5-11 kubernetes容器编排技术原理和案例应用.pdf

    对于需要提供外部访问的交易服务(smartrm-trade),服务的类型需要选择NodePort(节点端口)或者LoadBalancer(负载均衡)。 Kubernetes容器编排技术原理和案例应用提供了一个高效、可靠、可扩展的容器化解决方案...

    zookeeper集群+配置手册

    在每个节点的`dataDir`下创建一个名为`myid`的文件,内容为该节点的ID(1、2或3),这与`zoo.cfg`中的`server.x`相对应,用于标识节点身份。 4. **启动Zookeeper集群** 依次启动每个节点上的Zookeeper服务,检查...

    redis StackExchange 主备 实现 demo.rar

    在设置主从复制时,开发者需要在主节点和从节点上分别配置相应的参数。主节点配置通常包括开启复制服务,而从节点则需要指定要连接的主节点地址和端口。在.NET代码中,这可以通过创建`ConnectionMultiplexer`对象并...

    redis-3.0.0.gem

    1. **连接集群**:通过 `Redis.new(cluster: ['node1:port', 'node2:port', ...])` 初始化连接,其中 `node1:port` 和 `node2:port` 是集群中的节点地址。 2. **操作数据**:执行 `get`、`set`、`hgetall` 等命令,...

    redis集群windows启动脚本

    --cluster-replicas 1`命令,其中`node_ip:port`是各个节点的地址,`--cluster-replicas 1`表示每个主节点有一个副本节点。 5. **启动脚本编写** 脚本通常会包括以下几个步骤: - 检查依赖环境,如Python(用于...

    6.1、redis 搭建集群1

    在任意一个Redis的源码目录下,运行`./redis-trib.rb create --replicas 1 [node_ip:port ...]`,这里的`--replicas 1`表示每个主节点有一个副本,即从节点。在示例中,使用了6个节点,最终会形成3个主节点和3个从...

    zookeeper之分布式环境搭建.zip

    4. **创建myid文件**:在dataDir目录下创建一个名为myid的文件,内容为该节点在集群中的唯一ID(1-255之间的数字),与zoo.cfg中的配置对应。 5. **启动Zookeeper**:在每个节点上分别启动Zookeeper服务,通过bin/...

    redis哨兵集群安装文件,配置文件

    同样,可以通过源码编译或二进制包方式获取并安装。安装完成后,需要启动Sentinel服务,并配置相应的监控和通知规则。 在配置文件方面,Sentinel的配置文件一般命名为`sentinel.conf`,其中包含了哨兵系统的各种...

    HttpClient以及获取页面内容应用

    程序可通过该对象获取服务器的响应内容。 6. 释放连接。无论执行方法是否成功,都必须释放连接 //打印服务器返回的状态 System.out.println(method.getStatusLine()); //打印返回的信息 System.out.println(method....

    netconf-node:通过节点连接到 netconf 的库

    **网络配置节点与netconf-node库** 在现代网络管理领域,Netconf(网络配置协议)是一种基于XML的协议,用于设备的配置、管理和监控。它提供了安全、标准的方法来远程配置网络设备,确保数据一致性并减少错误。...

Global site tag (gtag.js) - Google Analytics