前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenDaylight开发学习十问十答

OpenDaylight开发学习十问十答

作者头像
SDNLAB
发布2018-03-29 10:58:41
9720
发布2018-03-29 10:58:41
举报
文章被收录于专栏:SDNLABSDNLAB

编者说

OpenDaylight自面世起,“坑”就一直伴随着它的成长而成长,无论是起初的“不稳定”门,还是长期“言简意不赅”的文档,似乎对于想一探究竟的小伙伴总是竖着若干道高耸的壁垒。很多前期的投入者们多数在挫折面前纷纷离场,留下的那些勇毅的斗士则继续战斗,共同推动着OpenDaylight朝着更好的方向发展。其实在诸多溃败者中,往往是重技巧而轻心法者,今天未来网络君就邀请了在OpenDaylight开发征战数年的耿兴元前辈为ODLer和准ODLer们提供心法方向的指导,以期通过十问十答为大家在学习OpenDaylight开发上遇到的问题指点迷津。

1 OpenDaylight项目庞大,子项目众多,如何入手比较合适?

OpenDaylight项目很庞大,但是它有一个核心的架构理念——模型驱动的架构。OpenDaylight有几十个子项目,所有的子项目都是围绕一个核心理念设计的,所以只要理解了OpenDaylight模型驱动的设计机制及其基础框架和服务接口,再多的子项目其实也都只是一套模式。

2 学习或开发基于ODL的网络应用,应该选择哪个版本呢?

学习依然要理清自己的目的。如果我们的开发只是为了学习,建议使用ODL最新的正式发布版本,马上氮版本的SR1也要发布,可以用来学习。

如果我们的开发是用于实际的环境,为了版本的稳定性、开发过程中少遇到一些BUG,建议使用正式发布的大版本的SR2及以后的版本(SR3、SR4),当前碳版本的SR2都已经发布,可以基于该版本进行开发。

因为大版本的第一个版本往往都有故障,等经过两轮的故障收敛之后会比较稳定。另外需要注意的是社区可能对SR4版本不再进行维护,后面社区可能会出一个LTS的版本长期维护,可以选用进行开发。

还有一个建议是尽量不要基于社区的SNAPSHOT的版本进基于该版本进行开发,避免一些不必要的麻烦。当然,如果你想为社区贡献,想在社区当前分支上合入代码,肯定是要在SNAPSHOP版本上进行编译、构建。

3 学习或者开发基于ODL的应用,需要了解很多背景知识,比如Maven, OSGi, Yang等,还有一大堆网络协议, 该如何学习呢?

Java的基础一定要有, ODL是利用Java开发的,依赖大量Java的库,没有Java的基础可能会比较困难,很多语法可能会读不懂,无法入手。有了Java基础后,第一步就是建议大家花一两个星期时间看一下《Maven实战》这本书,因为ODL的项目就是用Maven管理的,所以需要了解一下Maven是什么东西,了解一下核心的内容,比如说:约定优于配置的原则、对应的核心插件、构建的基本过程这些。

还有就是需要了解一下OSGi规范,网上可以找到中文的规范,推荐4.0以后的版本。同时了解一下Karaf,看看OSGi规范和karaf之间的关系,这个过程可能也会花费一两个星期。

我们要学习ODL的MD-SAL,一定要知道Yang的基础知识,所以还需要把RFC 6020了解一下,知道yang的简单语法,至少可以看懂别人写的yang文件是什么意思。

网络的二三层的转发原理是需要知道的,SDN本质上是为了网络而开发,所以了解传统网络的基本转发原理才会深入进行开发。另外,openflow作为SDN最初的南向协议也需要了解

以上的这些知识,至少都要大概浏览一下,再在实践中用到时进行深入研究。拥有这些背景知识,在做app开发的时候才能够思路清晰。

4 编译构建的问题

编译构建的问题的问题是开发app开始的过程中经常遇到的问题:比如编译构建报错的各种异常,或者在执行第一个命令的时候要根据项目模板生成项目骨架的时候,马上就碰到问题了。这些问题其实都可以在网上查到,这时候就可以合理利用一下度娘或者谷歌了。

编译构建的问题很多时候就是Maven配置的问题,所以上一个问题中说到的《Maven实战》这本书一定要读。

编译构建的问题碰到的一般都是checkstyle不过、单元测试不过这些问题,这些都可以通过命令跳过。当然不建议大家总是遇到问题就跳过。

另外新手经常碰到的编译问题就是依赖问题,依赖找不到的问题检查一下依赖的坐标,检查下配置的maven仓库里是否存在对应坐标的组件。Maven能帮助我们很好的管理项目依赖,但如果在开发自己的项目时,不仔细梳理依赖关系,随意拷贝其他项目的pom文件,也可能导致相互依赖等严重问题,一定要注意。通过命令mvn dependency:tree可以查看项目的依赖关系。

正式开发项目时对于以上这些问题一定要分析具体问题,想办法解决。执行mvn clean install时增加参数-e,打印详细异常堆栈,增加参数-X,打开Maven的调试标记运行,查看完整的依赖踪迹。

5 版本加载运行出错

OSGi规范看了吗?(或者看书《深入理解OSGi:Equinox原理、应用与最佳实践》)。

如果已经看过了,那要看bundle处于什么状态?在那个阶段出错的?在karaf控制台,通过查看bundle相关的命令输出相关信息。通过log分析详细的出错信息。

一般都是依赖找不到或者依赖冲突的问题,如何解决?我很想告诉大家秘诀,可惜没有,只能自己仔细分析模块间的依赖关系,Import-Package,Export-Package匹配吗?包路径冲突了吗?具体问题具体分析。

6 现在的OpenDaylight发布版本里,有两套Binding 的接口,分别定义在controller和mdsal子项目,我在开发应用时,该用那个接口呢?

OpenDaylight mdsal相关接口在Berryllium版本之前,是定义在controller子项目的md-sal目录下的,从Berryllium版本开始,社区单独成立了mdsal子项目,在该项目里又重新定义了mdsal的相关接口,功能及形式与controller子项目里的几乎一致,只是包路径不同。最终应该只会保留mdsal子项目里的接口定义,但社区考虑到之前版本的兼容性,大量的子项目还是用的原来的接口,而且mdsal里的实现也在不断优化完善过程中,这样就导致了同样功能的接口变成了两套。

这两个接口我们现在都可以用,因为社区对着两个接口的实现做了兼容适配,但建议大家使用org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService,一步到位,以免社区废弃掉老的接口时,导致我们的代码必须修改。

另外一个就是同样的服务接口,有多个实现,比如

大家可以看到以上同样的服务接口有两个实现,其区别是type不同,我们在使用上述服务接口时,可以通过在blueprint配置文件里获取服务时(reference),指定不同的type来引用具体的服务接口实现。

7 对于存在DataStore里的数据,在开发应用时,是该用读事务获取数据还是直接监听数据变更?

ODL开发推荐的模式是消息驱动的开发模式。它认为网络是一个消息驱动的巨大的状态机,所有的状态变更是通过消息驱动来触发的,因此社区推荐是监听的方式,不推荐去大量的读数据库。

8 基于ODL开发应用,需要都用异步的实现吗? 能用同步吗?在什么情况下可以用同步方式?

建议大家用异步的方式,异步的方式更符合现在编程的常规。但是不代表不可以试用同步的方式,比如说业务逻辑比较简单的应用,不需要开一个线程消耗,使用同步的方式就可以实现了,但是如果是一个耗时的或者耗CPU的操作就需要异步的方式了,这个可以灵活应用。

9 配置子系统是什么?最新的发布版本里还在用吗?Blueprint和配置子系统关系?

接触ODL比较早的话就知道,在社区的早期版本里,一开始写的yang模型就是配置子系统要用的yang模型,是比较复杂的,还要写一个xml文件来配置模块的初始化或者一些服务的依赖这些东西。最新发布的版本里,用Blueprint来替代配置子系统来进行模块的初始化、服务的依赖或者发布这些操作。后期的子系统里面Bluprint会完全取代配置子系统。当前版本考虑到向前兼容,适配保留了部分配置子系统的功能。

10 如何参与ODL社区,与ODL社区互动?

需要知道ODL的一些网站,像代码库、wiki这些

官网:www.opendaylight.org

代码库:git.opendaylght.org

wiki:wiki.opendaylight.org

jira:jira.opendaylight.org

FAQ:faq.opendaylight.org

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SDNLAB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档