【组件治理】设计总览 + 用户故事

📡 能力概览


👨‍💻 用户故事

本文档以基于故事的格式介绍了开放应用程序模型。 其目标是帮助最终用户和开发人员快速理解也使用本系统。

在下面的内容中,我们将介绍一个描述应用程序交付生命周期的故事。 故事情节看起来像这样:

  • richardcarian是聊天室组件开发者,分别负责终端和后端的开发工作。在协作完成组件的开发工作后,他们希望将组件发布出来。在这个故事中, 他们希望达成的目的有:

  • reboot 是一名终端工程师,是应用程序开发者。他已经开发了一款应用,并希望在这个应用中添加一个聊天室功能。 除此之外, 由于运用DevOps的理念, 后期的运维工作也由reboot来完成。因此他希望有一套系统能帮他完成如下一些工作:

  • waton 的职位是组件商店审核人员,其主要目的是保证在他的组件商店中的组件质量足够的可靠。因此他对于系统的诉求主要是:

在将系统拆解完成之后, 我们先来看一个实际的User Story。 在这个故事中, 有多名角色参与。并在不同的阶段合作完成,合作完成整个开发工作。

阶段一:端云一体的组件开发工作

聊天组件由客户端SDK和后台服务两部分组成。这两份工作分别由客户端工程师Richard, 和后台工程师Carian负责。根据对于聊天组件的设想, 一个集成了聊天组建的App如下图所示:


终端开发部分

STEP 1:对UI进行简单拆解,明确组件边界

根据对于聊天组件的需求分析, 作为终端工程师richard将聊天组件先从UI上进行了拆解, 明确了组件的边界,即下图中聊天组件的部分,其主要包含一个集成在宿主界面上的widget和一个内部弹出的activity:


此外宿主应用的部分会随着宿主程序的不同有不同的展示, 在客户端组件的开发过程中,richard不需要去编写一个宿主应用。但为了方便开发和演示,在每个组件工程中“sample”目录下会提供一套预置好的脚手架代码。

STEP 2:创建组件工程,理解工程结构。

接下来开始正式的开发部分了,首先从创建项目开始。richard通过raft SDK中自带的cli工具可以快速的创建出一个Android组件工程。如下是创建Android组件工程所需要的命令:

# 提示:
# create 命令格式: create [组件名称] --type [组件类型]

$ raft-cli create _ChatComponent_ _--type AndroidComponent_

之后在本地会创建出 ChatComponent 文件夹,目录结构如下:

├── app
│   └── src
│        ├─ component   # 用于存放组件源码的目录(主要工作区域)
│        └─ sample      # 用于存放演示app的目录
│
├── gradlew.bat
├── build.gradle
│
├── raft_modules # 所依赖的组件源码(目录)
├── setting.yml  # 配置文件
├── metadata.yml # 元数据文件
└── ci.yml # 持续集成文件

这个项目除了基础的Android文件之外, 新增了几个raft相关的目录:

同时, 此工程也为开发者提前创建好了一个组件开发方面的“脚手架”,这个“脚手架”类似组件集成的容器即之前说的 宿主应用的部分。

sample 目录下的 activity_sample.xml 的布局代码如下:


STEP 3:实现具体组件, 接入Sample工程

在基本了解清楚了工程的目录结构后, Richard开始编写组件的实现代码。这部分放在component目录中。他主要的工作是提供一个IRAComponent接口的实现。 IRAComponent这个接口中包含了组件需要实现的一些接口。

interface IRAComponent {

	  // 组件在创建和销毁时的回调
		void onCreate(); 
    void onDestroy();	

		// 配置的加载与更新
		// 若bInit==true,则表示本配置是第一次加载。
		void onSettingsUpdate(bool bInit, map settings);

		// 获得组件的widget,非UI组件返回null。
    View getWidget(){
		}

}

对于richard设计的这个组件而言, 其需要在onCreate方法中创建好

在组件工程自动创建的,已经为开发者准备好了组件的创建和窗口的添加代码。其逻辑如下:

public class SampleApplication ...{
	public IRAComponent mChatComponent = null;

	@Override
  protected void onCreate(...){

		// 创建组件:
		// 本方法调用后 1. 组件的onCreate方法将被调用。 2. onSettingsUpdate被调用bInit=True
    mChatComponent = ComponentManager.CreateCompon is ent("chatRoom");
		assertTrue(mChatComponent != null)

    // 组件创建和组件widget的获取可以分两个阶段来走,
    // 若需要延迟组件的创建过程,也可以将此过程延迟(如所属Activity的onCreate)。

	}

	@Override
  protected void onDestory(...){

		// 创建组件:本方法调用后, 组件的onCreate方法将被调用。
    mChatComponent = ComponentManager.CreateComponent("chatRoom");
		assertTrue(mChatComponent != null)
	}

}

public class SampleActivity ...{

    // ...
		IRAComponent chatComponent = getApplication().mChatComponent;

		assertTrue(chatComponent != null)
	
  	// 拿到组件的widget
		View chatWidget = mChatComponent.getWidget();
		if (chatWidget != null){
					// 将组件添加到FrameLayout中去
					transaction.add(R.id.id_framelayout, chatWidget);
		}
}

后端开发部分

其后台架构如下,由4个微服务和一个Nginx网关、MongoDB几个部分组成:


终端的结构上, 是一个聊天SDK,以源码形式打包发布:


阶段二: 组件上架与审核工作

阶段三: 组件的集成工作

阶段四:组件的升级与更新

💎 概念解析

组件

发表评论

电子邮件地址不会被公开。 必填项已用*标注