博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZStack源码剖析之二次开发——可扩展框架
阅读量:5900 次
发布时间:2019-06-19

本文共 2574 字,大约阅读时间需要 8 分钟。

本文首发于泊浮目的专栏:

前言

在中,官方提出了几个较为经典的扩展方式。但在实际的二次开发中,这些做法未必能够完全满足需求。今天笔者就和大家一起来看一看一些常见的扩展方法。

扩展是最佳选项

ZStack作为一个开源的产品化Iaas,随着其每个版本的更新发布,都携带了极多的feature,并由其测试天团进行严密的测试后发布来保证质量。同时,每个版本也会携带大量的bug fix。

如果在自己fork的ZStack中耦合了过多自己的代码(对于Iaas的扩展或自己的业务逻辑),会导致跟不上master分支,这样会丢失掉很多高质量feature和bug的fix。

扩展的特殊技巧

ExtensionPoint

在中,笔者提到过基于观察者模式的ExtensionPoint。其本质是通过Java的Interface来定义一系列的实现类,并收集它们来调用,这样它们可以散落在各个模块中,但在Application起来时它们却一起被Spring加载到了内存中。

利用这种方法,我们可以很容易的添加自己的代码到模块中,但又不影响主干代码。

在此前提上,也可以关注代码中的ExtensionPointEmitter,该组件也是参考了这样的设计。

Flow

在一文中,我们了解到Flow是ZStack的基础设施之一,同时也允许通过XML显示声明的方式来声明Flow。因此,我们可以通过添加自己的Flow来执行一些自己的扩展逻辑。

Event

基于EventFacadefire的路径上定义接收点。如在HostBase中,定义了HOST_DELETED_PATH。我们可以选择在自己的代码模块中注册一个evft.on。用于执行自己的逻辑。

chain.done(new FlowDoneHandler(msg) {            @Override            public void handle(Map data) {                casf.asyncCascadeFull(CascadeConstant.DELETION_CLEANUP_CODE, issuer, ctx, new NopeCompletion());                bus.publish(evt);                HostDeletedData d = new HostDeletedData();                d.setInventory(HostInventory.valueOf(self));                d.setHostUuid(self.getUuid());                evtf.fire(HostCanonicalEvents.HOST_DELETED_PATH, d);            }        }).error(new FlowErrorHandler(msg) {            @Override            public void handle(ErrorCode errCode, Map data) {                evt.setError(errf.instantiateErrorCode(SysErrors.DELETE_RESOURCE_ERROR, errCode));                bus.publish(evt);            }        }).start();

Backend

这里以为例,我们先简单的看一下这个类

public class KvmBackend extends HypervisorBackend

HypervisorBackend继承了HypervisorBackendHypervisorBackend继承了SMPPrimaryStorageBaseSMPPrimaryStorageBase继承了PrimaryStorageBase

我们来看一下,KvmBackend 里handle什么样的消息。

我们可以看到,这些Msg执行的逻辑和主存储类型息息相关,不能以同一个PrimaryStorageBase来一概而论。因此,同一个Msg在不同类型的存储、不同的场景下会有不一样的逻辑来handle。

同理,一些ManagerImpl也可以使用继承进行扩展。

简单来说,就是对基类进行扩展,覆写那些我们需要修改的方法。

模块化工程

在ZStack中,有许许多多的代码模块。在扩展自己的业务逻辑时,最好新建一个Module用于存放自己的代码,对于模块和Bean的依赖可以按需放入(类似Plugin的形式)。并结合以上的几个方式来进行扩展。

那么在这个过程中,该注意哪些事项呢?

Spring的配置

在ZStack中,我们可以看到所有的Bean配置都是由ZStack.xml管理的,

而引用xml的地方则是这里:

因此,我们需要注意引入的xml是否有被配置起来。

JPA的配置

ZStack使用了Hibernate 这个ORM框架,并对映射类用XML的形式来管理。即:persistence.xml

需要注意的是,在DatabaseFacade的XML配置文件中,引用了该配置文件。因此对于这个文件的方式建议是覆写(即再创建一个persistence.xml,用于引用ZStack中的表对象和自己的表对象),而不是再配置一个进行引用。因为这样可能会影响主干代码。

保证ZStack的主干没有被自己的代码影响

ZStack在Test目录下提供了大量Case。在完成自己的扩展后(照理论上来说不应该改动ZStack的源代码),可以尝试在该目录下跑所有的Case:

mvn compile && cd test && mvn test -Dtest=ZStackTest

如果都跑过了,则证明ZStack的主干代码可能没有受到影响。

小结

在本文中,笔者介绍了几种较为优雅的扩展方式。利用这些方法可以让我们较为方便的跟上主线,避免花大量精力在解决冲突上。

当然,如果大家有更好的扩展方式,也可以在评论区补充。

转载地址:http://fiesx.baihongyu.com/

你可能感兴趣的文章
机器学习的原理
查看>>
flink watermark介绍
查看>>
[Flink原理介绍第四篇】:Flink的Checkpoint和Savepoint介绍
查看>>
mybatis学习之一 开发环境配置和接口编程
查看>>
Android Xutils 框架
查看>>
C#基础知识整理 基础知识(21) 委托(二)
查看>>
Android应用程序键盘(Keyboard)消息处理机制分析(16)
查看>>
Sysbench 0.5版安装配置
查看>>
统一沟通-技巧-11-Lync-联盟-无法-音频-远程桌面-传文件
查看>>
书摘—你不可不知的心理策略
查看>>
【博客话题】毕业——开始人生的艰苦历程
查看>>
2014.7.30-8.3日广大网友的提问解答(答问题的第2个工作周)
查看>>
Powershell管理系列(二十五)PowerShell操作之获取AD账号及邮箱信息
查看>>
Linux安装telnet
查看>>
【高德地图API】从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物...
查看>>
openstack nova修改实例路径,虚拟磁盘路径
查看>>
java.sql.SQLException: Lock wait timeout exceeded --转
查看>>
使用C#进行图像处理的几种方法(转)
查看>>
Ajax原理学习
查看>>
sap scriptfom 多语言翻译
查看>>