当前位置: 首页 > news >正文

架构小谈之美团外卖

美团外卖,大家都很熟悉,与我们的生活已经紧密相连了。今天有机会读到了关于美团外卖架构的文章。都说打败方便面企业的不是另一家方便面企业,而是先在的互联网外卖公司,下面,根据自己读了美团外卖框架介绍,谈一谈自己的美团外卖框架的一些认识。

美团外卖自2013年创建以来,业务一直高速发展。目前美团外卖日完成订单量已突破1800万,成为美团点评最重要的业务之一。美团外卖的用户端入口,从单一的外卖独立App,拓展为外卖、美团、点评等多个App入口。美团外卖所承载的业务,也从单一的餐饮业务,发展到餐饮、超市、生鲜、果蔬、药品、鲜花、蛋糕、跑腿等十多个大品类业务。业务的快速发展对客户端架构不断提出新的挑战。

很早之前,外卖作为孵化中的项目只有美团外卖App(下文简称外卖App)一个入口,后来外卖作为一个子频道接入到美团App(下文简称外卖频道),两端业务并行迭代开发。早期为了快速上线,开发同学直接将外卖App的代码拷贝出一份到外卖频道,做了简单的适配就很快接入到美团App了。

早期外卖App和外卖频道由两个团队分别维护,而在随后一段时间里,两端代码体系差异越来越来大。最后演变成了从网络、图片等基础库到UI控件、类的命名等都不尽相同的两套代码。尽管后来两个团队合并到一起,但历史的差异已经形成,为了优先满足业务需求,很长一段时间内,我们只能在两套代码的基础上不断堆积更多的功能。维护两套代码的成本可想而知,而业务的迅猛发展又使得这一问题越发不可忍受。

 

好的架构源于不停地衍变,而非设计。对于外卖Android客户端的平台化架构构建也是经历了同样的过程。我们从考虑如何解决代码复用的问题,逐渐的衍变成如何去解决代码复用和平台化的两个问题。而实际上外卖平台化正是解决两端代码复用的一剂良药。我们通过建立外卖平台,将现有的外卖业务降级为一个频道,将外卖业务以aar的形式分别接入到外卖平台和美团平台,这样在解决外卖平台化的同时,代码复用的问题也将得到完美的解决。

平台化架构

经过了整整一年的艰苦奋斗,形成了如图所示的美团外卖Android客户端平台化架构:
从底层到高层依次为平台层、业务层和宿主层。

  1. 平台层的内容包括,承载上层的数据通信和页面跳转;提供外卖核心服务,例如商品管理、订单管理、购物车管理等;提供配置管理服务;提供统一的基础设施能力,例如网络、图片、监控、报警、定位、分享、热修、埋点、Crash上报等;提供其他管理能力,例如生命周期管理、组件化等。
  2. 业务层的内容包括,外卖业务和垂直业务。
  3. 宿主层的内容包括,Waimai App壳和美团外卖频道Waimai-channel壳,这一层用于Application的初始化、dex加载和其他各种必要的组件或基础库的初始化。

在构建平台化架构的过程中,我们遇到这样一个问题,如何长久的维持我们平台化架构的层级边界。试想,如果所有的代码都在一个工程里面开发,通过包名、约定去规范层级边界,任何一个紧急的需求都可能破坏层级边界。维持层级边界的最好办法是什么?我们的经验是工程隔离。平台化的每一层都去做工程隔离,业务层的每个业务都建立自己的工程库,实现工程隔离。同时,配套编译脚本,检查业务库之间是否存在相互依赖关系。工程隔离的好处是显而易见的:

  1. 每个工程都可以独立编译、独立打包;
  2. 每个工程内部的修改,不会影响其他工程;
  3. 业务库工程可以快速拆分出来,集成到其他App中。

但工程隔离带来的另一个问题是,同层间的业务库需要通信怎么办?这时候就需要提供业务库通信框架来解决这个问题。

业务库通信框架

 

转载于:https://www.cnblogs.com/yyh-678/p/10670245.html

相关文章:

  • 【BZOJ2870】最长道路
  • C#-设计模式-观察者模式
  • Java基础内部类、包的声名、访问修饰符、代码块整理
  • c/c++ 网络编程 read,write函数深入理解
  • DevExpress WinForms使用教程:SVG图库和Image Picker
  • 4.标准信号与槽
  • 爬取碧蓝航线wiki
  • LeetCode 第104题 二叉树的最大深度
  • 学习进度二
  • Maven 属性
  • ASP.NET Core 基于JWT的认证(二)
  • javascript面向对象编程,带你认识封装、继承和多态
  • 【SQL优化】MySQL官网中可优化的层次结构
  • 1.2变量
  • Kubernetes 笔记 06 豌豆荚之旅(一)
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【面试系列】之二:关于js原型
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Debian下无root权限使用Python访问Oracle
  • ERLANG 网工修炼笔记 ---- UDP
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • MD5加密原理解析及OC版原理实现
  • rabbitmq延迟消息示例
  • 编写高质量JavaScript代码之并发
  • 智能合约Solidity教程-事件和日志(一)
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ###STL(标准模板库)
  • #每天一道面试题# 什么是MySQL的回表查询
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (太强大了) - Linux 性能监控、测试、优化工具
  • .gitignore文件设置了忽略但不生效
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core中Emit的使用
  • .NET Framework 服务实现监控可观测性最佳实践
  • .Net IOC框架入门之一 Unity
  • ??在JSP中,java和JavaScript如何交互?
  • [C#]winform部署yolov5-onnx模型
  • [C++] sqlite3_get_table 的使用
  • [codevs 2822] 爱在心中 【tarjan 算法】
  • [git]git命令如何取消先前的配置
  • [HNOI2008]Cards
  • [IE编程] WebBrowser控件中设置页面的缩放
  • [Java并发编程实战] 共享对象之可见性
  • [JS]Math.random()随机数的二三事
  • [LeetCode周赛复盘] 第 312 场周赛20220925
  • [Linux]history 显示命令执行的时间
  • [LitCTF 2023]Http pro max plus
  • [php] 数据结构算法(PHP描述) 快速排序 quick sort
  • [SCOI2010]传送带
  • [编程题]抄送列表 - 牛客网题解