抖音项目 | 青训营笔记

190 阅读7分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

课程链接

项目提问

抖音项目功能描述

搜索引擎项目功能描述

开营班会

青训营笔记活动

青训营阅读打卡活动

课程文档

掘金插件

sudo apt 使用的什么协议下载

blog.csdn.net/electrocraz…

www.serverlab.ca/tutorials/l…

/etc/apt是sudo apt配置文件夹。sudo apt配置http等协议或者设置使用IPv4等协议在该文件夹的apt.conf.d文件夹;sudo apt的下载软件库的站点在sources.list文件中,从那个文件默认的软件库我们可以看到使用的是http协议,也就是说sudo apt默认下载库时使用的http协议。

Vmware网络连接的三种方式

blog.csdn.net/Alpha_B612/…

  • 桥接模式:虚拟机占用一个ip地址,虚拟机独立访问外部网络,外部网络可以访问虚拟机
  • NAT模式:虚拟机和主机公用IP地址,虚拟机把请求打包发送给主机(通过NAT适配器协调),以主机名义发送请求,返回后解析请求发回虚拟机
  • 仅主机模式:无法访问外部网络。

curl和ping

stackoverflow.com/questions/5…

ping使用的ICMP协议,这是传输层协议;curl可以支持多种应用层协议,如http\https\ftp等。

上传图片到有道云分享

上传到有道云,点击分享,点开分享链接,再分享链接中复制图片地址,把这个图片地址放到Markdown

跑通simpole-demo

  1. 本次实验使用平台:Window上安装Vmware,Vmware上装Ubuntu20.04虚拟机,Goland IDE,天天模拟器

  2. 实验步骤

    • 下载simple-demo项目

      git clone github.com/RaymondCode…

    • 打开并运行simple-demo程序

      如图:运行程序命令是

      go build && ./simple-demo

      image-20220610100114086

      测试后台:在浏览器输入

      http://192.168.186.128:8080/douyin/user/?token=zhangleidouyin

      其中,IP地址192.168.186.128要替换成自己电脑的,使用ifconfig可以看到自己的IPv4地址

      可以看到浏览器结果是

    • 打开天天模拟器并安装抖音安装包

    • 打开抖音并且双击"我"

    • 在跳转的界面输入URL

      在之前我们测试时使用的URL是

      http://192.168.186.128:8080,这里我们输入的URL就是这个

      img

    • 保存之后我们就可以看到正常工作的抖音app了

      img

RPC框架

juejin.cn/post/699286…

www.zhihu.com/question/25…

mikechen.cc/7543.html

远程过程调用(Remote Procedure Call),用于解决分布式系统中服务之间的调用问题。 通俗地讲,就是开发者能够像调用本地方法一样调用远程的服务。 所以,RPC的作用主要体现在这两个方面:

  • 屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法;
  • 隐藏底层网络通信的复杂性,让我们更专注于业务逻辑。

简单来说,RPC框架让开发者可以像调用本地方法一样调用远程函数。

RPC框架解决了三个基本问题(当然还有其他问题,比如网络安全和流量控制等):

  • 函数ID到函数指针的映射。网络中每个函数都有一个ID,可以使用哈希表将函数ID和函数指针映射。客户端和服务端都需要维护一个映射表,客户端调用远程过程的时候要将函数指针映射到函数ID,服务端要将函数ID映射到服务端的函数指针
  • 序列化和反序列化。本地方法调用的时候我们的参数可以压栈传递,但是远程过程传递参数要通过网络,网络上只能传递字节流,需要我们在客户端将数据序列化成字节流,在服务端反序列化成我们需要的格式。可以使用Protobuf或者FlatBuffers进行序列化和反序列化
  • 网络传输。在网络中传递字节流数据。可以自己写Socket,也可以用asio、ZeroMQ‘、Netty等

RPC框架工作流程:

  • 客户端通过映射表将函数指针映射到函数ID,将函数ID和参数序列化成字节流,通过网络发送给服务端
  • 服务端接收到客户端请求,将参数和函数ID反序列化成自己需要的数据,然后映射到需要的函数,之后调用这个函数,将结果返回给客户端。
  • 客户端接受到服务端返回结构,反序列化成自己需要的数据。

抖音项目

基本功能

用户管理

用户注册

初始化创建用户信息表,表的字段有

id, name, follow_count, follower_count, is_follow

用户注册会在用户信息表中创建一 条记录

id(自增),name,pass, follow_count=0, follower_count=0, is_follow=false

follow_count

用户注册同时会创建对应的token放到内存中,使用集合来存储这个token

创建一个携程管理这个token,使用哈希表存储这个token,{token:timespan},管理token的携程阻塞一定时间长,每到一个时间长就将token的timespan减少1,之后检测这个token的timespan是否为0,如果是0,那么就删除这个token,表示用户失效

用户登录

用户登录会从数据库检索密码,如果不对会返回错误信息,正确会创建相应的token并且返回正确信息

用户信息

查询用户信息表,返回用户信息,包括

id,name,follow_count, follower_count, is_follow

视频流管理

发布视频

查看token是否存在,否则返回错误"User not exist"

获取视频流保存到public文件目录

将视频信息保存到数据库video

数据库video有一个user对象,这个时候我们要缓存user对象,我们可以吧user对象保存到token里面,所以有两个数据(生命周期和user对象)

发布视频列表

video数据库保存数据

视频id,user_id,url,favoritecount,comment_count,is_favorite,title,根据title获取视频流

视频id,uid, title, favorite count, comment count

最新30个视频流

从数据库最大往前数30个视频发送回去

扩展功能I-点赞和评论

点赞功能

用户对视频点赞,保存视频id和用户id的 映射,(uid, vid, action) (action=0表示没有关注,action=1表示已经关注)

查看点赞视频

从视频和用户映射表中获得用户的点赞列表

查询mysql的sql语句是

select * from favorite where userid=uid and action=1

评论功能

扩展功能II-用户关注列表

用户粉丝和关注数据表设计

segmentfault.com/q/101000000…

关注和粉丝系统数据库设计

segmentfault.com/q/101000001…

在线短视频

www.jianshu.com/p/34ce7f9b4…

Python建立http服务器访问本地资源(MP4等)

t.zoukankan.com/wangdongpyt…

Vmware虚拟机无法在局域网内部访问

将Vmware虚拟机连接方式变成桥接而不是NAT连接,重启就能在局域网访问虚拟机端口

荣耀平板和手机运行抖音发布视频网络错误

鸿蒙系统的问题,换成雷神模拟器运行抖音就行了

GORM链接MySQL数据库教程

www.tizi365.com/archives/6.…

根据.sql文件建立数据库

blog.csdn.net/weixin_3419…

查看MySQL端口号

blog.csdn.net/LANGZI77585…

关系操作

关注

数据库存储

user1, user2, operation(0不关注,1user1关注user2,2user2关注user1, 3相互关注)

如果不存在user1,user2对,就创建一个user1,user2,1

如果存在user1,user2,(13),就报错已经关注

如果存在user1,user2,2,就让2变成3

如果存在user2,user1(23),就报错已经关注

如果存在user2,user1(1),就让1变成3

发生关注的时候还要更新user数据表的两个用户的follower和following字段

关注:

如果

取关

如果是user1,user2,0,报错他们没有关注

如果是user1,user2(13),就让(13)减上1

如果是user2,user1,(23),就让(23)减上2

获取用户关注列表

如果用户是user1

查询user1,user2,(13)或者user2,user1,(23

获取用户粉丝列表

如果用户是user1

查询user1,user2,(23)或者user2,user1,(1,或3)

\