头图

教程总体简介:2. 目标 ToutiaoWeb虚拟机使用说明 Pycharm远程开发 产品与开发 1 产品介绍 2 原型图与UI图 3 技术架构 4 开发 数据库 APScheduler定时任务 定时修正统计数据 RPC简介 1. 什么是RPC 2. 背景与用途 3. 概念说明 4. 优缺点 gRPC 简介 架构 使用方法 Protocol Buffers 1 文档结构 2 注释 3 数据类型 3.2 枚举 4 消息类型 4.1 字段编号 4.2 指定字段规则 4.3 添加更多消息类型 4.4 保留字段 4.5 默认值 4.6 嵌套类型 5 map映射 6 oneof 7 定义服务 推荐系统接口定义 接口原型 使用Protobuf 定义的接口如下 代码生成 补全服务端 编写客户端 头条首页新闻推荐接口编写 即时通讯简介 需求场景 传统的推送实现 WebSocket Socket.IO 1 简介 2 Python服务器端开发 安装 创建服务器 事件处理 头条聊天服务实现 头条在线消息推送实现 需求 实现 Elasticsearch 简介与原理 2 搜索的原理——倒排索引(反向索引)、分析、相关性排序 概念与集群 概念 IK中文分析器 索引与类型 索引 类型和映射 文档 索引文档(保存文档数据) 获取指定文档 判断文档是否存在 更新文档 删除文档 Logstash导入数据 查询 1 基本查询 2 高级查询 头条全文检索实现 elasticsearch python客户端使用 头条项目搜索接口视图实现 添加ES新文章索引数据 联想提示 1 拼写纠错 2 自动补全 头条suggest查询实现 思路 单元测试 为什么要测试 测试的分类 单元测试的基本写法 Gunicorn Supervisor 配置 启动 部署相关 理解ORM 作用 思考: 使用ORM的方式选择 SQLAlchemy映射构建 2 安装 3 数据库连接设置 4 模型类字段与选项 5 构建模型类映射 分布式ID 1 方案选择 2 黑马头条 Redis 2 Redis持久化 5 用途 6 相关补充阅读 Git工用流 Gitflow工作流 1 工作方式 2 历史分支 3 功能分支 4 发布分支 5 维护分支 6 示例 头条项目目录 调试方法 JWT & JWS & JWE Json Web Token(JWT) JSON Web Signature(JWS) JWT的Python库 用例 头条项目实施方案 JWT禁用问题 JWT认证方案 OSS对象存储 CDN 缓存 缓存架构 缓存数据 缓存数据的保存方式 缓存有效期与淘汰策略 有效期 TTL (Time to live) 缓存淘汰 eviction Redis淘汰策略的配置 缓存模式 1) Cache Aside 缓存问题 1 缓存穿透 2 缓存雪崩 头条项目缓存与存储设计 缓存设计 1 User Cache 3 Article Cache 4 Announcement Cache 持久存储设计 1 阅读历史 2 搜索历史 3 统计数据

完整笔记资料代码:https://gitee.com/yinuo112/Backend/tree/master/Python/嘿马头...

感兴趣的小伙伴可以自取哦~


全套教程部分目录:


部分文件图片:

简介

1. 内容

  • 项目介绍
  • 数据库方案
  • Gitflow工作流
  • 认证方案
  • 对象存储
  • 缓存方案
  • RPC方案 grpc
  • 搜索方案
  • 即时通讯方案
  • APScheduler定时任务
  • supervisor进程管理

2. 目标

  • 以黑马头条产品为依托案例,但不再以具体业务实现为主
  • 力求掌握解决不同问题的实施方案
  • 深入理解并巩固前面所学的知识

ToutiaoWeb虚拟机使用说明

  • 作为项目的开发环境
  • 黑窗口 无GNOME 模拟企业中的开发服务器环境
  • CentOS7.2
  • 开机前先将虚拟机调成NAT模式
  • 虚拟机占用内存4G,如果主机内存不足,可启动前将内存占用调为2G
  • 在Windows中使用SSH客户端

    • Termius
    • xshell
  • ssh python@自己的ip地址
  • 用户名 密码

    • 系统

      • root -> chuanzhi
      • python -> chuanzhi
    • MySQL

      • root -> mysql
  • 端口

    • MySQL (mariadb)

      • master -> 3306
      • slave -> 8306 (mysql -uroot -p -h 127.0.0.1 --port=8306)
    • Redis

      • cluster -> 7000 7001 7002 7003 7004 7005
      • master & slave -> 6380 6381
      • sentinel -> 26380 26381 26382
    • Elasticsearch 5

      • 9200
  • Python 虚拟环境

    • workon toutiao
  • 关机 sudo shutdown now
  • 重启 reboot

Pycharm远程开发

可以在Windows中使用Pycharm编写代码,而代码的调试运行可以使用远程服务器中的python解释器。

在本地创建好工程项目(或从git上clone下代码)后,用Pycharm打开:

  1. 打开「Tools」设置 「Deployment」

  1. 选择SFTP

  1. 设置服务器名字

  1. 设置服务器信息
![4](/images/pycharm远程配置4.png)
  1. 测试服务器连接是否可用

  1. 设置上传代码的目录映射

  1. 打开设置,设置远程Python解释器

  1. 选择已存在的服务器设置

  1. 选择Create 复制服务器设置到解释器中

  1. 选择远程服务器中虚拟环境里的解释器
/home/python/.virtualenvs/toutiao/bin/python

  1. 设置远程服务器运行代码的目录映射

  1. 若Pycharm不能自动上传代码,可勾选Automatic Upload

注意,设置后Pycharm要加载环境,需要花费一定时间(只在配置后第一次使用发生)

产品与开发

1 产品介绍

黑马头条是一款基于个性化推荐的科技资讯类阅读产品,类似于今日头条,产品分为以下几个终端:

  1. 用户端

用户获取个性化推荐资讯的终端,有阅读、关注、评论、智能客服(聊天机器人)等功能,分移动Web页面及iOS和安卓App。

  1. 自媒体端

自媒体端是自媒体作者编辑、发布资讯文章、查看自媒体号运营数据的平台。

  1. MIS管理后台

MIS管理后台是黑马头条产品公司运营管理的后台,可进行用户管理、文章审核及管理、评论管理等。

2 原型图与UI图

  • 产品原型图

产品经理制作,是产品的原型设计,表达产品的功能组成

产品原型图的查看,需要安装Axure RP的Chrome浏览器扩展,方式如下:

  1. 进入Chrome浏览器「扩展程序」页面

  1. 打开「开发者模式」

  1. 点击「加载已解压的扩展程序」,并选择「Axure_RP_Extension_for_Chrome_0.6.3」目录

  1. 选择已安装扩展的「详细信息」

  1. 打开「允许访问文件网址」

安装后,打开原型图目录中的「index.html」文件即可。

原型图包含:

  • 前台原型图

    • 用户端
    • 自媒体端
  • 后台原型图(MIS管理后台)
  • UI效果图

用户界面效果图,由UI人员设计,是产品最终的用户能够看到的产品样式效果。

3 技术架构

项目采用前后端分离模式。

4 开发

人员团队(最少规模):
  • 产品经理 1人
  • UI 1人
  • 前端 2~3 人

    • Flutter 开发APP
    • Vue 开发Web页面
  • Web后端 2~3人
  • 推荐系统 2~3 人
  • Chatbot 1~2 人
  • 测试 1~2 人
开发平台
  • Gitlab

请到[

为方便将大家拉入到项目团队中,注册帐号的要求

注意:此gitlab不要放私人项目,会定期清理数据。

  • 使用Windows的同学需要在windows中安装git
  • YApi 接口管理

[

产品效果
  • 用户端

    • 移动web

    [

    • iOS

    [ (App下载地址)](

    • Android

    [ (App下载地址)](

  • 自媒体端

[

  • MIS管理后台

[

数据库

  • 数据库设计
  • SQLAlchemy
  • 数据库理论
  • 分布式ID
  • Redis

数据库设计

1 需求

根据黑马头条前台产品原型图中用户端的部分,进行数据库设计。

  • 表结构
  • 字段类型、是否允许为null、是否有默认值
  • 索引设计
  • 数据库引擎的选择

2 注意事项

  • 为了查询效率,可以做冗余字段设计(空间换时间的思想,属于一种反范式设计)
  • 字段类型的选择

    • 整型的存储大小与显示大小

      mysql的字段,unsigned int(3), 和unsinged int(6), 能存储的数值范围是否相同。如果不同,分别是多大?

    我们建立下面这张表:

    CREATE TABLE `test` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `i1` int(3) unsigned zerofill DEFAULT NULL,
        `i2` int(6) unsigned zerofill DEFAULT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8

插入一些数据后

发现,无论是int(3), int(6), 都可以显示6位以上的整数。但是,当数字不足3位或6位时,前面会用0补齐。

手册解释是这样的:

MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。

也就是说,int的长度并不影响数据的存储精度,长度只和显示有关,为了让大家看的更清楚,我们在上面例子的建表语句中,使用了zerofill。

最终答案:存储范围相同

  • char 与 varchar 的选择

    • char 不可变,查询效率高,可能造成存储浪费
    • varchar 可变,查询效率不如char,节省空间

常见MySQL数据类型

类 型大 小描 述
CAHR(Length)Length字节定长字段,长度为0~255个字符
VARCHAR(Length)String长度+1字节或String长度+2字节变长字段,长度为0~65 535个字符
TINYTEXTString长度+1字节字符串,最大长度为255个字符
TEXTString长度+2字节字符串,最大长度为65 535个字符
MEDIUMINTString长度+3字节字符串,最大长度为16 777 215个字符
LONGTEXTString长度+4字节字符串,最大长度为4 294 967 295个字符
TINYINT(Length)1字节范围:-128~127,或者0~255(无符号)
SMALLINT(Length)2字节范围:-32 768~32 767,或者0~65 535(无符号)
MEDIUMINT(Length)3字节范围:-8 388 608~8 388 607,或者0~16 777 215(无符号)
INT(Length)4字节范围:-2 147 483 648~2 147 483 647,或者0~4 294 967 295(无符号)
BIGINT(Length)8字节范围:-9 223 372 036 854 775 808~9 223 372 036 854 775 807,或者0~18 446 744 073 709 551 615(无符号)
FLOAT(Length, Decimals)4字节具有浮动小数点的较小的数
DOUBLE(Length, Decimals)8字节具有浮动小数点的较大的数
DECIMAL(Length, Decimals)Length+1字节或Length+2字节存储为字符串的DOUBLE,允许固定的小数点
DATE3字节采用YYYY-MM-DD格式
DATETIME8字节采用YYYY-MM-DD HH:MM:SS格式
TIMESTAMP4字节采用YYYYMMDDHHMMSS格式;可接受的范围终止于2037年
TIME3字节采用HH:MM:SS格式
ENUM1或2字节Enumeration(枚举)的简写,这意味着每一列都可以具有多个可能的值之一
SET1、2、3、4或8字节与ENUM一样,只不过每一列都可以具有多个可能的值
  • 索引

    • 主键 Primary Key
    • 外键 Foreign Key

      • 保持数据完整性
    ALTER TABLE tbl_name
        ADD [CONSTRAINT [symbol]] FOREIGN KEY
        [index_name] (index_col_name, ...)
        REFERENCES tbl_name (index_col_name,...)
        [ON DELETE reference_option]
        [ON UPDATE reference_option]

例如:

ALTER TABLE `user_resource` CONSTRAINT `FKEEAF1E02D82D57F9` FOREIGN KEY (`user_Id`) REFERENCES `sys_user` (`Id`)

CASCADE

在父表上update/delete记录时,同步update/delete掉子表的匹配记录

  * ON DELETE:删除主表时自动删除从表。删除从表,主表不变
  * ON UPDATE:更新主表时自动更新从表。更新从表,主表不变

SET NULL

在父表上update/delete记录时,将子表上匹配记录的列设为null (要注意子表的外键列不能为not null)

  * ON DELETE:删除主表时自动更新从表值为NULL。删除从表,主表不变
  * ON UPDATE:更新主表时自动更新从表值为NULL。更新从表,主表不变

NO ACTION

如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

  * ON DELETE:从表记录不存在时,主表才可以删除。删除从表,主表不变
  * ON UPDATE:从表记录不存在时,主表才可以更新。更新从表,主表不变

RESTRICT

同no action, 都是立即检查外键约束

SET DEFAULT

父表有变更时,子表将外键列设置成一个默认的值 但Innodb目前不支持

  • 索引 Key / Index

    • 提升查询效率,减慢增删改速度
  • 唯一约束 Unique

    • 保证数据不重复
  • MySQL数据库引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL


程序员一诺python
16 声望18 粉丝

python技术发烧友 资料收集狂