一、案例分析

由于Packet-in消息是Floodlight诸多模块的处理重点,因此统计Packet-in消息在某一段时间的处理量可以在一定程度上反应系统处理性能,所以此案例开发Packet-in消息统计及实现其REST查询服务。案例的基本业务逻辑如下图所示。

二、实例开发

Floodlight中开发新模块首先需要继承IFloodlightMoudle接口,并实现相应的业务逻辑,如果需要将该模块资源以REST API形式发布出去,还需要定义基于该模块的资源包装类,并在REST服务中注册该资源。此外还需要在floodlightdefault.properties和net.floodlightcontroller.core.module.IFloodlightModule文件中增加该模块名配置。

1.服务接口IPacketInHistoryService

新建服务接口IPacketInHistoryService用于查询统计结果

public interface IPacketInHistoryService extends IFloodlightService {/*** 该方法用于查询统计结果* @return*/public Long getPacket_InCount();
}

2.新建类PacketInHistory

public class PacketInHistory implements IFloodlightModule, IOFMessageListener, IPacketInHistoryService {// protected static Logger log= (Logger) LoggerFactory.getLogger(PacketInHistory.class);protected IFloodlightProviderService floodlightProviderService;protected IRestApiService restApiService;private AtomicLong PACKET_IN_COUNT=new AtomicLong();   //对长整形进行原子操作。了解JVM指令的,都知道如果赋值一个long变量,编译后,会产生多个JVM语言指令,如果处于多线程情况下对于这个变量进行加减操作会导致数据不一致。为避免此问题,Java 引入了原子变量 AtomicLong/*** 接收在statup()函数中添加监听器所监听的消息* @param sw the OpenFlow switch that sent this message* @param msg the message* @param cntx a Floodlight message context object you can use to pass* information between listeners* @return*/@Overridepublic IListener.Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) {long count=PACKET_IN_COUNT.incrementAndGet(); //Packet-in消息先加1再获取当前值Log.info("The total count of Packet-In Messages are : "+count);return Command.CONTINUE;}@Overridepublic String getName() {  //获取模块名//return "PacketInHistory";return PacketInHistory.class.getSimpleName();}@Overridepublic boolean isCallbackOrderingPrereq(OFType type, String name) {return false;}@Overridepublic boolean isCallbackOrderingPostreq(OFType type, String name) {return false;}/*** 说明模块的Services* @return*/@Overridepublic Collection<Class<? extends IFloodlightService>> getModuleServices() {Collection< Class< ? extends IFloodlightService>> list=new ArrayList<Class< ? extends IFloodlightService>>();list.add(IPacketInHistoryService.class);return list;
//        return null;}/*** 说明模块Services的实现对象* @return*/@Overridepublic Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {Map< Class< ? extends IFloodlightService>, IFloodlightService> m=new HashMap<>();m.put(IPacketInHistoryService.class,this);return m;
//        return null;}/*** 说明模块依赖关系* @return*/@Overridepublic Collection<Class<? extends IFloodlightService>> getModuleDependencies() {Collection< Class< ? extends IFloodlightService>> list=new ArrayList<Class< ? extends IFloodlightService>>();list.add(IFloodlightProviderService.class);list.add(IRestApiService.class);return list;}@Overridepublic void init(FloodlightModuleContext context) throws FloodlightModuleException {floodlightProviderService=context.getServiceImpl(IFloodlightProviderService.class); //获取FloodlightProvider(事件管理模块)的实现对象restApiService=context.getServiceImpl(IRestApiService.class);}@Overridepublic void startUp(FloodlightModuleContext context) throws FloodlightModuleException {floodlightProviderService.addOFMessageListener(OFType.PACKET_IN,this);//在类PacketInHistoryWebRoutable中资源绑定相应路径后需要在REST服务中发布,因此此处注册PacketInHistoryWebRoutable(),表明有新资源加入REST服务restApiService.addRestletRoutable(new  PacketInHistoryWebRoutable());}@Overridepublic Long getPacket_InCount() {return PACKET_IN_COUNT.get();  //获取Packet-in的值}
}

3.新建类PacketInHistoryResource

模块定义后,需要定义REST服务资源类,新建类PacketInHistoryResource,Superclass设置为ServerResource(ServerResource是Java轻量级REST框架Restlet的抽象类),并实现业务逻辑。主要功能是将Packet-in统计接口包装为REST资源便于后续资源绑定。

/*** 模块定义后,需要定义REST服务资源类。主要功能是将Packet-in统计接口包装为REST资源便于后续资源绑定。*/
public class PacketInHistoryResource extends ServerResource {@Get("json")public HashMap<String,String> retrieve(){IPacketInHistoryService pihs=(IPacketInHistoryService)getContext().  //获得Resource类上下文getAttributes()  //.get(    //IPacketInHistoryService.class.getCanonicalName());  //Java反射获取类名的一种getCanonicalName(),可以获取到内部类的全路径long count=pihs.getPacket_InCount();  //获取到当前Packet-in消息数量HashMap<String,String>resp=new HashMap<String, String>(); //存储resp.put(" Total :",Long.toString(count));return resp;}
}

4.新建PacketInHistoryWebRoutable类

/*** 绑定PacketInHistoryResource资源与访问路径*/
public class PacketInHistoryWebRoutable implements RestletRoutable {@Overridepublic Restlet getRestlet(Context context) {Router router=new Router(context);router.attach("/packetinhistroy/json",PacketInHistoryResource.class);return router;}@Overridepublic String basePath() {return "/wm/statics";}
}

三、实验结果

1.Mininet开启,创建拓扑

测试使用的交换机和主机用Mininet模拟,如下命令创建10个交换机和主机

sudo mn --mac --controller=remote,ip=192.168.0.103,port=6633 --switch ovsk --topo linear,10

拓扑图如下。

开启Floodlight控制器(运行Main.class)。在交换机和控制器建立连接后,在Mininet中执行主机ping操作,如h1 ping h2等有如下结果显示。接收Packet-in消息的数量随时间逐步增加。

2.客户端调用REST API

在/< floodlight-path>/example路径下,修改cli.py文件,增加Packet-in消息统计查询命令。修改内容如下

def lookupPath(cmd):... ...... ...elif args.cmd=='packetIn_count':path='/wm/statics/packetinhistroy/json'

然后在/< floodlight-path>/example路径下,执行命令cli.py packetIn_count有如下结果显示。该命令的使用原理是cli.py作为客户端调用REST API,REST API再调用模块内部服务接口获取统计信息,然后以JSON格式返回统计结果。

Floodlight控制器简单开发实例完成Packet_In消息统计相关推荐

  1. IOS App的简单开发实例

    在互联网浪潮下,APP的开发逐渐变得潮流和简易.而当下开发APP也成了热门行业,在现代丰富的网络资源和强大工具,环境的支持下,这一项技能也逐渐被越来越多的人掌握.但是一个APP从构想到上市,需要历经很 ...

  2. 足迹APP简单开发实例

    项目名称:足迹 项目计划:如今AR技术日益成熟,但是在日常生活中的应用并不广泛.为使更多用户可以认识并使用这一技术,团队决定为喜欢摄影,日常分享的用户开发一款以AR技术为基础的社交APP. 项目功能: ...

  3. java axis2小实例_java webservice axis2简单开发实例

    Web Service学习之axis 看着网上的资料学习了一下,做点笔记以防以后忘记. 一.准备工作: 到axis官方网站下载相应的jar包,我下的是1.4final版. http://www.doc ...

  4. Struts2的两个蝴蝶飞,你好简单开发(一)

    我把你的头像,设置成我的名字,此刻你便与我同在. 我把你的名字,写进我的代码里面,以后,我的世界便存在着你. "两个蝴蝶飞"特别喜欢"java1234知识分享网" ...

  5. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

  6. python简单编程例子-中文方便就用中文编程!Python图形界面开发实例

    原标题:中文方便就用中文编程!Python图形界面开发实例 之前做的一个Python小程序,功能很简单,面对用户群也很窄,是五笔编码编.校人员使用的五笔编码编辑器. 这样的"周末" ...

  7. 《Abaqus GUI程序开发指南(Python语言)》——第一章 概述1.1 简单插件实例——创建带孔板有限元模型...

    本节书摘来自异步社区<Abaqus GUI程序开发指南(Python语言)>一书中的第1章,第1.1节,作者: 贾利勇 , 富琛阳子 , 贺高 , 周正光 更多章节内容可以访问云栖社区&q ...

  8. python项目开发实例-Python小项目:快速开发出一个简单的学生管理系统

    本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: 包括: 学校信息的管理 教师信息的管理 学生信息的管理 根据A ...

  9. CSS3 低多边形(Low Poly)设计及开发实例 - 简单的字母

    Low Poly是计算机主流设计风格的一种. 当前主流设计风格包括: 1.拟物(Skeuomorph) 2.平面化(Flat Design) 3.长阴影(Long Shadow) 4.响应式(Resp ...

最新文章

  1. 计算机组成原理习题(一)
  2. KingShard MySQL中间件快速入门
  3. 原创数据结构算法Flash动画演示课件-Action Script(AS)脚本实现
  4. Xcode 3.2.5免证书开发调试[转]
  5. java的8中数据类型_java 8种基本数据类型
  6. java 数组 内存_图解Java数组的内存分配
  7. ElasticSearch 复合查询
  8. 使用HttpWebRequest方式访问外部接口
  9. biee12c连接hive_BIEE 12c Linux下连接Hadoop Hive
  10. 在C++与python间传视频帧
  11. 如何基于Arduino开发板使用BH1750环境光传感器
  12. 【摘要】STC系列单片机ISP编程器/烧录器的说明
  13. c++《AVL树的概念》《AVL树的插入》《AVL树的旋转》《AVL树的验证》《AVL树的删除》《AVL树的性能》
  14. 文献阅读:SimCSE:Simple Contrastive Learning of Sentence Embeddings
  15. @vue3 element-plus 按需引入,默认英文组件修改为中文
  16. 拾起童年的回忆 - 手把手教你制作飞机大战小游戏
  17. 开源PLM软件Aras详解一 安装
  18. 第一代真空电子管计算机主要应用范围是,计算机应用基础知识课件.ppt
  19. [生存志] 第110节 黄石公圯上授三略
  20. 如何实现DCS系统与其他网口设备的以太网通讯?

热门文章

  1. MySQL 服务无法启动且不报任何错误解决方法之一
  2. [机器学习]t-SNE聚类算法实践指南
  3. 分享一个模拟ATM取款机的DEMO
  4. SpringBoot使用swagger-spring-boot-starter maven依赖包实现Swagger2
  5. Asp.Net 获取FileUpload控件的文件路径、文件名、扩展名
  6. 视频美颜sdk中人脸识别的主要实现流程
  7. 我在学习小程序之flex布局
  8. hadoop在windows下安装
  9. 【JAVA】蛇行矩阵
  10. python制作会动的表情包_python画微信表情符的实例代码