热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Neo4j中的网络路由

人们使用Neo4j来管理企业架构。如果你还没有看到该演讲由托马斯·劳伦斯来自Amadeus的,那么你应该为自己观看。但是低层网络呢?我们可以使用Neo4j来建模物理网络中的路由吗?

人们使用Neo4j来管理企业架构。如果你还没有看到该演讲由托马斯·劳伦斯来自Amadeus的,那么你应该为自己观看。但是低层网络呢?我们可以使用Neo4j来建模物理网络中的路由吗?当然我们可以,今天我会告诉你如何。

我们将保持简单,只需要路由器,交换机,接口和服务器。路由器之间将具有“ROUTE_TO”关系。该关系将路由表包含为String Array。例如:[“10.175.112.0/20”,“10.175.108.0/22”,“10.175.112.0/20”,“10.182.14.64 / 26”...]。路由器与Interfaces之间也有“TRANSLATES_TO”关系(例如VLAN)具有ip和mac地址属性。接口与具有mac和port属性的交换机之间将具有“CONNECTS_TO”关系。最后,交换机还将具有与具有mac和port属性的服务器的“CONNECTS_TO”关系。服务器,如路由器,将具有IP地址属性。也许这张图片将有助于理解这一点:

在本练习中,让我们从一个ip为“10.175.64.2”的路由器开始,看看如何通过ip为“10.175.122.10”来访问服务器。这是我们网络的一部分图片:

我们将创建一个存储过程,通过查找我们的路由器和服务器开始。然后,我们将使用Traversal API创建TraversalDescription,它将深度探索图形,使用NetworkExpander扩展,我们将在下面讨论,并评估它遍历的路径,直到找到服务器节点。假设我们找到一些路径,我们将返回它们作为结果:

    @Procedure(名称 =  “com.maxdemarzi.router” ,模式 =  模式。READ)

    @Description(“CALL com.maxdemarzi.router(from,to) - 遍历路径”)

    public  Stream < PathResult >  router(@Name(“from”)String  from,@ Name(“to”)String  to){

        节点 路由器 =  db。findNode(标签。路由器,“ip”,来自);

        节点 服务器 =  db。findNode(标签。服务器,“ip”,to);

        if(router  !=  null  &&  server  !=  null){

            TraversalDescription  td  =  db。遍历描述()

                    。depthFirst()

                    。expand(新的 NetworkExpander(to))

                    。评估(评估者。endNodeIs(评估。INCLUDE_AND_PRUNE,

                            评价。EXCLUDE_AND_CONTINUE,server));


            返回 td。遍历(路由器)。iterator()。stream()。map(PathResult :: new);

        }

        返回 流。of(new  PathResult(null));

    }

棘手的部分是NetworkExpander,所以我们来看看吧。它的构造函数要求我们传入我们想要访问的IP地址,并将它们保存为String和IPAddress。

公共 类 NetworkExpander  实现 PathExpander < 字符串> {

    private  String  ip ;

    私有 IPAddress  ipAddress ;


    public  NetworkExpander(String  ip){

        这个。ip  =  ip ;

        这个。ipAddress  =  new  IPAddressString(ip)。getAddress();

    }

在我们的扩展器中,我们将首先通过查看ROUTES_TO关系来尝试第3层路由,并查看String Array routes属性中的任何条目是否包含我们要查找的IP地址,并选择具有较长前缀的IP地址。例如,如果我们遇到3个ROUTES_TO关系,每个关系都有一个路由表条目:

192.168。32.0 / 26  ROUTES_TO  10.1。1.1

192.168。32.0 / 24  ROUTES_TO  10.1。1.2

192.168。32.0 / 19  ROUTES_TO  10.1。1.3

......我们希望得到“192.168.32.1”,我们将所有3个关系添加到我们的无序路由中,但是在订购时,我们首先尝试将关系转到“10.1.1.1”,因为包含“192.168.32.1”在192.168.32.0/26网络(192.168.32.0到192.168.32.63)内,并且具有更长的前缀(26)。

如果我们想要“192.168.32.100”,我们将跳过第一个关系“192.168.32.0/26”,因为x.100不包括在0-63的范围内。其他两个关系是有效的,因为“192.168.32.0/24”包括192.168.32.0到192.168.32.255而“192.168.32.0/19”包括192.168.32.1到192.168.63.254,但我们先尝试“10.1.1.2”因为它有更长的前缀(24)。我来告诉你代码:

    @覆盖

    public  Iterable < Relationship >  expand(Path  path,BranchState  branchState){

        节点 last  =  路径。endNode();


        ArrayList < Relationship >  relationships  =  new  ArrayList <>();

        ArrayList < Pair < Integer,Relationship >>  unorderedRoutes  =  new  ArrayList <>();


        //第3层最长前缀匹配

        为(关系 routes_to:最后。getRelationships(关系类型。ROUTES_TO,方向。OUTGOING)){

            String [] routes  =(String [])routes_to。getProperty(“routes”,new  String [] {});

            for(String  route:routes){

                IPAddressString  addrString  =  new  IPAddressString(route);

                如果(addrString。的getAddress()。包含(ip地址)){

                    无序路线。添加(对。的(addrString。getNetworkPrefixLength(),routes_to));

                }

            }

        }

        无序路线。排序(比较。comparingInt(p  - >  -  p。第一()));

        无序路线。的forEach(p  - >  关系。添加(p。等()));

现在你可能会问自己,“IPAddressString和IPAddress来自哪里?” 它们来自Sean C. Foley的IPAddress库。如果您想自己动手,这个StackOverflow帖子可能是一个很好的起点。

一旦我们希望到达应该引导我们到服务器的路由器,我们就转到第2层。在这里,我们遍历TRANSLATES_TO关系,导致我们的IP地址,转换为mac地址,并继续我们的遍历。我们遵循具有相同mac地址的CONNECTS_TO关系,直到我们到达目的地。再一次,这是代码:

        //如果没有第3层下一跳,请转到第2层

        如果(关系。的isEmpty()){

            //第2层

            为(关系 translates_to:最后。getRelationships(关系类型。TRANSLATES_TO,方向。OUTGOING)){

                String  ip  =(String)translates_to。getProperty(“ip”);

                如果(IP。等于(此。IP)){

                    关系。add(translates_to);

                }

            }

            String  mac  =  “” ;

            关系 lastRel  =  路径。lastRelationship();

            if(lastRel  !=  null){

                mac  =(String)lastRel。getProperty(“mac”,“”);

            }


            为(关系 connects_to:最后。getRelationships(关系类型。CONNECTS_TO,方向。OUTGOING)){

                串 mac_too  =(字符串)connects_to。getProperty(“mac”,“”);

                如果(MAC。等于(mac_too)){

                    关系。add(connects_to);

                }

            }

        }

        回归 关系 ;

项目存储库中的README文件包含用于构建小型网络的密码脚本。在我们构建网络之后,我们可以尝试我们的存储过程,例如:

CALL  com 。maxdemarzi 。router ('10 .175.64.2' , '10 .175.122.10' )

......这将是我们的结果。

如果您看到的关系多于此,请确保转到Neo4j浏览器“设置”(单击侧面板上的齿轮),完全向下滚动,取消选中“连接结果节点”,然后重新运行存储过程。

与往常一样,代码在GitHub上,所以请随意尝试。此模型中的路由表是一个简单的字符串列表,但在更真实的场景中,每个条目可能是路由器之间的关系,优先级,权重和其他元属性会影响路由顺序,但是概念是一样的。



推荐阅读
  • 本文详细介绍了在Linux虚拟化部署中进行VLAN配置的方法。首先要确认Linux系统内核是否已经支持VLAN功能,然后配置物理网卡、子网卡和虚拟VLAN网卡的关系。接着介绍了在Linux配置VLAN Trunk的步骤,包括将物理网卡添加到VLAN、检查添加的VLAN虚拟网卡信息以及重启网络服务等。最后,通过验证连通性来确认配置是否成功。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 域名解析系统DNS
    文章目录前言一、域名系统概述二、因特网的域名结构三、域名服务器1.根域名服务器2.顶级域名服务器(TLD,top-leveldomain)3.权威(Authoritative)域名 ... [详细]
  • 网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • CISCO ASA防火墙Failover+multiple context详细部署By 年糕泰迪[操作系统入门]
    一.文章概述本文主要就CISCOASA防火墙的高可用和扩张性进行阐述和部署。再cisco防火墙系列中主要有3种技术来实现高可用和扩张性。分别是Failover,multiplese ... [详细]
  • php网站设计实验报告,php网站开发实训报告
    本文目录一览:1、php动态网站设计的关键技术有哪些软件,及搭建步骤需要哪些页面,分别完成 ... [详细]
  • Abp+MongoDb改造默认的审计日志存储位置
    一、背景在实际项目的开发当中,使用AbpZero自带的审计日志功能写入效率比较低。其次审计日志数据量中后期十分庞大,不适合与业务数据存放在一起。所以我们可以重新实现A ... [详细]
  • 局域网中另外一台服务器的内存_局域网共享打印机,但另外一台电脑却看不到,可能是这3个原因...
    随着人们对打印机的需求越来越多,几乎成了每一个公司的必备设备,但因为使用打印机的人数较多,又无法给每一个人单独配备一台打印机, ... [详细]
author-avatar
521壮壮妈_386
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有