抖音项目实现2: api层的实现 | 青训营笔记

目录导航:
1. 测试user微服务
2. api层的实现
3. github仓库地址

1.测试user微服务

接上一篇实现了user微服务,并将服务注册到了etcd上。测试为服务业编写一个客户端发现服务并进行rpc调用,新建douyin/test/userRpc.go如下:

package mainimport ("context""douyin/kitex_gen/user""douyin/kitex_gen/user/userservice""douyin/pkg/constants""douyin/pkg/middleware""github.com/cloudwego/kitex/client""github.com/cloudwego/kitex/pkg/retry"etcd "github.com/kitex-contrib/registry-etcd"trace "github.com/kitex-contrib/tracer-opentracing""log""time"
)func main() {r, err := etcd.NewEtcdResolver([]string{constants.EtcdAddress})if err != nil {panic(err)}c, err := userservice.NewClient(constants.UserServiceName,client.WithMiddleware(middleware.CommonMiddleware),client.WithInstanceMW(middleware.ClientMiddleware),client.WithMuxConnection(1),                       // muxclient.WithRPCTimeout(3*time.Second),              // rpc timeoutclient.WithConnectTimeout(50*time.Millisecond),    // conn timeoutclient.WithFailureRetry(retry.NewFailurePolicy()), // retryclient.WithSuite(trace.NewDefaultClientSuite()),   // tracerclient.WithResolver(r),                            // resolver)if err != nil {panic(err)}req := &user.DouyinUserRegisterRequest{Username: "111111", Password: "124"}resp, err := c.CreateUser(context.Background(), req)req1 := &user.DouyinUserLoginRequest{Username: "111111", Password: "124"}resp1, err := c.CheckUser(context.Background(), req1)req2 := &user.DouyinUserRequest{UserId: 1, Token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjIyOTg3NjkyMjMsImlhdCI6MTY3NjY4OTIyMywiaXNzIjoiZG91eWluIn0.Yot75U-ZZlXwUfaXEEag6A2Vf-U4LL-wO3RKb07KQlA"} //token是复制的注册后返回的tokenresp2, err := c.QueryCurUser(context.Background(), req2)if err != nil {log.Fatal(err)}log.Println(resp)log.Println(resp1)log.Println(resp2)time.Sleep(time.Second)
}

开启user微服务:终端进入/douyin/cmd/user输入以下指令:

bash ./build.shbash ./output/bootstrap.sh

提示如下即成功开启微服务:
sendpix1.jpg
编译运行userRpc.go,输出以下结果就是成功进行了服务发现并且完成user rpc调用:
sendpix3.jpg

2.api层的实现

服务发现&rpc调用

新建douyin/cmd/api/rpc文件夹,文件存放初始化rpc调用的init.go文件以及对外提供rpc调用接口的user.go文件代码如下:

package rpcimport ("context""douyin/kitex_gen/user""douyin/kitex_gen/user/userservice""douyin/pkg/constants""douyin/pkg/errno""douyin/pkg/middleware"trace "github.com/kitex-contrib/tracer-opentracing""time""github.com/cloudwego/kitex/client""github.com/cloudwego/kitex/pkg/retry"etcd "github.com/kitex-contrib/registry-etcd"
)var userClient userservice.Clientfunc initUserRpc() {r, err := etcd.NewEtcdResolver([]string{constants.EtcdAddress})if err != nil {panic(err)}c, err := userservice.NewClient(constants.UserServiceName,client.WithMiddleware(middleware.CommonMiddleware),client.WithInstanceMW(middleware.ClientMiddleware),client.WithMuxConnection(1),                       // muxclient.WithRPCTimeout(3*time.Second),              // rpc timeoutclient.WithConnectTimeout(50*time.Millisecond),    // conn timeoutclient.WithFailureRetry(retry.NewFailurePolicy()), // retryclient.WithSuite(trace.NewDefaultClientSuite()),   // tracerclient.WithResolver(r),                            // resolver)if err != nil {panic(err)}userClient = c
}// CreateUser create user info
func CreateUser(ctx context.Context, req *user.DouyinUserRegisterRequest) (int64, string, error) {resp, err := userClient.CreateUser(ctx, req)if err != nil {return -1, "", err}if resp.BaseResp.StatusCode != 0 {return -1, "", errno.NewErrNo(resp.BaseResp.StatusCode, resp.BaseResp.StatusMessage)}return resp.UserId, resp.Token, nil
}// CheckUser check user info
func CheckUser(ctx context.Context, req *user.DouyinUserLoginRequest) (int64, string, error) {resp, err := userClient.CheckUser(ctx, req)if err != nil {return -1, "", err}if resp.BaseResp.StatusCode != 0 {return -1, "", errno.NewErrNo(resp.BaseResp.StatusCode, resp.BaseResp.StatusMessage)}return resp.UserId, resp.Token, nil
}// UserInfo user info format
type UserInfo struct {ID   int64  `json:"id"`Name string `json:"name"`
}// QuryUser check user info
func QueryUser(ctx context.Context, req *user.DouyinUserRequest) (*UserInfo, error) {resp, err := userClient.QueryCurUser(ctx, req)if err != nil {return nil, err}if resp.BaseResp.StatusCode != 0 {return nil, errno.NewErrNo(resp.BaseResp.StatusCode, resp.BaseResp.StatusMessage)}var userInfo UserInfouserInfo.ID = resp.User.IduserInfo.Name = resp.User.Namereturn &userInfo, nil
}

gin接收参数返回结果

新建douyin/cmd/api/handles文件夹,文件存放接收参数完成rpc调用返回结果的对应功能文件,user服务包括登录login.go,注册register.go,查询用户信息get_cur_user.go,这里举例register.go,其余代码详见文章末尾github仓库。

package handlersimport ("context""douyin/cmd/api/rpc""douyin/kitex_gen/user""douyin/pkg/errno""github.com/gin-gonic/gin""log"
)func Register(c *gin.Context) {var registerVar UserParamif err := c.BindQuery(&registerVar); err != nil {SendUserResponse(c, errno.ConvertErr(err), -1, "")return}log.Print(registerVar)if len(registerVar.Username) == 0 || len(registerVar.Password) == 0 {SendUserResponse(c, errno.ParamErr, -1, "")return}userID, token, err := rpc.CreateUser(context.Background(), &user.DouyinUserRegisterRequest{Username: registerVar.Username,Password: registerVar.Password,})if err != nil {SendUserResponse(c, errno.ConvertErr(err), -1, "")return}SendUserResponse(c, errno.Success, userID, token)
}

配置路由&开启api服务

douyin/cmd/api下编写main.go,在main.go中配置路由并且开启服务器如下:

package mainimport ("douyin/cmd/api/handles""douyin/cmd/api/middleware""douyin/cmd/api/rpc""douyin/pkg/tracer""net/http""github.com/cloudwego/kitex/pkg/klog""github.com/gin-gonic/gin"
)func Init() {// TODOtracer.InitJaeger("api")rpc.InitRPC()
}func main() {Init()r := gin.Default()r.Use(middleware.OpenTracing())r.Static("/static", "./public")douyin := r.Group("/douyin")userGroup := douyin.Group("/user")userGroup.POST("/login/", handlers.Login)userGroup.POST("/register/", handlers.Register)userGroup.GET("/", middleware.AuthMiddleware(), handlers.QueryCurUser)if err := http.ListenAndServe("0.0.0.0:8080", r); err != nil {klog.Fatal(err)}
}

app连接服务端测试

运行douyin/api下的脚本build.shbash ./build.sh 就能开启服务等待客户端抖声app的连接啦:
sendpix5.jpg
在app中进行注册用户,注册成功,终端返回如下消息:

sendpix6.jpg
这样就完成了用户登录、注册和返回用户信息,如果后续选择社交方向将继续增加用户信息中关注数量和列表等。

3.github仓库地址

https://github.com/LaiYuShuang/douyin/tree/main

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音最新抓包方案

可以通过hook java层如下图所示的地方,dy默认走的是quick协议,但是为了兼容更多版本的手机,有一个降级操作,毕竟担心cronet低版本适配不好,所以可以通过hook这个方法来使其强制降级到Http协议。 frida脚本:…

从零开始搭建仿抖音短视频APP-构建后端项目

项目持续创作中... ​​​​​​仿抖音短视频APP项目专栏 目录 聚合工程 构建父工程 构建子工程 构建接口工程并且暴露api接口 优雅Restful相应封装 Lombok与多环境profile 数据层 配置数据库逆向生成工具 配置mybatis整合SpingBoot 使用Knife4j实现接口文档 聚合工程…

抖音 -抖店开放平台 SDK 实现及项目工程

抖音 - 抖店开放平台 SDK 抖音 - 抖店开放平台:https://op.jinritemai.com/ 该 SDK 已实现 API 接口调用和消息推送验证解析 项目地址 github: gitee: 项目结构 common-rocketmq: 根据 阿里 com.aliyun.openservices 的 on…

将手机接收到的短信实时转发到服务器web端上(或其他需要的地方)

在爬虫时, 有的网站要登录, 登录时需要短信验证, 因为爬虫是跑在服务端上, 所以希望服务器能实时获取到手机上的短信,使爬虫能够自动化. 为此自己开发了个能实时将安卓手机上的短信转发到服务器上. 展示如下:(将手机短信发送到服务端并储存起来,然后可以网页形式访问这些短信.…

(转)短信vs.推送通知vs.电子邮件:app什么时候该用哪种方式来通知用户?

转:http://www.360doc.com/content/15/0811/00/19476362_490860835.shtml 现在,很多公司都关心的一个问题是:要提高用户互动,到底采取哪一种通信技术获得的效果是最好的,怎样才能让用户心甘情愿的融入到自己的产品语境…

入门级短信推送,你还不会吗?

短信推送服务是生活中常见的,包括一些企业的营销或验证码场景的服务,这些都是需要短信服务来进行的 在开发中也比较常见,如开发一个个人博客系统,就会给注册或登录界面加上填写手机号发送验证码功能,或者加上发送邮件等…

瑞吉外卖(22)- 短信发送功能开发(了解一下)

文章目录 效果展示短信服务介绍阿里云短信服务-(了解)介绍注册账号 代码开发maven坐标调用API(SMSUtils.java) 效果展示 短信服务介绍 阿里云短信服务-(了解) 介绍 注册账号 这里我们不使用阿里云了,注册需要营业执照,我们只是了…

Tasker短信转发

需要开启权限(在权限管理中)与监听功能(在系统设置的辅助功能中) (1)添加事件: 点击右下角的 ----> 事件 ----> 电话 ----> 收到短信 ----> 不做修改返回即可或者在发件人或者内…

Tasker 短信转发微信,所有通知转发微信

前言 快速写一篇,不想花太多时间,不是详细教程,导入就完了。 准备 一台能看片的安卓手机(至少安卓5.0)。安装好Tasker(版本越新越好,目前5.9.3 beta3)。权限给足,自启&am…

android实现短信自动转发,利用短信通知的方式在Tasker中实现收到Android手机短信自动转发到微信...

在Tasker中利用短信的通知实现短信内容转发到微信 之前的教程是利用Tasker自带的短信变量来实现的,这有一个无法解决问题:在360,魅族,坚果等品牌的手机中无法获取短信的消息内容。 利用短信的通知则可以获取短信的内容&#xff0c…

AIGC技术发展和应用方向

AIGC(Artificial Intelligence Generated Content)是指通过人工智能技术生成的各种文本、图像、音频和视频等多媒体内容。AIGC技术是机器学习和自然语言处理等技术的结合,通过对海量数据的学习和分析,可以让计算机模拟人类的创造力…

未来先行者共赴2023全球智博会

从传统机器学习到深度学习,从简单执行到多模态、多任务的综合处理,人工智能技术正不断向更加智慧和复杂的领域拓展进化。伴随着人工智能一路高歌猛进的跨越式发展,产业寻求共融,加速智慧升级;城市汇流聚链,…

GAN出一个女朋友

文章目录 GAN(生成对抗网络)1. 生成对抗网络简述2.具体内容2.1 网络如何训练2.2 网络训练时会遇到的问题 3.GAN的发展4.GAN的代码实践4.1 基于GAN的mnist数据生成4.2 放大招—生成美女图片4.2.1 爬取美女图片4.2.2 提取人脸4.2.3 开始训练 GAN(生成对抗网络&#xf…

chatgpt赋能python:Python更换桌面背景指南:教你如何用Python快速实现桌面背景更换

Python更换桌面背景指南:教你如何用Python快速实现桌面背景更换 如果你已经厌倦了一成不变的桌面背景,那么Python可以帮助你快速实现更换功能。本指南将教您如何用Python编写简单的代码来更改桌面背景。 如何用Python更换桌面背景 Python中有几个库可…

chatgpt赋能python:Python自定义背景:让你的编程世界更加缤纷多彩

Python 自定义背景:让你的编程世界更加缤纷多彩 随着科技的迅速发展,人们的日常生活和工作中越来越多地依赖于电脑和各种数字设备。而对于程序员来说,他们的编程世界更是离不开电脑和代码编辑器。因此,如何让这个世界变得更加优美…

chatgpt赋能python:如何使用Python将背景色更改为黑色

如何使用Python将背景色更改为黑色 在网页设计中,背景色是非常重要的元素之一。有时候,为了让网页看起来更加时尚和艺术,设计师可能会使用黑色背景来营造一种神秘和高质感的感觉。在本篇文章中,我们将介绍如何使用Python将背景色…

chatgpt赋能python:Python图片查看器:优化你的图片浏览体验

Python图片查看器:优化你的图片浏览体验 如果你常常处理图片,那么一个高效的图片浏览器会节约你大量的时间。本文将介绍一款使用Python编写的开源图片查看器,它可以帮助你快速预览和编辑图片。此外,我们还会分享如何使用关键字优…

C/C++编程:继承构造函数

引入 在传统C中,如果派生类要使用使用基类的构造函数,通常需要在构造函数中显式声明: struct A{ public:A(int i) {} };struct B : A{B (int i) : A(i){} };B派生自A,B又在构造函数中调用A的构造函数,从而完成构造函…

C++11之继承构造函数(using 声明)

系列文章 C11之正则表达式(regex_match、regex_search、regex_replace) C11之线程库(Thread、Mutex、atomic、lock_guard、同步) C11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管…

继承与派生(Part Ⅱ)——派生类的构造函数/析构函数

派生类的构造函数和析构函数 构造函数的主要作用是对数据成员初始化。基类的构造函数是不能继承的,在声明派生类时,派生类并没有把基类的构造函数继承过来,因此,对继承过来的基类成员初始化的工作也要由派生类的构造函数承担。所…