2024 go-zero社交项目实战

背景

一位商业大亨,他非常看好国内的社交产品赛道,想要造一款属于的社交产品,于是他找到了负责软件研发的小明。 小明跟张三一拍即合,小明决定跟张三大干一番。

社交产品MVP版本需求

MVP指:Minimum Viable Product,即最小可行产品

张三希望以最快的时间看到一款属于自己的社交产品,于是有了接下来的需求。

1.用户服务--已完成

注册、登录、查看个人信息、更新个人信息、注销功能

2.推文服务

发布推文、查看推文、更新推文、删除推文、我的推文列表

用户服务详细需求

张三跟小明很快就赶出了MVP版的用户服务的详细需求

1.注册功能。
支持账号密码注册功能:
  • 账号6-16位,支持数字大小写不敏感的字母和特殊字符_且必须是英文字符开头
  • 密码必须8-32位,支持数字大小写敏感的字母
2.登录功能。
  • 支持账号密码登录功能
3.更新个人信息功能。
  • 支持更新的信息:头像、昵称、个性签名、性别、地区
4.查看个人信息功能。
  • 查看个人的信息:头像、昵称、个性签名、性别、地区
5.注销功能。
  • 注销功能:申请注销后,7天内没有登录,则把账号注销
  • 查看已注销的用户信息时,昵称显示已注销,头像设置展示为默认的官方头像

推文服务详细需求

张三跟小明很快就赶出了MVP版的推文系统的详细需求:

功能1:推文
  • 发表推文。推文最大长度限制10000字符,标题可选,推文必填
  • 查看推文。展示的信息字段:标题、内容、时间(优先展示编辑时间,其次发表时间)
  • 更新推文。支持更新的字段:标题、推文。标题可选,推文必填
  • 删除推文。真实删除,从数据库中移除数据
  • 我的推文列表。查看已经发表过的推文,按发表时间排序排列
功能2:互动
  • 浏览推文。浏览推文按计算方式:每篇推文,点击进入详情累计加1,同一用户24小时内浏览多次,只累计加1
  • 点赞推文。点赞数计算方式:用户点赞+1,取消点赞-1
  • 评论推文
    • 无限层级评论
    • 评论数计算方式:所有能展示的评论数量。比如有1条评论,这条评论有3条子评论,评论的总数量是4.如果删除这条评论,那么评论的总数量是0
  • 分享推文。分享数计算方式:每篇推文,分享累计加1,同一用户24小时内分享多次,只累计加1
  • 收藏推文。点赞数计算方式:用户点赞+1,取消点赞-1

开发环境的搭建

0.安装go语言,推荐使用1.22以上的版本

1.安装goctl,用于提升效率,生成各种代码

go install github.com/zeromicro/go-zero/tools/goctl@latest

2.安装protoc,微服务grpc需要用到的组件

goctl env check --install --verbose --force

3.mysql

docker run -p 3306:3306 --name test-mysql -v mysql:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

4.redis

docker run -d --name redis -p 6379:6379 redis

5.etcd


# etcd服务
docker network create demo-network --driver bridge
docker run -d --name etcd-server --network demo-network --publish  2379:2379 --publish  2380:2380 --env ALLOW_NONE_AUTHENTICATION=yes --env ETCD_ADVERTISE_CLIENT_URLS=http://etcd-server:2379 bitnami/etcd:latest
# 检查etcd容器ip
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' etcd-server
# (可选)etcd keeper http://127.0.0.1:8080/
docker run -d -p 8080:8080 -e ETCD_SERVERS=http://172.18.0.2:2379 --network=demo-network --name etcd-keeper evildecay/etcdkeeper

实现用户服务

1.注册功能
支持账号密码注册:
  • 账号6-16位,支持数字大小写不敏感的字母和特殊字符_且必须是英文字符开头
  • 密码必须8-32位,支持数字大小写敏感的字母
  • 支持账号密码登录功能
2.登录功能
  • 如果该用户申请注销账号了,登录后自动取消注销
3.个人信息。包含查看、更新
  • 查看/更新的个人信息:头像、昵称、个性签名(255字符以内)、性别、地区

4.注销账号功能

  • 注销功能:申请注销后,7天内没有登录,则把账号注销
  • 查看已注销的用户信息时,昵称显示已注销,头像设置展示为默认的官方头像


初始化user服务

# 初始化user rpc服务
goctl rpc new user
# 安装依赖
go mod tidy
create table user
(id         bigint auto_increment comment '主键id'primary key,avatar     varchar(255) default '' not null comment '头像链接地址',nickname   char(32)     default '' not null comment '昵称',account    char(32)     default '' not null comment '账号',password   char(32)     default '' not null comment '密码',bio        varchar(255) default '' not null comment '个人简介 Biography',gender     tinyint      default 2  not null comment '性别 0 女 1 男 2 未知',region     varchar(20)  default '' not null comment '地区',status     tinyint      default 0  not null comment '用户状态0 正常 1 注销中 2 已注销',created_at int          default 0  not null comment '创建时间',updated_at int          default 0  not null comment '更新时间',deleted_at int          default 0  not null comment '删除时间',constraint user_pkunique (account)
)comment '用户表' collate = utf8mb4_bin;
# 项目根目录下执行
# 加上 -c 参数可生成集成缓存的model代码
# --ignore-columns -i 忽略字段控制
goctl model mysql datasource -url="root:123456@tcp(127.0.0.1:3306)/go_zero_demo" -table="user"  -dir="./user/model" --ignore-columns -i

user服务功能实现

定义proto
syntax = "proto3";package user;
option go_package="./user";message UserInfo {int64 UserId  = 1;        // 主键idstring Avatar = 2;     // 头像链接地址string Nickname  = 3;  // 昵称string Account    = 4; // 账号string Password  = 5; // 密码string Bio       = 6; // 个人简介 Biographyint64 Gender     = 7; // 性别 0 女 1 男 2 未知string Region     = 8; // 地区int64 Status     = 9; // 地区int64 CreatedAt = 10; // 创建时间int64 UpdatedAt = 11; //更新时间
}message RegisterReq {string Account = 1; // 自定义账号string Password = 2; // 密码
}
message RegisterResp {int64 UserId = 1; // 用户ID
}message LoginReq {string Account = 1; // 自定义账号string Password = 2; // 密码
}
message LoginResp {string SessionId = 1; // 用户登录标识
}message CancellationReq {int64 UserId = 1; // 用户ID
}
message CancellationResp {}message GetUsersReq {int64 UserId = 1; // 用户ID
}
message GetUsersResp {UserInfo UserInfo = 1;
}message UpdateUserReq {UserInfo UserInfo = 1;
}
message UpdateUserResp {}service User {// 注册rpc Register(RegisterReq) returns(RegisterResp);// 登录rpc Login(LoginReq) returns(LoginResp);// 注销rpc Cancellation(CancellationReq) returns(CancellationResp);// 查用户信息rpc GetUsers(GetUsersReq) returns(GetUsersResp);// 更新用户信息rpc UpdateUser(UpdateUserReq) returns(UpdateUserResp);
}
# 项目根目录下执行
goctl rpc protoc user/user.proto --go_out=./user --go-grpc_out=./user --zrpc_out=./user
1.注册功能
功能逻辑代码::./user/internal/logic/registerlogic.go
测试代码::./user/internal/logic/registerlogic_test.go
2.登录功能
功能逻辑代码::./user/internal/logic/loginlogic.go
测试代码::./user/internal/logic/loginlogic.go
3.注销功能
功能逻辑代码::./user/internal/logic/cancellationlogic.go
测试代码::./user/internal/logic/cancellationlogic_test.go
4.个人信息
查看个人信息
功能逻辑代码::./user/internal/logic/getuserslogic.go
测试代码::./user/internal/logic/getuserslogic_test.go
更新个人信息
功能逻辑代码::./user/internal/logic/updateuserlogic.go
测试代码::./user/internal/logic/updateuserlogic_test.go

实现推文服务

初始化推文post服务

goctl rpc new user
go mod tidy
create table post
(id         bigint auto_increment comment '主键id',user_id    bigint   				 			 not null comment '用户id',title      varchar(255) default '' not null comment '标题',content    text         					 not null comment '推文内容',status     tinyint      default 0  not null comment '状态 0 正常 1 已删除',views      int          default 0  not null comment '浏览数',likes      int          default 0  not null comment '点赞数',comments   int          default 0  not null comment '评论数',shares     int          default 0  not null comment '分享数',collects   int          default 0  not null comment '收藏数',created_at int          default 0  not null comment '发表时间',updated_at int          default 0  not null comment '更新时间',deleted_at int          default 0  not null comment '删除时间',constraint post_pkprimary key (id)
)comment '推文表' collate = utf8mb4_bin;
# 项目根目录下执行
# 加上 -c 参数可生成集成缓存的model代码
# --ignore-columns -i 忽略字段控制
goctl model mysql datasource -url="root:123456@tcp(127.0.0.1:3306)/go_zero_demo" -table="post"  -dir="./post/model" --ignore-columns -i

post服务功能实现

定义proto
syntax = "proto3";package post;
option go_package="./post";// 定义实体结构
message PostData {int64 Id = 1; // idstring Title = 2; // 标题string Content = 3; // 内容int64 Views = 4; // 查看数int64 Likes = 5; // 喜欢数int64 Comments = 6; // 评论数int64 Shares = 7; // 分享数int64 Collects = 8; // 收藏数}message CreatePostReq {PostData PostData = 1;
}message CreatePostResp {}message UpdatePostReq {PostData PostData = 1;
}message UpdatePostResp {}message DeletePostReq {int64 PostId = 1;
}message DeletePostResp {}message GetPostReq {int64 PostId = 1;
}message GetPostResp {}message BatchPostReq {repeated int64 PostId = 1;
}message BatchPostResp {repeated PostData Infos = 1;
}message GetUserPostListReq {int64 UserId = 1; // 用户ID
}message GetUserPostListResp {repeated PostData Infos = 1;
}service Post {// 发表推文rpc CreatePost(CreatePostReq) returns(CreatePostResp);// 更新推文rpc UpdatePost(UpdatePostReq) returns(UpdatePostResp);// 删除推文rpc DeletePost(DeletePostReq) returns(DeletePostReq);// 获取单条推文rpc GetPost(GetPostReq) returns(GetPostResp);// 批量获取推文rpc BatchPost(BatchPostReq) returns(BatchPostResp);// 用户用户推文列表rpc GetUserPostList(GetUserPostListReq) returns(GetUserPostListResp);
}
# 项目根目录下执行
goctl rpc protoc post/post.proto --go_out=./post --go-grpc_out=./post --zrpc_out=./post
1.发表推文功能
功能逻辑代码::./post/internal/logic/createpostlogic.go
测试代码::./post/internal/logic/createpostlogic_test.go
2.查看推文功能
功能逻辑代码::./post/internal/logic/getpostlogic.go
测试代码::./post/internal/logic/getpostlogic_test.go
3.更新推文功能
功能逻辑代码::./post/internal/logic/updatepostlogic.go
测试代码::./post/internal/logic/updatepostlogic_test.go
4.删除推文功能
功能逻辑代码::./post/internal/logic/deletepostlogic.go
测试代码::./post/internal/logic/deletepostlogic_test.go
5.查看用户推文列表功能
功能逻辑代码::./post/internal/logic/getuserpostlistlogic.go
测试代码::./post/internal/logic/getuserpostlistlogic_test.go

实现API服务

初始化bff服务

goctl api new bff# 生成api代码
goctl api go -api ./bff/bff.api -dir ./bff/

其它

1.跨域配置

func StartHttpServer(configFile *string) {var c config.Configconf.MustLoad(*configFile, &c)server := rest.MustNewServer(c.RestConf, rest.WithCustomCors( //跨域处理func(header http.Header) {header.Set("Access-Control-Allow-Origin", "*")header.Set("Access-Control-Allow-Headers", "*")header.Set("Access-Control-Allow-Methods", "POST,OPTIONS")header.Set("Access-Control-Allow-Credentials", "true")}, nil, "*"))defer server.Stop()……server.Start()
}

2.服务依赖配置

UserRpcConf:Etcd:Key: dev.user.rpc
# 默认是两秒Timeout: 4500 
# 当值为 true 时,不会阻塞 rpc 链接NonBlock: false

弱依赖可配置为 true,否则初始化rpc的时候会报以下错误

rpc dial: etcd://127.0.0.1:2379/dev.user.rpc, error: context deadline exceeded, make sure rpc service "dev.user.rpc" is already started

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/144022.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言二级考试】循环结构设计

C语言二级考试——循环结构程序设计 五.循环结构程序设计 1.for循环结构 2.while和do-while循环结构 3.continue语句和break语句 4.循环的嵌套 知识点参考【C语言】循环-CSDN博客 文章目录 1.for循环2.while和do-while循环结构3.continue语句和break语句4.循环的嵌套 1.for循环…

阿里云容器服务Kubernetes部署新服务

这里部署的是前端项目 1.登录控制台-选择集群 2.选择无状态-命名空间-使用镜像创建 3.填写相关信息 应用基本信息: 容器配置: 高级配置: 创建成功后就可以通过30006端口访问项目了

【测向定位】差频MUSIC算法DOA估计【附MATLAB代码】

​微信公众号:EW Frontier QQ交流群:554073254 摘要 利用多频处理方法,在不产生空间混叠的情况下,估计出高频区域平面波的波达方向。该方法利用了差频(DF),即两个高频之间的差。这使得能够在可…

视觉语言大模型模型介绍-CLIP学习

多模态学习领域通过结合图像和文本信息,为各种视觉语言任务提供了强大的支持。图像和文本的结合在人工智能领域具有重要的意义,它使得机器能够更全面地理解人类的交流方式。通过这种结合,模型能够处理包括图像描述、视觉问答、特征提取和图像…

多线程---线程的状态及常用方法

1. 线程的状态 在Java程序中,一个线程对象通过调用start()方法启动线程,并且在线程获取CPU时,自动执行run()方法。run()方法执行完毕,代表线程的生命周期结束。 在整个线程的生命周期中,线程的状态有以下六种&#xff…

前海桂湾的海边免费停车场

​前海很多打工人晚上加班前海边散步的地方。相信很多前海打工人都曾经路过这个免费的停车场。坐标出于滨海大道的断头路区域。 看卫星地图可以发现,是个断头路,但是面积还是很大,停个几十辆车没问题。我就停过一次,周末带娃来这里…

ESP8266+使用串口1打印LOG+释放串口0

Menuconfig配置 具体的位置位于Component config > Common ESP-related 配置后,串口0上电还是会打印一些信息,除此之外就不打印了。 ets Jan 8 2013,rst cause:2, boot mode:(3,6)load 0x40100000, len 7792, room 16 tail 0 chksum 0x44 load 0…

Lab2 【哈工大_操作系统】操作系统的引导

本节将更新哈工大《操作系统》课程第二个 Lab 实验 操作系统的引导。按照实验书要求,介绍了非常详细的实验操作流程,并提供了超级无敌详细的代码注释。文末附完整 bootsect.s 和 setup.s 标准答案代码以及超详细注释。 实验目的: 熟悉 hit-o…

C语言中的assert断言

Assert断言 断言是程序中处理异常的一种高级形式。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。 用法: #…

AD域控服务器

1.AD域控服务器安装 2.客户端Windows10加入域环境 3.组织单位OU和域用户创建 目的是分部门管理用户和使用域用户登录客户端 4.域用户安全策略 5.当客户端密码锁住了,管理员解锁账户。 6.只允许域用户使用自己的电脑 7.域策略 7.1统一客户端桌面壁纸 7.2重定向用户配置文件路径…

软件设计画图,流程图、甘特图、时间轴图、系统架构图、网络拓扑图、E-R图、思维导图

目录 一、流程图 二、甘特图 三、时间轴图 四、系统架构图 五、网络拓扑图 六、E-R图 七、思维导图 一、流程图 是一种用符号表示算法、工作流或流程的图形。用不同的图形表示不同含义,如椭圆表示开始和结束、菱形表示判断等。 画图工具WPS office 应用市场…

如何使用ssm实现基于vue.js的购物商场的设计与实现+vue

TOC ssm616基于vue.js的购物商场的设计与实现vue 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和笔记本…

如何使用ssm实现基于ssm框架的车辆出租管理系统+vue

TOC ssm643基于ssm框架的车辆出租管理系统vue 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域…

LeetCode_sql_day28(1767.寻找没有被执行的任务对)

描述:1767.寻找没有被执行的任务对 表:Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

7iDU AMP田岛绣花机驱动器维修0J2100400022

7iDU AMP神州田岛绣花机驱动器维修0J2101300000绣花机控制器等全系列型号均可处理。 田岛7iDU AMP是田岛绣花机中使用很广的一种5相驱动器,在田岛平绣车TMEF-H,TMFD中应用,在链条车TMCE112S,和盘带车TMLG中大量使用。其采用的东芝…

面试或工作中的经典问题共享

前言:大家可以把面试或工作中遇到了经典问题共享一下,我们共同学习成长,金九银十,祝各位都能步步高升! 文档大家可以往下追加,请勿删除他人编写的内容哦。我会把问题的相关资料进行补充,以便各…

HTB-Blue(永恒之蓝漏洞复现)

前言 各位师傅大家好,我是qmx_07,今天给大家讲解Blue靶机 渗透过程 信息搜集 服务器开放了smb服务,漏洞探测显示 具有ms17_010(永恒之蓝漏洞) 利用永恒之蓝 搜索永恒之蓝漏洞 use使用永恒之蓝漏洞 rhost //对方主机 lhost //回连主机 …

[学习笔记]树链剖分(简易版) 及其LCA

树链剖分 先讲解一下一些基础定义(都是在树上) 重儿子: 一个节点中所有儿子中子树大小最大的一个儿子(每个节点最多有一个重儿子)轻儿子: 一个节点除重儿子外所有的节点重链: 若干个重儿子组成的链链顶: 一条链中深度最小的节点 以下图为例子 (红色连续线段为重链) 对于节点…

【LabVIEW】事件结构的用法

本篇文章记录我学习LabVIEW的事件结构用法,希望我的分享对你有所帮助! 目录 一、案例说明 1、 LabVIEW实现“YAXBXC的计算” 2、添加事件结构 一、案例说明 在LabVIEW实现“YAXBXC的计算”的基础上,加上事件结构,实现单击一次按…

分布式锁总结2 - redis实现分布式锁并解决常见问题

目录 1. redis分布式锁 1.1基本原理图示如下 1.2 Redis通过一个lock变量实现一个最简单的分布式锁实现代码: 2 升级简单分布式锁(实现原子加锁与安全删锁) 2.1 但1中的简单分布式锁存在几个问题: 2.1.1 问题1. 如果加完锁执…