ZStack--通用插件系统

zstack(四)zstack架构简介 本篇简单介绍一下zstack的架构设计。现在的zstack加入了一个新的模块woodpecher,用于自动化测试。由于本人对这块没有研究过,这里先不讲这个。 阅读详情

当前IaaS软件更像云控制器软件,要成为一个完整的云解决方案还缺少很多特性(features)。作为一个正在发展中的技术,预测一个完整的解决方案的必备的所有特性是非常困难的,所以一个IaaS软件不可能在一开始就完成它所有的特性。基于以上事实,一个IaaS软件的架构必须有能力,在添加新特性的同时保持核心结构稳定。ZStack的通用插件系统,使得特性可以像插件一样实现(在线程内或在线程外),这样不只能使ZStack的功能得到了拓展,也可以注入业务逻辑内部去改变默认的行为。

动机

eBay管理OpenStack私有云的首席工程师,Subbu Allamaraju曾说过:

然而,OpenStack是一个云控制器软件。尽管社区为OpenStack的组建做出了巨大贡献,但是安装好的一个OpenStack实例并不能算一个云。作为一个操纵者你必须处理许许多多的用户不一定知道的附加的操作。这些包括基础的员工培训、初始化、维护、配置管理、补丁、打包、升级、高可用性、监控、度量、用户支持、容量预测和管理、计费或退款、资源回收、安全、防火墙、DNS、与其他内部的基础设施和工具的集成,等等,等等。这些活动将花费大量的时间和精力。OpenStack给出了一些创建云必备的成分,但并没有把云打包好。

这表达当前IaaS软件的处境,除了一些构建的非常好的IaaS(像AWS),大多数IaaS(包括我们的ZStack)仍然不是一个完整的云解决方案。由于像Amazon这样的已经探索多年的先驱,公有云已经有一个更成熟的模型,对于公共云解决方案应该是什么样子而言。由于仍然处在开发阶段,私有云目前还没有经过验证的完整的解决方案。不像专用的公有云软件,可以专门为制造商的基础设施和服务定制;开源的IaaS软件必须同时考虑公有云和私有云的需求,使得创建一个完整的解决方案变得更加困难。因为我们没有办法预测一个完整的解决方案应该是什么样,我们唯一的办法是提供一个插件式的架构,它能在添加插件的同时,不影响核心业务稳定性。

问题

许多软件声称自己是插件式的,但是很多并不是真的插件式的,或至少不是完全插件式的。在解释原因之前,让我们看两种主要的插件式架构的形式。虽然有很多文章讨论过这个话题,以我们的经验来看,我们把所有插件归纳成两种结构,可以被准确的描述为GoF design patterns一书中的策略模式和观察者模式。

源自策略者模式的插件

这种形式的插件通常是通过提供不同的实现,拓展软件特定的功能;或者通过添加插件APIs去添加新的功能。我们熟悉的很多软件都是通过这种模式搭建的,比如,操作系统的驱动,网页浏览器的插件。这种插件组成的工作方式是,允许应用程序通过定义良好的协议去访问插件。

在这里插入图片描述

源自观察者模式的插件

这种形式的插件通常注入应用程序的业务逻辑,针对特定的事件。一旦一个事件发生,挂在上面的插件将被调用,以执行一段甚至可能改变执行流的代码,比如,当事件满足某些条件,抛出异常去停止执行流。基于这种模式的插件通常对最终用户是透明的、纯内部实现的,例如,一个监听器监听数据库插入事件。这种插件的工作方式是,允许插件通过定义良好的扩展点去访问应用程序。

在这里插入图片描述

大多数软件声称它们是插件式的,要么实现了这些组成方式中的一种,要么有一部分代码实现这些组成方式。为了变得完全插件化,软件必须设想到这么一个想法,即所有的业务逻辑都使用这两种方式实现。这意味着整个软件是由大量的小插件组成的,就像乐高玩具一样。

插件系统

一个重要的设计原则贯穿了所有ZStack的组件:每一个组件都应该被这么设计,信息最少、自包含、无关其他组件。比如,为了创建一个虚拟机,分配磁盘、提供DHCP、建立SNAT都是非常必要的步骤,管理创建VM的组件应该非常清楚。但是它真的需要知道这么多吗?为什么这个组件不能简化为,分配VM的CPU/内存,然后给主机发送启动请求,让其他组件,像存储、网络来关心它们自己的事情。你可能已经猜到了这个答案:不,在ZStack中,组件并不需要知道那么多,没错!可以是那么简单。我们充分意识到这么一个事实,你的组件知道的信息越多,你的应用程序耦合越紧密,最终你得到一个复杂的难以修改的软件。所以我们提供以下插件形式来保证我们的架构是松耦合的,并且使我们容易添加新特性,最终形成一个完整的云解决方案。

1.策略模式插件

通常IaaS软件中的插件是整合不同物理资源的驱动。例如,NFS主存储,ISCSI主存储,基于VLAN的L2网络,基于Open vSwitch的L2网络;这些插件都是我们刚刚提到的策略模式的形式。ZStack已经将云资源抽象成:虚拟机管理器、主存储、备份存储、L2网络、L3网络等等。每个资源都有一个相关的驱动程序,作为一个单独的插件。要添加一个新的驱动程序,开发人员只需要实现三个组件:一个类型,一个工厂,和一个具体的资源实现,这些全部都被封装在单一的插件中,通常被构建成一个jar文件。引用Open vSwitch举一个例子,让我们假定我们将创建一个使用Open vSwitch作为后台的新L2网络,然后开发者需要:

1.1定义一个Open vSwitch类型的L2网络,它将自动注册到ZStack L2网络类型系统中。

public static
L2NetworkType type = new L2NetworkType(“Openvswitch”);

/* once the type is declared as above, there will be a
new L2 network type called ‘Openvswitch’ that can be retrieved by
API */(一旦类型被声明,一个新的叫做“Openvswitch”的l2网络类型可以被API检索)

1.2创建一个L2网络工厂,负责将一个具体的实现返回给L2网络服务。

public class OpenvswitchL2NetworkFactory implements
L2NetworkFactory {

@Override

public

L2NetworkType getType() {

    /* return type defined in 1.1 */

    return type;

}



@Override

public

L2NetworkInventory createL2Network(L2NetworkVO
vo,
APICreateL2NetworkMsg msg) {

    /*

     * new

resource will normally have own creational API APICreateOpenvswitchL2NetworkMsg
that

     * usually

inherits APICreateL2NetworkMsg, and own database object OpenvswitchL2NetworkVO
that

     * usually

inherits L2NetworkVO, and a java bean OpenvswitchL2NetworkInventory that
usually inherits

     *

L2NetworkInventory representing all properties of Openvswitch L2 network.

     */(新的资源将通常有一个创建的API APICreateOpenvswitchL2NetworkMsg,通常继承自APICreateL2NetworkMsg,还将有自己的数据库对象,OpenvswitchL2NetworkVO,通常继承自L2NetworkVO,和一个java bean OpenvswitchL2NetworkInventory,通常在L2NetworkInventory中表示Openvswitch

L2网络的所有属性)

APICreateOpenvswitchL2NetworkMsg cmsg = (APICreateOpenvswitchL2NetworkMsg)APICreateL2NetworkMsg;

OpenvswitchL2NetworkVO cvo = new OpenvswitchL2NetworkVO(vo);

evaluate_OpenvswitchL2NetworkVO_with_parameters_in_API(cvo, cmsg);

save_to_database(cvo);

     return

OpenvswitchL2NetworkInventory.valueOf(cvo);

}



@Override

public L2Network getL2Network(L2NetworkVO vo) {

    /* return the concrete implementation defined in 1.3 */

    return new OpenvswitchL2Network(vo);

}

}

1.3创建一个具体的Open vSwitch L2网络实现,跟后台Open vSwitch控制器进行交互。

public class OpenvswitchL2Network extends L2NoVlanNetwork { public OpenvswitchL2Network(L2NetworkVO self) { super(self); } @Override public void handleMessage(Message msg) { /* handle Openvswitch L2 network specific messages(both API and non API) and delegate * others to the base class L2NoVlanNetwork; so the implementation can focus on own business * logic and let the base class handle things like attaching cluster, detaching cluster; * of course, the implementation can override any message handler if it wants, for example, * override L2NetworkDeletionMsg to do some cleanup work before being deleted.(处理和Openvswitch L2网络相关的特定消息(API消息或不是API的消息),并把其他消息交给L2NoVlanNetwork的基础类处理;所以它的实现可以关注它自身的业务逻辑,并让基础类处理一些如绑定集群,解绑集群,的事情。当然,实现方法也可以覆盖任何消息处理器,例如,覆盖L2NetworkDeletionMsg在删除前做一些清理工作。) */ if (msg instanceof OpenvswitchL2NetworkSpecificMsg1) { handle((OpenvswitchL2NetworkSpecificMsg1)msg); } else if (msg instanceof OpenvswitchL2NetworkSpecificMsg2) { handle((OpenvswitchL2NetworkSpecificMsg2)msg); } else { super.handleMessage(msg); } }}

让三个组件一起放到一个Maven模块中,添加一些必须的Spring配置文件,并编译为JAR文件,你就在ZStack中创建了一个新的L2网络类型。所有的Zstack资源驱动程序都是通过以上步骤实现的(类型,工厂,具体实现)。一旦你已经学会了怎么为一个资源创建驱动程序,你就学会了怎么为所有的资源这么做。正如我们在“ZStack–进程内的微服务架构”中提到的一样,驱动可以有自己的API和配置方法。

2.观察者模式插件

策略模式的插件(驱动)允许你扩展现有的ZStack的功能;然而,为了使架构松耦合,插件必须能注入应用程序的业务逻辑,甚至是其他插件的业务逻辑;观察模式插件的关键是拓展点,拓展点允许一段插件的代码在一个代码流运行的时候被调用。目前Zstack定义了大约100个扩展点,暴露了大量让插件去接收事件或改变代码流行为的场景。创建一个新的扩展点就是定义一个java接口,组件可以很容易地创建扩展点,以允许其他组件注入自己的业务逻辑。为了了解它是如何工作的,让我们继续我们的Open vSwitch的例子;假设Open vSwitch L2网络需要钩入创建VM的过程,以在VM创建之前准备好GRE隧道,该插件实现如下:

PreVmInstantiateResourceExtensionPoint:

public class OpenvswitchL2NetworkCreateGRETunnel implements PreVmInstantiateResourceExtensionPoint { @Override public void preBeforeInstantiateVmResource(VmInstanceSpec spec) throws VmInstantiateResourceException { /* * you can do some check here; if any condition makes you think the VM should not be created/started, * you can throw VmInstantiateResourceException to stop it / } @Override public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) { / create the GRE tunnel, you can get all necessary information about the VM from VmInstanceSpec / completion.success(); } @Override public void preReleaseVmResource(VmInstanceSpec spec, Completion completion) { / *in case VM fails to create/start for some reason, for cleanup, you can delete the prior created GRE tunnel here */ completion.success(); }}

当ZStack连接到KVM主机,Open vSwitch L2网络想要在主机上检查并启动Open vSwitch的守护进程,那么它实现KVMHostConnectExtensionPoint:

public class OpenvswitchL2NetworkKVMHostConnectedExtension implements KVMHostConnectExtensionPoint { @Override public void kvmHostConnected(KVMHostConnectedContext context) throws KVMHostConnectException { /* * you can use various methods like SSH login, HTTP call to KVM agent to check the Openvswitch daemon你可以使用很多方式(如SSH登录,KVM代理的HTTP调用)通过使用在KVMHostConnectedContext上的信息,去检查在主机上的Openvswitch的守护进程。如果任意状态让你认为主机不能提供Openvswitch L2网络方法,你可以抛出KVMHostConnectExtensionPoint去阻止主机连接。 * on the host, using information in KVMHostConnectedContext. If any condition makes you think the * host cannot provide Openvswitch L2 network function, you can throw KVMHostConnectExtensionPoint to * stop the host from being connected. */ }}

最后,你需要宣传你有两个组件实现了这些扩展点,ZStack的插件系统将确保所有者在一个适当的时间调用你的组件。该通知是在插件的Spring配置文件中完成的:

<?xml version="1.0" encoding="UTF-8"?>

这就是你所需要做的一切。创建一个新类型的L2网络,却不需要更改其他任意一个ZStack组件的甚至一行代码。这是ZStack保持其核心业务流程稳定的基础。

不要OSGI:熟悉Eclipse和OSGI的人可能已经注意到,我们的插件系统和eclipse、OSGI的非常相似。可能有人会问,为什么我们不直接使用OSGI,它可是为Java应用程序创建插件系统而专门设计的。实际上,我们花费了相当多的时间尝试OSGI;然而,我们感觉它是用力过猛。我们不喜欢在我们的应用程序有另一个容器,不喜欢单独的类装载器,不喜欢它创建插件的复杂性。看起来OSGI正付出大量努力使插件相互隔离,但ZStack想让插件扁平化。我们已经注意到,许多项目在代码中引入了不必要的限制,以使整体架构明显是分层的、隔离的,但由于设计糟糕的接口,插件必须写很多丑陋的代码来克服这些限制,反而打乱了真正的架构。ZStack将所有的插件作为自己核心的一部分来考虑,针对核心业务流程拥有一样的特权。我们不是构建一个类似浏览器的消费级应用程序,用户可能会错误地安装恶意插件;我们是在构建一个企业级软件,每一个角落都需要经过严格的测试。一个扁平的插件系统使我们的代码变得简单和健壮。

3.进程外的服务(插件)

除了以上两种方式外,开发人员确实有第三种方式扩展ZStack–进程外服务。虽然ZStack把所有的编排服务包装成一个单一的进程,独立于业务流程服务的功能可以被实现为独立的服务,这些服务运行在不同的进程甚至不同的机器上。ZStack Web UI,一个通过RabbitMQ和ZStack编排服务进行交互的Python应用程序,是一个很好的例子。ZStack有一个定义良好的消息规范,进程外的服务可以用任何语言编写,只要它们能通过RabbitMQ进行交互。ZStack也有称为canonical event的机制,用于暴露一些内部事件给总线,比如VM创建,VM停止,磁盘创建。诸如计费系统的软件完全可以通过监听这些事件,建立一个进程外的服务。如果一个服务想要在进程外,但仍需要访问一些还没有暴露的核心业务流程的数据结构,或需要访问数据库,它可以使用一种混合的方式,即在管理节点上的一块小插件负责采集数据并将它们发送给消息代理,在进程外的服务接受这些数据并完成自己的事情。

总结

在这篇文章中,我们展示了ZStack的插件架构。虽然ZStack并没有成为一个完整的云解决方案,但是它提供了一个架构,可以将任何未来所需要的特性构建成插件(进程内或进程外),在保持核心业务流程稳定的同时,使得快速发展成为一个成熟的、完整的云解决方案变得可能。

zstack(一)运行及开发环境搭建及说明 本文档用于vStack的开发以及调试方法,以及安装后路径说明 阅读详情

相关推荐

ZStack(三)-zstack代码结构简介

本篇主要介绍一下ZStack开源版本的代码组成,简单介绍各个目录代码的作用。 从最新的官网上看,现在zstack项目有四部分组成,包括zstack、zstack-dashboard、zstack-utility、zstack-woodpecker

任杰的博客 6027

ZStack:通用插件系统

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33910434的博客 241

ZStack——存储模型:主存储和备份存储

ZStack通过逻辑功能,将存储系统抽象成主存储和备份存储。一个主存储是一个存放VM磁盘的存储池;一个备份存储是这么一个存储,用户存储镜像模板、备份的磁盘、快照。主存储和备份存储可以是物理分离的存储系统,也可以是同一个存储系统同时扮演两种角色。存储厂商可以轻松地,通过实现相应的存储插件,在ZStack中加入他们的产品。 概述 云中的存储系统可以以它们的逻辑功能被分为两类。一类作为存储池工作,存储V...

zstack_org的博客 2529

ZStack技术介绍

近年来随着互联网业务的迅速发展以及新兴业务激增,业务数据呈现几何倍数增加,传统服务器+存储的竖井式架构已无法很好满足业务发展需求,分布式、云化技术应运而生。越来越多企业采用虚拟化与云计算技术来构建IT系统,提升IT系统的资源利用率以及缩短业务上线周期。但在应用过程中,企业面临如下挑战:1)系统庞大,管理复杂,运维费用持续走高。2)安装部署复杂,硬件来自多厂商,规划、部署、调优需要丰富的经验支撑。3)多厂商设备,售后支持界面多,解决问题慢。

顺其自然~专栏 3720

ZStack云计算架构探秘(三): 超强灵活性和可扩展性

在前面探秘一和探秘二中,我们已经分享了ZStack的拓扑结构和如何实现超高可伸缩性的能力。还记得我们在Why ZStack中说的,稳定性和灵活性是IaaS需要解决的两大问题。今天我们就来揭开ZStack超强灵活性的奥秘。 今天的内容非常的丰富,我们先来看一下什么是灵活性。所谓灵活性无非是三个方面:当需要添加新功能的时候简单方便,不拖泥带水;系统升级轻巧无障碍;IaaS云配置想改就改,无需重头搭建

zstack_org的博客 5085

ZStack 5分钟 | 浅谈核心架构设计特点

ZStack是下一代开源的云计算IaaS(基础架构即服务)软件。它主要面向未来的智能数据中心,通过提供灵活完善的APIs来管理包括计算、存储和网络在内的数据中心资源。用户可以利用ZStack快速构建自己的智能云数据中心,也可以在稳定的ZStack之上搭建灵活的云应用场景,例如VDI(虚拟桌面基础架构)、PaaS(平台即服务)、SaaS(软件即服务)等。 ZStack提供了对企业数据中心基础设施的计...

zstack_org的博客 1764

产品上新|ZStack3.5.0正式发布啦!

海量产品资料传送门~ 一、ZStack全线产品下载通道汇总 社区版(免费): https://www.zstack.io/product/zstack_open_source/ 企业版下载: https://www.zstack.io/product/zstack_enterprise/# 混合云版: https://www.zstack.io/product/zstack_hybrid/ 分布...

zstack_org的博客 1200

ZStack实践汇|ZStack与行云管家对接实践

一、ZStack与行云管家概述 大道至简·极速部署,ZStack致力于产品化私有云和混合云。 ZStack是一家坚持自主创新、专注产品化的云计算公司,以“降低企业上云门槛、让每一家企业都拥有自己的云”为使命,提供自研的ZStack私有云、ZStack混合云、ZStack Mini超融合一体机、ZStack CMP多云管理平台、ZStack企业级分布式存储等产品和方案。 作为新一代创新开源的云计算IaaS软件,ZStack由英特尔、微软、CloudStack等世界上最早一批虚拟化工程师创建,拥有KVM、Xen

科普资讯 866

zstack与openstack区别

针对采用OpenStack部署云平台的复杂性,优快云此前介绍过的ZStack是另外一种解决方案。本文是ZStack的深度试用报告,分别从部署、架构和网络三个层面介绍作者的试用体验,并与OpenStack进行简单对比,文章最后也对ZStack的改进方向提出了思考。以下为全文内容: “这是最好的时代,也是最坏的时代”。这句名言也是当前云计算大环境的真实写照。云计算给企业带来极大的便利,不但能够

tutubuchicao的博客 1万+

【ZStack】自动化测试系统1——集成测试

测试,对于一个IaaS软件的可靠性、成熟度和可维护性而言,是一个重要的因素.测试在ZStack中是全自动的。这个自动化测试系统包括了三个部分:集成测试,系统测试,基于模块的测试。其中集成测试构建于Junit之上,使用了模拟器。通过这个集成测试系统提供的各种各样的功能,开发人员可以快速的写出测试用例,用于验证一个新特性或者一个缺陷修复。 概述 这个关键因素,在构建一个可靠的、成熟的和可维护的软件产品中,就是架构;这是我们自始自终相信的设计原则。ZStack已经付出了大量的努力,以设计这么一个架构:始终保持

阿星君 754

ZStack——自动化测试系统3:基于模型的测试

模型测试系统是zstack-woodpecker中的一个子项目。通过有限状态机和行为选择策略,它可以产生随机的API操作,一直运行下去,直到遇到一个缺陷或者预定义的退出条件。ZStack依赖模型测试去测试真实世界中难以遇到的边界用例,在测试覆盖度方面补充集成测试和系统测试。 概述 测试覆盖率是一个判断一个测试系统品质的重要指示器。常规测试方法论,例如单元测试,集成测试,系统测试,都是由人类逻辑思考...

zstack_org的博客 565

ZStack--标签系统

ZStack中的标签不仅帮助用户聚集资源,也帮助控制软件行为。ZStack有一套完整的规范,用以定义标签的类别、形式和用法。除了用户外,插件也可以创建自己的标签,以记录元数据和拓展现有的资源属性;通过这些手段,标签可以帮助插件引入新的特性,而不改变ZStack的数据库结构,消除了在软件升级对数据库迁移的需求。 动机 随着云中资源的不断增长,用户可能会想要有一种方式,使用人类可读的标签,去分组相似的...

zstack_org的博客 657

ZStack--虚拟路由网络服务提供模块

在ZStack的网络模型中,OSI第4~7层网络服务被实现为来自不同服务提供模块的小插件。默认提供模块,称为虚拟路由,采用定制的Linux虚拟机作为虚拟设备,为每一个L3网络提供包括DHCP、DNS、NAT、EIP和端口转发在内的网络服务。使用虚拟机作为虚拟路由器的方式的优点有:没有单点故障、对物理设备没有特殊要求,因此用户无需购买昂贵的硬件,就可以在商用设备上实现各种网络服务。 概述 正如“ZS...

zstack_org的博客 1029

ZStack——自动化测试系统1:集成测试

   测试,对于一个IaaS软件的可靠性、成熟度和可维护性而言,是一个重要的因素.测试在ZStack中是全自动的。这个自动化测试系统包括了三个部分:集成测试,系统测试,基于模块的测试。其中集成测试构建于Junit之上,使用了模拟器。通过这个集成测试系统提供的各种各样的功能,开发人员可以快速的写出测试用例,用于验证一个新特性或者一个缺陷修复。    概述    这个关键因素,在构建一个可靠的、成熟的...

V_WOD123的博客 3860

ZStack--网络模型1:L2和L3网络

ZStack将网络模型抽象为L2和L3网络。L2网络提供一种二层网络隔离的方式,而L3网络主要和OSI七层模型中第4层~第7层网络服务相对应。我们的想法是使用管理员熟悉的术语和概念,来形容ZStack的网络模型,使得管理员可以方便快捷的创建网络拓扑。 注:我们将不涉及任何在Hypervisor端虚拟化技术的网络实现细节;例如,我们将不讨论ZStack如何在Linux操作系统中创造网桥或VLAN设备...

zstack_org的博客 3143

ZStack--进程内的微服务架构

为了应对诸如惊人的操作开销、重复的努力、可测试性等微服务通常面临的挑战,以及获得诸如代码解耦,易于横向扩展等微服务带来的好处,ZStack将所有服务包含在单个进程中,称为管理节点,构建一个进程内的微服务架构。 动机 构建一个IaaS软件是很难的,这是一个已经从市场上现存的IaaS软件获得的教训。作为一个集成软件,IaaS软件通常需要去管理复杂的各种各样的子系统(如:虚拟机管理器hypervisor...

zstack_org的博客 609
上一篇: ZStack--工作流引擎
下一篇: ZStack--进程内的微服务架构
普通网友
博客等级 码龄10年 769粉丝 269原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值