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

背景

随着移动互联网产业的兴起,各式App层出不穷,技术方案多种多样。同样,我们也面临了各式各样的问题,比如产品如何开发能够更快速迭代上线,如何使运营推广更灵活,如何降低研发成本,提高研发效率和质量。随意产品开发的深入,我们越来越迫切寻求探索这些问题的解决方案。

经过这些年在APP端、浏览器内核、H5、server端研发经验的积累,2015年我在斗米的客户端产品上首次提出了**以URD驱动webox的客户端平台化架构思想**,并经过两年时间多个产品的探索实践,我认为该APP端的架构思想可正式对外分享。由于篇幅原因,今天我只从架构思想和原理上进行分享,而不对实现分享,希望能够给正在探索同样问题的朋友们带来一些思考和灵感。

目前行业内APP可分为三大类:Web App、Native App、Hybrid App。以下我将围绕Hybrid APP的架构思想展开分享,至于为什么使用Hybrid App来分享,后文会阐述这三种App的优缺点。当然,该架构思想也同样适合纯 Native App。

为了更好理解本文,欢迎下载斗米兼职客户端体验,斗米客户端的H5化已达到90%以上。

架构思想总述

先简单说明下URD和Webox概念

  • URD是统一资源调度器,英文名Uniform Resource Dispatcher。它是一个用于跨平台、跨端进行资源调度的字符串,允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。
  • webox用于承载内容页面统称为框(webox),全称Web Box。webox包含Blockbox和Browser

解决的问题

跨平台、架构一致性

现阶段主流的移动OS当属Android和iOS,大多数产品都会覆盖这两个平台。因Android和iOS的平台机制原因,造成在这两个平台的技术架构上产生了分歧。逐渐地,这两个平台的APP就相对独立,实现方案的也有了较大的差异化,系统性技术方案不好落地,沟通、维护成本逐渐变大,这也是架构师们经常头疼的一件事。

有没有遇到这样的场景:

  • 人力资源不足,我们希望在一个平台上实现,然后可以在其他平台上运行
  • 新出了一个平台,比如微信小程序,业务需要重新开发,如果业务能够复用多好
  • 如果公司有多个产品,我们需要基础服务复用,架构一致,降低沟通成本
  • iOS和Android在产品的技术实现上不一致,这时候,服务端需要做这两个平台的兼容。
  • 有时候,对外运营推广的接口不统一,市场就需要对这两个平台单独做推广

因此,遇到这些问题的抓狂,我们认识到跨平台、架构一致性的解决方案,对我们来说是何等的重要。

产品迭代快,快速发版

我们都知道APP发版不是一件容易的事,需要把包传给各个渠道。若是紧急出现重大bug,这时候我们就需要重新打好所有的渠道包,重新走发版流程,这对各个团队来说是件痛苦的事。

产品能够快速发版,甚至只需要热更新即可。这是产品快速试错,打击竞品的一把利剑。 在斗米的各客户端中,在APP不需要发版的前提下,可以使用DEK发版。DEK是一种用于热更新的包,可快速上线,并且跨平台(iOS、Andoid共用),就像web上线那么简单灵活。 APP的发版节奏一般是三四周左右,而DEK发版,如果只是fix bug的话,一两天即可完成发版,若是需求发版一周以内即可完成,

运营推广更灵活

URD是这套架构方案的核心驱动力,更是运营推广的重要工具。

  • 场景1:端内运营
    1、一般运营活动的落地页是web页面实现,想从活动落地面点击跳转到APP的某产品详情页(或者其他任何APP的页面),在有了URD机制后,运营推广部门不需要给客户端团队提需求实现,只需要使用URD即可跳转到APP的任何页面。
    2、当web嵌入到客户端内,当有发现有涉及到我们客户端已实现的页面(如详情页),会自动302跳转到APP页面,提高了用户体验。

    当然我们使用cookie的机制,端内与web的登录态也会互相同步

  • 场景2:端外运营
    当我们和第三方合作业务时,在第三方app或者第三方web站,我们可以提供URD给对方,URD具备调起app并且跳转到APP某页面的能力

解耦、扩展能力

URD与webox的相结合,使得app的解耦和扩展能力极强。URD是驱动力,能够做到跨平台页面调度,比如H5调度webox,Native调度webox,服务端调度webox,端外调度webox,webox内的内容也可跳到端外的能力;而webox是承载页面,承载内容的容器,内容使用DEK部署,DEK可热更新。整套机制跨平台,灵活度高,解耦和扩展能力强。

降低成本

研发成本的降低,在这套架构上体现得较为明显。业务开发,以JS言语为主,Native主要负责框架、性能相关的支持。而JS是一门跨平台,而且扩展性良好的语言,在Hybrid App的开发人力相对于纯Native App的开发人力上可缩减一半

APP分类

目前APP大致分成三类

Web App

定义: 将所有功能都放在Web上展现,运行基于本地浏览器。在此将给Web简单的套一层App外壳的应用也归入Web App。完全采用HTML/CSS/JS编写,专为触摸操作进行了优化。目前iOS已禁止简单的套壳App上架。

优点: 开发速度快,跨平台,成本低,实时迭代用户无需更新

缺点: 网络速度要求高、服务器压力大,系统级别API调用难度大,用户体验差、用户留存度低

Native App

定义: Native App是基于手机本地操作系统并使用原生语言编写的 。因为位于平台层上方,向下访问和兼容的能力会比较好一些,可以支持在线或离线访问,消息推送或本地资源访问,摄像拨号功能的调 取。但是由于设备碎片化,App的开发成本要高很多,维持多个版本的更新升级比较麻烦,用户的安装门槛也比较高。

优点: 用户体验佳、交互风格与系统吻合,节省流量,可访问本地资源,速度快,用户留存度高

***缺点:***成本高,版本迭代慢,需要过审

Hybrid App

定义: 介于Web App与Native App的一种折中方案,底层(框架)部分由iOS/Android开发人员处理,上层(内容展现)部分由Web前端人员处理,用户界面操作逻辑及部分静态资源驻留本地,使得Web App可以对操作迅速反应并在很大程度上实现离线访问。
Hybrid App分为四种:单View混合型、多View混合型、web主体型、多主体共存型(灵活型),点这里看百科

多主体共存型Hybrid App能够实现趋近于原生App的体验。 以下对多主体共存型Hybrid APP说明优缺点。

***优点:***具有跨平台、用户体验好、扩展性好、灵活性强、易维护、规范化、具有Debug环境、彻底解决跨域问题。

***缺点:***多一端的团队参与就多一些沟通成本,如接口的沟通,有js与Native的接口,有js与server的接口

架构解析

说到斗米客户端的架构,不得不简单介绍一下kerkee。
斗米客户端基础框架使用的是kerkee框架(http://www.kerkee.com),kerkee是一个多主体共存型Hybrid框架,具有跨平台、用户体验好、性能高、扩展性好、灵活性强、易维护、规范化、集成云服务、具有Debug环境、彻底解决跨域问题。

整体结构图

整体结构分成以下几部分,斗米客户端会把这些基础能力封装到DoumiFramework中,便于其他项目的使用。

  • Application层:主要有URD架构和Webox容器架构,以及一些业务模块,Webox容器在架构思想形成的前两个版本叫作多框一Browser,是不是很通俗易懂,当时还未对容器构建模型。
    “多框一Browser”是用来加载本地页面和web页面的容器。后来发现“多框一browser”过于随意性,对框的定义是根据功能来区别,比如加载首页就叫首页框,加载详情页就叫详情页框,加载列表页就叫列表框等等,当页面的种类越来越多的情况下,框也就越来越多,就造成了泛滥,没有统一的类型,沟通上的成本也越来越大。后来也对框进行建模,建立规范,才有了今天的Webox,后面会介绍。
    URD也是这套架构的核心驱动力,URD是基于RFC 3986规范而制定的一套跨平台规范。URI相信大家都能理解和使用,但URD不是URI,只是在调用和使用层面和URI的用法一样。

  • API层:这一层很重要,它是JS与Native交互的API接口。这层的API可以重写kerkee中功能。比如你看kerkee中实现的XMLHttpRequest(简称XHR)实现的不好,那你就可以重写XHR接口,完全取代kerkee中的XHR模块。这层的接口可以使用静态类,也可以使用对象,具体用法可以查看kerkee的使用。

  • kerkee Framework:是我早年实现的一套Hybrid App框架,目前相对稳定。这个lib就不多说了,基本这个lib之上,还有个kerkee plus,它的作用封装了热部署,以及一些功能接口。具体细节可以去网上看 http://www.kerkee.com

  • Intelligent Data Engine:这是数据层,把所有的数据逻辑圈在这层内,它定义了数据请求来源,数据运行逻辑,形成数据流。
    举个例子,它能够提供给Application层,不管数据是从缓存读取还是从离线数据库读取或者是从server请求。而Application层不需要关心数据来源。
    一般来说,对于APP开发,业务稳定下来后,数据层一般变化得较少,变化较多的是用户体验层(Application层),有了数据层后,app的结构就清晰起来。

安全策略

我们在数据的安全方面下了很大功夫。

AccessToken机制

先介绍一下名词:
DEK加密算法:自研发的加密算法,稳定性高,安全性较好,现在整个斗米的api接口基本都基于此进行加密
DeviceToken:设备唯一标识,由我们自研发的一套设备唯一标识
AccessToken:访问接口所需要和token,它由client发起,动态改变,每次发起请求都会生成不一样的AccessToken,就和银行的eToken类似的原理,就是以下图片这东西

AccessToken包含了DeviceToken等信息,经过DEK加密算法处理后,再进行上报。如果请求的数据中没有AccessToken或AccessToken校验不通过,则不会下发数据。

附加: 我们对所有的请求都使用了https,为了安全,我们损失了一些请求接口的性能作为代价。

Webox

用于承载内容页面统称为框(webox),全称Web Box。Webox包含Blockbox和Browser。
根据承载的区块上来区分:“Blockbox”所承载的内容可以是Native组件,也可以是H5组件(还可以是H5 Page),而Browser所承载的内容只能是H5 Page 根据区块的路径来区分:“Blockbox”不仅支持相对路径Path,也支持绝对路径Full Path和标准URL;Browser只支持URL。

举例:

Blockbox:通用框(common blockbox)、首页框、详情框、列表框、登录框等
Browser:用来承载Web页面的框

URD

什么是URD

字面上的URD URD是统一资源调度器,英文名Uniform Resource Dispatcher。它是一个用于跨平台、跨端进行资源调度的字符串,允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。
URD协议沿用URI规范(RFC 3986规范),文档地址:http://www.ietf.org/rfc/rfc3986.txt

URD格式
scheme://action/path-encoding?query#fragment

URD和URI的区别
URI是以一种抽象的,高层次概念定义统一资源标识;
URD所定义的协议是在URI之上,URD是具体资源调度的方式,可用资源的分发调度。URD不仅是一种URI的表现形式,它还可以嵌套URL和其他URI。

架构上的URD
URD是一套客户端技术架构,也是一门技术哲学,是客户端的驱动力,是webbox内容的身份标识。
具备了跨平台调度页面、多层嵌套、数据回传、单向页面依赖调度、URD302等特性

重要特性

**跨平台调度页面:**H5可以调度webox,Native调度webox,服务端调度webox,端外调度webox,webox内的内容也可跳到端外的能力

**多层嵌套:**URD页面可以调度另一个URD页面

**数据回传:**通过URD可以传递数据(包括透传数据)和回传数据

单页面依赖调度: 使用例子来说明,比如从H5某个页面发起URD去调度用户钱包页面,而钱包页面又依赖于登录,对于调起方来说不需要知道进入钱包是否需要登录或是否已登录,URD会自动调起登录进行登录,然后再自动去钱包页面。

支持302跳转: URD302跳转与http的302类似,发起一个URD302以后,会销毁发起方的页面。
场景:有时候我们客户端嵌入第三方web页,但第三方web页又没有使用URD调用客户端中的页面。这时在web页中使用URD302,browser会自动识别client中已有的webox页面并自动跳转到native页面,当用户点击后退时,也会退回上一层web面,这样能够提高用户体验。
举个例子:AWeb页面要去BWeb页面,BWeb页面在client中有对应的BClient页面。AWeb页面跳转打开BWeb页面,在BWeb页面中会发起URD302,这时URD就会跳转到BClient页面,同时销毁BWeb页面,当用户需要后退时,只会回到AWeb页面

URD导图

为什么要用URD

URD是一个跨平台的规范,依靠scheme,它可以调起iOS App和Android App,不仅如此,跨平台页面调度变得更加灵活、跨平台数据传递也带来很多便利。URD在整个架构中,页面调度解耦,灵活,扩展性好。在运营和推广方面,也变得更加灵活。

Webox的调起流程
至于URD交互流程较为复杂,也不是本篇文章的篇幅所能讲述的,在这里我分享下Webox调起流程,请看图。

##DEK升级### 这一节也是比较复杂,我分享实现的基本原理。在使用上没这么复杂,每个webapp都有一个ID,ID为0时,全量更新(包含所有webapp),ID非0,增量更新,针对webapp的更新由webapp主入口的manifest决定如何更新即可。

使用

客户端会向server请求所需要更新的webapp列表,server返回所需更新的webapp数组

例如 [{id=0, manifest="webapp入口manifest"}]

client根据id判断是全量更新还是只更新某webapp,此时的全量指的是包含所有的webapp

原理

DEK更新机制(采用manifest文件的格式)遵循html5离线存储规范. H5中只是对里面的注释功能进行了扩展,native对Html5离线存储规范的重新实现及扩展。

格式:# [名称]: [值] 即 井号+空格+名称+冒号+空格+值

  • 在H5的模版化架构设计中,每个模块都形成独立的webapp(框架也是webapp,每个模块运行在框架内),每个webapp可独立更新(以dek文件体现)
  • 每个webapp又可拆分为多个DEK(当然一个DEK也可以),便于增量更新
  • 每个webapp都有一个入口manifest,每一个dek会对应一个manifest
  • 可实现全量更新(所有的webapp)和增量更新(单个webapp)
  • 文件级更新:若只更新webapp,则cache字段或network字段决定dek包中的文件更新方式,若cache字段为空,则说明该webapp全量更新(此时的全量是,某个webapp的全量)

Manifest文件格式

CACHE MANIFEST

# Version: 1.0.0.1
# RequiredVersion: 1.0.0
# List: ./others/cache.manifest, is/xx.manifest, ../../xx/xx.manifest
# Dek: xx.dek

CACHE:
images/1.0/bg.jpg
musics/1.3/bg.mp3
css/xx.1.2.min.css
xx.1.1.min.js

NETWORK: *

格式说明

构建体系

看图!这是个webapp构建部署的结构图。

总结

以URD驱动Webox的客户端平台化架构思想在实际的实践中,较为灵活,可操作性强,对团队具有指导性作用。

转载于:https://my.oschina.net/u/2613714/blog/1491157

斗米客户端的架构思想相关推荐

  1. SOA标准之----SCA架构思想

    SOA在Java领域有两套标准:一个是SUN推出的JBI(没有得到BEA和IBM的承认),另外一个是:IBM和BEA等公司推出的SCA和SDO标准. JBI之关注Java组件只处理Java组件的集成. ...

  2. restful适用于移动互联网厂商作为业务_Restful架构思想

    java作为一门后端语言,其厉害之处在于web,大家比较熟知的各种网络应用,java都能做,那么在这个移动优先的时代,如何继续发挥java的强大呢.通常是让java作为一个app的服务端,为app客户 ...

  3. T系统和应用集成-从SOA架构思想到服务架构规划设计

    T系统和应用集成-从SOA架构思想到服务架构规划设计 原创 人月聊IT 2020-09-23 13:48:20 作者:人月神话,新浪博客同名 简介:多年SOA规划建设,私有云PaaS平台架构设计经验, ...

  4. 笔记|滴滴iOS客户端的架构,组件化,技术选型

    笔记来源infoq:滴滴iOS客户端的架构演变之路 1,状态机,把订单中的阶段,例如:出租车的等待抢单.出租车的等待接驾.专车的等待抢单.专车的等待接驾,都当成一种独立的状态,每 个状态机只需要知道可 ...

  5. sca标准值_SOA标准之----SCA架构思想

    SOA标准之----SCA架构思想 SOA在Java领域有两套标准:一个是SUN推出的JBI(没有得到BEA和IBM的承认),另外一个是:IBM和BEA等公司推出的SCA和SDO标准. JBI之关注J ...

  6. 升米恩斗米仇,驳”开源侵略论”

    | 作者:卫sir | 转载自:微月人话 | 编辑:王玥敏 | 设计:刘颖洁 三国时,吴国有个叫赵姬的女人,闺女出嫁前,她说:"到了婆家,你可千万不要做好事哟."闺女不解,问母亲: ...

  7. 剥析surging的架构思想

    1.前言  前面第一篇阐述了采用基于.NET CORE微服务架构,应用surging服务端与客户端之间进行通信的简单示例以及对于surging服务化框架简单介绍.在这篇文章中,我们将剥析surging ...

  8. SOA标准之----JBI架构思想

    SOA标准之----JBI架构思想 SOA在Java领域有两套标准:一个是SUN推出的JBI(没有得到BEA和IBM的承认),另外一个是:IBM和BEA等公司推出的SCA和SDO标准. JBI之关注J ...

  9. Jetpack Compose 中的架构思想

    Jetpack Compose 中的架构总览 如果应用打算使用 Jetpack Compose 来开发,那么就可以跟以前的MVC.MVP.MVVM等乱七八糟的架构全部说拜拜,这些名词也将在Androi ...

最新文章

  1. python 爬预警没解析前的
  2. 基于SSM实现在线洗衣平台
  3. 安卓实现定位功能的4种方式
  4. 很多人问,到底要不要转管理
  5. 使用go来实现类似erlang otp里面的gen_server功能
  6. java、oracle对CLOB处理
  7. 阿里主管通知我试用期延期……
  8. Java ListResourceBundle getKeys()方法与示例
  9. MyEclipse10 中设置Jquery提醒,亲测可用
  10. 网络安全之等级保护问题集
  11. 问题解决:error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1700”不匹配值“1800”
  12. TCP,IP,UDP等各种报文格式
  13. 智能家居内网服务器,手把手教你搭建自己的智能家居IOT系统
  14. mysql 1045 远程_启用远程mysql连接:错误1045(28000):拒绝用户访问
  15. 5 个无聊 Python 程序,用 Python 整蛊你的朋友们吧
  16. Mark - HDFS性能压测工具
  17. 2022-2028全球便携式网络测试仪行业调研及趋势分析报告
  18. 电脑组装的配件及其功能
  19. Tableau:如何对任意两个时间段的数据进行对比
  20. 关于pycharm安装第三方库的一些方法

热门文章

  1. Java基础—IO流
  2. svn Web管理svnadmin
  3. Linux用户态和内核态
  4. [perl]Wide character in print报错
  5. Word中的图片显示出不来的解决办法
  6. 在RHEL 5中Yum应用大全
  7. Linux命令--pwd
  8. 创建 Monitor 并测试 - 每天5分钟玩转 OpenStack(124)
  9. Mybatis分页插件 - 示例
  10. openlayers2中selectcontrol用法