bet356体育在线

最近在帮一个客户做直播客户端也要添加一个设

  不要写死,一个永恒的话题。动态化,也是一个涵盖了界面,功能,数据,配置诸多方面的一个宽泛话题。

  在之前的一篇《解耦神器 —— 统跳协议和Rewrite引擎》()中提到了我们的配置中心。这篇文章就跟大家聊一聊手机天猫在配置动态化上的心路历程。

  最初移动App就是一个老老实实的App,一切都硬编码在客户端,只有业务数据是从API而来。

  渐渐的就会发现,这里的Tab文案需要动态调整,那里的文本颜色需要个性定制。于是我们就在数据接口里加上一些信息来控制客户端逻辑。

  当动态调整发挥作用,我们就发现这玩意儿简直太棒了,客户端逻辑居然也不需要版本依赖了!于是更多的逻辑开始未雨绸缪,开始在各自数据接口里预先埋下控制信息。

  那些没有与API数据交互逻辑的静态功能就很不爽,天生的纯客户端逻辑,难道就活该不能动态化?于是开始考虑专门为动态化去设计一个API,专门传输控制信息。

  后来还在后端还做了一个可视化的编辑界面,管理这些专门的控制信息,虽然简陋了一点,也比修改那些混在数据API里的信息要方便的多。

  当专门用来传输控制信息的API和管理界面投入使用,渐渐的那些原本混在数据API里的控制信息也加了进来 —— 一个叫做配置的功能就这么诞生了。

  天猫在配置这件事上投入了很多,成长至今,我们的配置中心也经历了漫长的成长过程,现在配置中心是一个支撑多款应用多个平台超过150个业务模块的系统。在这个配置中心里,有大到超过100条跳转规则的Rewrite引擎,小到仅仅配置了一个状态位的缓存开关;强业务相关的头图链接,强技术性的安全模式级别;最前端的App主题风格,最后端的日志打印策略;等等。

  手机天猫第一个可以被称为配置中心的系统并非一个独立运行的应用,而是寄生在一个被称为TMS的类似CMS的前端平台上。最初的配置是每个业务在这个TMS上创建一张页面,以JSON方式输出到CDN,客户端代码按需下载这份JSON文件,从而实现动态化。逐渐我们发现,类似的需求越来越多,多个业务都在以这样的方式做动态化。

  许多人在重复做同一件事,那么这件事就一定值得抽象。基于这样的逻辑,我们抽象了一个可以支撑多个业务的“配置中心”,同时把功能从TMS迁移到了另一个更轻量的前端平台——TWP上。在这个平台上,所有模块的配置都被描述为一张二维表,每一个模块可以在模版中订制列,而每一行就是该模块下的一条配置信息。每一次配置信息发生变更,这张二维表的数据会被提交到模版中的每个模块订制的一个JS函数,这个JS会针对二维表提交来的数据做校验和简单的格式化。

  这个配置中心通过互相配合的两张页面模版最终生成一份被存储在CDN的配置文件。

  一张页面做“模块配置”,用来管理接入配置中心的模块信息。包括:模块名称,列配置。

  另一张页面做“数据配置”,通过读取“模块配置”的信息生成一个支持多sheet的二位表簇,同时还持有每一张二维表,也就是每一个模块,提交后的一段格式化JS函数。

  每一次在“数据配置”页面填写数据并保存后,二维表簇的全部数据会被提交到格式化函数中,所有模块的JS函数会各自执行,并把结果拼装成一段完整的JSON,输出到CDN上。

  在这个简陋的配置中心里,我们最多支持了50-60个模块的配置数据,数据量也超过了50K。由于配置数据是静态的,而且无法增量更新,客户端的流量问题非常严重。我们不得不再通过一个简单的Web应用,通过读取配置数据中的一个版本号(上图,也是人肉配置的,需要每个修改配置的人修改这个版本号加1)比对客户端上行的本地版本号,来判断是否有配置变更,从而决定是否读取这份完整的配置文件并下发到客户端。

  新的业务需求推动配置中心的一次大重构,开始重新梳理配置信息的数据结构,并建设独立应用。

  配置中心的数据结构必须兼顾统一性和个性化。统一的数据结构是抽象管理逻辑的基础,针对统一的数据结构可以设计出通用的管理界面,存储逻辑;而具有一定的个性化能力才能针对不同的场景更好的满足业务需求。

  基于这样的考虑,我们设计了Key-List-Object的三层数据结构。也就是说,整体上配置数据是一个Map,Map中的每一项都是一个List,而List中的项则不规定结构,可以自由发挥。Key-List-Object结构对应到业务上:

  此外,为了支持跨平台和版本的需求,还设计了应用-平台-版本-模块的元信息模型。

  元信息模型和数据模型结合起来组成了完整的配置中心数据模型。数据项直接关联应用,模块和版本号三个元信息,版本号关联平台,模块关联应用。在这样的关联下,任意一个请求到达后:

  在这样的技术方案下,这个新配置中心可以满足几乎全部横向需求,支撑多个应用,多平台,bet356体育在线多版本同时管理。

  修改某一个配置项并在多个版本同时生效,这样的操作非常常见,而在新技术方案下,给每一个版本的App都分配了独立的配置项数据。为了解决这个问题,我们给所有有关的配置项设计了一个独立的关系,当对某一个版本中的某一个配置项进行查询,同时可以查询到与之关联的其他版本中的项。修改某一个配置项也可以同步到同一个关系下的其他关联项。通过关系解决了对配置信息的关联处理。

  以上的模型满足了统一性,而个性化则在配置项上体现。在Key-List-Object结构中配置项没有硬性的格式要求,所以每一个项都可以有其个性结构,只需要满足JSON Schema的要求即可。

  这样的设计也可以保证对List没有需求的场景,可以在首个配置项中有最高程度的设计自由度,定义适合业务的结构。

  之前说到新配置中心还要解决配置数据尺寸膨胀的问题。而随着业务增长,配置中心所支撑的业务模块已经超过了150个。在这样的体量下,一份完整的配置文件已经接近200KB。显然,每次都加载这样的一个文件是不现实的,因此我们开发了针对模块级别的增量更新功能。

  任意一个模块发生数据更新后,将向系统提交一次版本变更请求,整个配置版本号加1。配置中心记录了每一次版本变更的模块信息。当数据请求到达配置中心后,系统将比对当前最新版本和请求上行的App本地版本,并计算出版本差之间发生变更的模块数据,构造一次增量数据返回。

  在全部模块中,最大的一个模块数据不超过20KB,频繁更新的模块数量不多于10个,增量功能节约客户端数据流量超过90%。

  至此一个功能完善的配置中心初具规模,然而随着配置中心接入的业务的增长,一个新的课题摆在我们面前。配置中心已经托管了几乎整个App的配置信息,系统的横向扩展只能积累量变,要进一步刺激业务能力升级就需要配置中心纵向扩展,在静态配置之外的领域具备更强的功能。

  纵向能力扩展的思路也有不同。发展配置中心系统本身,针对需求扩展外延是传统思路。然而我们认为这样的做法不能最大限度的发挥配置中心所具备的的能力,资源产出比太低。如果可以调动既有的其他系统的,推动既有系统的无线化,发挥配置中心的通道能力,就可以调动前无线时代我们积累的大量成熟系统能力,让这些能力迅速在无线平台上发挥作用。这种做法不仅充分扩展了配置中心的纵向能力,又推动了既有系统的无线化升级转型,事半功倍。

  依据所承担的功能,把配置中心拆分成网关、核心服务和界面系统三个部分,并对其进行服务化改造。每一部分都具备独立提供服务的能力,而他们之间的配合也通过服务化的接口来实现。

  如此一来,每一个部分所具备的能力都都可以提供给配置中心系统以外的其他系统,而且拆分后的系统,每一部分的发布频率,系统要求,应用特点各有不同,可以针对性更强的进行系统优化。

  旧的配置中心设计中,网关直接返回核心系统计算出的配置数据,只是通过内存缓存来提升访问效率和稳定性。而新的设计下配置中心将为更多业务提供数据通道服务,必须选择更安全可靠的通道方案。

  我们决定把静态配置数据按照业务切分,以横向属性组合为标示,投放到CDN上。通过网关下发CDN链接,App端SDK拿到链接后自行下载数据。从而降低核心模块的压力,提升稳定性。

  此前,配置中心的界面趋于同质化,诚实的还原了Key-List-Object的数据结构,而配置项的编辑界面则是一个标准的JSON Editor。为了提升可用性,我们独立设计界面系统。

  在这个界面系统中,业务方可以使用标准的JSON Schema来定义一张操作界面,也可以通过撰写HTML模版实现个性化更强的界面。界面的表单数据将被提交到一个负责格式化和校验的JavaScript方法中。在这个方法中表单数据被处理成系统所需要的配置数据,投放给核心服务。

  不要写死,一个永恒的话题,这个话题会一直持续下去。而动态性这件事,是移动设备App当下最热门的话题。在PC时代,我们的系统经历了C/S到B/S的转换,终于实现了最大程度的动态化。而在无线时代,移动设备有他独特的属性,B/S模式无法满足无线时代的业务需求,至少当下是这样。那么Native动态化这条路,就还需要我们坚定的走下去,这条路的尽头可能是另一个B/S模式,也可能我们找到了完美的Dynamic Wireless C/S模式。

  转载自:客户端大量的硬编码导致其灵活性大大降低,一些细小的改动只能通过发布版本解决,用户升级更...博文来自:The winter is coming!

  昨天有朋友问了我这样一个需求,就是在天猫App中首页进入搜索界面,搜索出的商品页中,有一个按钮可以切换商品列表的布局。没有用过或者用的少天猫App的赶紧下载体验下(哈哈,给天猫打个广告~)。如果你很懒...博文来自:Songlcy

  1、什么是反射反射是的重要机制,通过反射,可以在程序运行时获得程序集中的所有类型(包括接口、类,结构等),并且还可以直接创建对象,使用对象的方法。总之,用一句话总结就是:反射可以获得程序或程...博文来自:NoMoreCode的博客

  阅读原文请点击摘要: 在集团大数据、算法的背景下,猫客(天猫客户端)首页率先从2015年的坑位运营走向2016年的全面个性化,猫客首页个性化业务点多达50多处,个性化场景大部分通过通过Aladdin(...博文来自:的博客

  ajax获取动态列表数据后的分页问题这是我在写前台网站时遇到的一个分页问题,由于数据是通过ajax的方式来请求得到的,如果引入相应的js文件来做分页,假如只是静态的填放数据到列表各项内容中(列表条数固...博文来自:strive_for_myself的博客

  本文为H5EDU机构官方HTML5培训教程,主要介绍:bootstrap教程(二)——列表组listgroup列表组列表组是Bootstrap框架新增的一个组件,可以用来制作列表清单、垂直导航等效果,...博文来自:bright_mmmmmmmmmmmm的专栏

  部分代码参考demo----《历史上的今天》。       感谢作者的分享,愿好人一生平安,虽然只有两个页面,但是通过这个示例让我学会了5+中如何动态构建列表并填充数据,非常实用。html部分:   ...博文来自:不忘初心,方能始终。

  springcloud实战之10分布式配置中心(config)介绍了如何用springcloudconfig和git仓库读取配置文件,当配置文件里的属性发生变化,按照以往的惯例,必须重启服务才能够读取...博文来自:Mr.Robot

  首先先介绍下实现后的效果:1、在需要动态配置属性的类上添加注解@RefreshScope表示此类Scope为refresh类型的2、启动工程,修改config-server对应的配置文件,这里修改的是...博文来自:believer123的专栏

  通过以下几个问题理解微服务中的集中配置中心1.微服务配置中心是什么2.为什么需要微服务配置中心3.微服务配置中心实现技术4.技术如何选型...博文来自:Oscar Chen

  以Student、Class、Grade为例,web中要显示学生基本信息,以及班级名称和年级名称。请见数据库关系模型:由于班级名称和年级名称在不同的表中,通常采用两种方式实现:1.      使用创建...博文来自:林老师的专栏

  帮助我们更好地优化mPaaS,获取此次分享PPT原稿:EZVx3bx背景结合上周分享的《模块化与解耦式开发在蚂蚁金服mPaaS深度实践探讨》,我们已经对支付宝在移动端开发架构的设计思路有了初...博文来自:weixin_34405925的博客

  之前做一个项目的时候,首页设计的很复杂,有banner、活动、分类、滚动条、列表等。接口的话很好实现,跟后台定好返回json的格式,把各部分数据分开接收就行了。界面也不是很难实现。问题是这么多数据,有...博文来自:magicbaby810的博客

  简介我一向喜欢在实际动手的过程中去学习新技能。因此当我从《python核心编程》这本书上接触到django这个web框架的时候,我头脑中的第一反应就是,搞个“大项目”,一来可以学习技能,二来可以丰富阅...博文来自:何苦做游戏

  需求: 1、前端所有东西(包括样式、脚本、HTML元素)可以通过后台定义 2、前端所有东西(包括样式、脚本、HTML元素)都是保存到后台数据库 3、HTML元素统一为元数据,后台可以通过角色与元数据关论坛

  文章目录代码灾区?尝试的改进Dinny代码灾区?在我们Android开发中,不可避免的一个情景是在Activity跳转的时候传数据。比如从一个FromActivity界面,跳转到一个OtherActi...博文来自:貌似掉线的博客

  Dubbo动态配置中心一、参考文档三大中心指的:注册中心...博文来自:汪小哥

  转载请标明出处:一片枫叶的专栏上一篇文章中我们讲解了Android中的几种常见网络协议:xml,json,protobuf等,以及各自的优缺点,一般而言主要我们的App涉及到了网络传输都会有这方面的内...博文来自:一片枫叶的专栏

  300行的动态配置中心客户端配置中心在目前service化中占着越来越重要的步骤,特别是在docker容器中。在去年我们公司也需要一个这样的配置中心,借鉴了国内外如阿里百度配置中心。准备自己也写一个。...博文来自:Biu Biu Biu ~~~~~

  声明:本文来自京东张开涛的微信公众号(kaitao-1234567),授权CSDN转载,如需转载请联系作者。作者:于林坤,2012年加入京东,网站移动研发部频道业务技术负责人,先后多次主导京东商城首页...博文来自:博客

  简单说下的是,网站空间小而数据库还可以的话,使用动态浏览也是不错的,但是官方的程序默认的生成静态浏览的,只要一发布文章,就会自动生成静态页面,难道做发布文章还要一个一个去更改其他的设置吗?麻烦。对于采...博文来自:cloudday的专栏

  什么是配置中心不使用配置中心没有采用独立的配置中心,每次修改配置参数只能通过手动修改配置文件的方式,然后再重启重启重启,而且机器又是多台,这种方式无疑是非常低下的,而且极容易出错。何为配置中心?由IT...博文来自:贾文静

  small是android与iOS平台比较出名的轻巧的跨平台插件化框架,也正是被这一点吸引,决定将small应用到集团内部的应用引擎模块化方案中,本篇博文主要讲述本人基于small在android平台...博文来自:王永迪的专栏

  我们在开发软件的时候,都会填一个功能就是设置,查看很多软件大多数都是圆角形式,最近在帮一个客户做直播客户端也要添加一个设置界面,因此分享一下制作过程先看一下效果图(上面还包含一个头,但是里面含有客户信...博文来自:jwzhangjie的专栏

  淘宝、天猫、腾讯网站系统架构 (2016-06-0217:19:12)  前言一个成熟的大型网站(如淘宝、天猫、腾讯等)的系统架构并不是一开始设计时就具备完整的高性能、高可用、高伸缩等特性的,它是随着...博文来自:p312011150的博客

  在大型集群和分布式应用中,配置不宜分散到节点中,应该集中管理,为各种业务平台提供统一的配置管理服务。随着业务的发展,应用系统中的配置通常会越来越多,常见的一些应用配置大致会有数据源配置,数据源组件配置...博文来自:Enweitech Software Works

  前文《天猫客户端组件动态化的方案——VirtualView上手体验》都提到了自定义模板编译成二进制数据的过程,在Android版的Playground里内置了一个编译工具可以实时调测,然而业务开发过程...博文来自:weixin_33842304的博客

  用AxureRP7.0制作的天猫商城高保线月份左右用来练习Axure时制作的,还有很多细节和bug没有完善; 在此将这个用AxureRP7.0制作的原型放出来给有兴趣的小伙伴儿下载学习,仅供参考不必完全模仿,因为这个...

  本次人工智能线上峰会培训视频内容包括自然语言处理在“天猫精灵”的实践应用、用户画像系统应用与技术解析、使用Keras由零开始快速构造自己的深度学习模型、深度学习在搜索的应用、深度学习部署系统构建、深度学习在推荐领域的应用和实践。

分享: