从零开始仿写一个抖音App——日志和埋点以及后端初步架构(1)

  • 1.初始化和绑定LocalFileLoggerService(这是一个 service,可以通过 binder 来与外部交互)
  • 2.通过 binder 将外部的添加日志的请求交给LocalFileLoggerService
  • 2.LocalFileLoggerService中会初始化一个 HandlerThread,本 Service 会通过 Handler 向其不断的抛入经过高性能拼接的日志的添加请求。
  • 3.FileLogger是负责将日志写入本地的类,其也初始化了一个 HandlerThread,并且自定义了一个 LoggerHandler。这个 Handler 会将 LocalFileLoggerService 抛过来的一条条日志进行累积,当积累到了一定量的时候。发出写入日志的请求交给 HandlerThread执行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 5.再来看看代码,我们跟着代码走一遍流程:
  • 1.首先在图5中我们可以看见在 addLog 中经过一系列的调用,最终交给了 sLogInterface.log 这个对象是一个 Binder 对象,用于操作 LocalFileLoggerService 。
  • 2.进入到图6,可以看见 Service 初始化了一个 HandlerThread 然后定义了一个 Handler 用于向其中抛送请求。然后在看 mBinder 的实现就是通过 Handler 向 HandlerThread 中抛送 FileLogger.addLog 的执行请求。
  • 3.进入到图7,可以看见在 FileLogger 初始化的时候也初始化了一个 HandlerThread ,然后定义了一个 LoggerHandler 来向其中抛日志写入请求。FileLogger.addLog 方法中是直接发送一个请求。
  • 4.再看图8,LoggerHandler.add 中并不会立即向本地写入日志,而是会有一 LOG_CACHE_COUNT 阈值,只有超过了这个阈值才会向文件系统中写入日志。

5、埋点日志

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 1.埋点日志其实和文件日志类似,我这里就结合图9简单说一下,具体的代码大家可以去翻看项目
  • 2.首先还是有一个 UploadLogManager 用于给外部提供 api 以及初始化 LocalFileLoggerService。这里比文件系统复杂的地方就在于多了一个 UploadLogConfiguration 用于装配一些设置。
  • 3.有了 LocalFileLoggerService 之后这里分两个不同的埋点日志添加方式。
  • 1.实时埋点日志添加:外部需要立即将当前的埋点日志上报,此时就直接将请求发送给 UploadLogHandler 然后交给 HandlerThread 执行,最终 通过 LogSender执行网络上报。
  • 2.非实时埋点日志添加:这种方式是每隔一定的时间,LocalFileLoggerService 会从 UploadLogStorage 中取出一定量的日志,合并之后再像1中一样上报埋点。
  • 4.目前因为 Http 模块和 数据库模块都没有开始写,所以 UploadLogStorage 和 LogSender 都还只是接口,但是并不影响代码逻辑。

三、后端架构的初步设想

虽然本项目的着重点是仿抖音 android 端 app 的开发,但是后台方面也会有所涉及。接下来笔者会介绍一下本项目在后端方面的目标和预期达到的效果。

1、RPC

可能会有客户端的同学对 RPC(远程过程调用) 这个词不怎么了解,我这里就先简单介绍一下。

拿 Java 来说:比如我们有两个服务 A、B 在两个服务器上,此时我们要在 A 上调用 B 的服务获取其上的数据 Foo。那么在 A 中可以写成 Foo f = b.XXXService();。在这里 Foo 是 A、B 两个服务所定义的数据传输结构,b 是 B 服务所抽象出来的对象,其内部实现可以是各种网络数据交互协议,比如说 http 协议。简单来说:RPC就是要像调用本地的函数一样去调远程函数。

现存的 RPC 框架有很多,各个大厂也都开源了自己框架,我这里就介绍和比较一下几个框架,最后结合本项目的需求选择适合的框架。

  • 1.Dubbo:这个是阿里开源的一个框架,后来阿里因为种种原因把他废弃了,最后被当当网维护扩展出了一个 Dubbox。这里就讲一讲他的优劣势吧:
  • 1.优势:
  • 1.Dubbo 是用 java 写的,对于 android 客户端的开发者来说比较友好。
  • 2.Dubbo 的生态目前来说还是比较好的,笔者去年在有赞实习 java 开发的时候,用过半年的 Dubbo,感觉各种坑都有人踩过,各种库也都比较完善。
  • 3.对于服务治理支持的比较到位。
  • 2.劣势:
  • 1.跨平台能力差,原生的 Dubbo 基本上没有跨平台能力,后面的话集成了 thrift 作为扩展的话就有了,不过我总感觉集成之后用起来不方便。
  • 2.以 java 作为主开发语言的话,不能快速迭代。我们项目的时间主要是要向 android 客户端倾斜,所以需要一个能快速迭代的语言。
  • 3.序列化和反序列化的速度与其他 RPC 框架相比都不是很拔尖。
  • 4.性能较其他几个框架差。
  • 2.Thrift:这个是 FaceBook 开源的一个框架,2007年由facebook贡献到apache基金,是apache下的顶级项目。
  • 1.优势:
  • 1.跨平台能力强,支持几乎所有的主流语言。
  • 2.性能比较好
  • 2.劣势:
  • 1.跨平台的语言协议写起来比较麻烦。
  • 2.不支持服务治理
  • 3.Grpc:由 Google 开源的框架,我司目前后端也在使用这个框架
  • 1.优势:
  • 1.跨平台能力强、支持大部分主流开发语言
  • 2.跨平台语言协议用的是 ProtoBuf,与我们客户端的技术栈一致。
  • 3.性能比较好
  • 4.有我司的技术支持,当然不是官方的,不过我可以了解我司在这方面的技术,最后反哺到我们的项目中。
  • 2.劣势:
  • 1.不支持服务治理

看了上面的比较我想大家心里已经有了答案,没错我决定使用 grpc 做为本项目后端的 rpc 框架。然后开发的语言是 python 为主,java 为辅助,后面如果有时间的话可能会用 go 实现一个小的服务也说不定。使用这些语言的原因有下面几点:

  • 1.首先 python 目前后台的生态也比较成熟,用起来也比较方便快速。
  • 2.其次我们到了后面会使用 tensorflow 来训练各种深度学习的模型,这样的话熟练使用 python 是必须的。
  • 3.有人会问你为什么要用几种不同的语言来实现后端的服务呢?这不是多此一举吗。的确,从正常开发的角度来讲是挺多余的,但是多语言的环境在大一些的厂来讲是再正常不过的事情,我的一部分目的也是为了模拟这种场景。除此之外,这种多语言的环境在我看来还是比较有意思的,想试试玩玩看。

2.微服务与服务治理

其实本来在这里我有很多东西想说的,但是发现自己现在的能力并不能完全说好这两个东西,怕最后会误导大家,所以我这里就列一下最后本项目需要完成的与这两个目标相关的东西。

  • 1.在未来笔者预期的是会有10台服务机器,两台为一组提供一类服务,一共会有五个大类的服务。
  • 2.所以第一个要实现的功能就是:服务发现注册功能。这个功能主要是和注册中心进行交互。
  • 1.服务提供者启动,向注册中心注册自己提供的服务
  • 2.消费者启动,向注册中心订阅自己需要的服务
  • 3.注册中心返回服务提供者的列表给消费者
  • 4.消费者从服务提供者列表中,按照软负载均衡算法,选择一台发起请求
  • 3.为了了解和监控各个服务的情况,第二个要实现的功能就是:服务监控,即累计计算随着时间推移各个服务被调用的次数。
  • 4.为了区分内外网,以及统一鉴权。需要实现的第三个功能就是:服务网关,所有外部请求都会经过这个网关,网关会将请求分发给内部的机器,内部机器调用完成之后会将结果通过网关返回给外部。

四、ubuntu环境初始化

不知道在我的读者中有多少个人用的是 mac。因为我本人就是 mac 和 win 的双系统用户所以我深知。mac 在开发方面的好处。这一节就轻松一点,我演示一下如何将本地 mac 命令行环境初始化到云上的 ubuntu 中。

1、oh my zsh

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 1.首先需要在XX云中买一个机器。我买的是阿里云,最开始的系统模板选择 ubuntu16,然后什么都不要装。然后在本地用 ssh 登录云主机。
  • 2.在本地电脑上 clone 一下我的这个库,接下来要用到里面的两个脚本文件。ubuntu初始化
  • 3.用 scp 命令将2中的两个文件上传到服务器上分别是:ubuntu_init.sh 和 ubuntu_init_oh-my-zsh.sh。例如:scp a.jpg root@47.106.145.211:/root/a.jpg,将本地本目录的 a.jpg 文件上传为云服务器上的/root/a.jpg文件。
  • 4.运行ubuntu_init.sh,中间会让你输入密码,最后会重启服务器。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

这里我就分享一份资料,希望可以帮助到大家提升进阶。

内容包含:Android学习PDF+架构视频+面试文档+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。分享给大家,非常适合近期有面试和想在技术道路上继续精进的朋友。

如果你有需要的话,可以点击Android学习PDF+架构视频+面试文档+源码笔记获取免费领取方式

喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~

话,可以点击Android学习PDF+架构视频+面试文档+源码笔记获取免费领取方式

喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值