目录导航:
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

提示如下即成功开启微服务:

编译运行userRpc.go,输出以下结果就是成功进行了服务发现并且完成user rpc调用:

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的连接啦:

在app中进行注册用户,注册成功,终端返回如下消息:


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

3.github仓库地址

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

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

  1. 【Go入门】Socks5代理服务器实现 翻译api调用 | 青训营笔记

    这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记. [课程一]Go基础 主要内容 第一节课主要介绍了go的语法基础,包括变量.循环分支.数组切片.函数方法.错误处理.字符串.格式化处理. ...

  2. 三个小项目入门Go语言|字节青训营笔记

    前言 这是青训营的第一课,今天的课程比较快速的讲解了go语言的入门,并配合三个小的项目实践梳理所学知识点,这里详细回顾一下这三个项目,结合课后作业要求做一些代码补充,并附上自己的分析,青训期间的所有课 ...

  3. 抖音获取抖音商品原数据 API 返回值说明

    今天分享的是抖音获取抖音商品原数据 API 返回值说明: item_get_app-获取抖音商品原数据 [查看演示] onebound.douyin.item_get_app 公共参数: 注册链接(获 ...

  4. 抖音店铺商品详情API,订单交易详情接口

    抖音店铺商品详情API,订单交易详情接口

  5. 字节青训营抖音APP

    You just work hard, the rest is up to time GitHub地址:https://github.com/xiaodainiao/TikTokLite TikTok ...

  6. EXPER LOG | 作为ByteDance青训营-客户端-项目leader的历程和收获

    ~此处为记录2022SUMMER青训营,我担任项目组长时,在团队协作,项目任务分配,规则商议协定以及收获心得 ~还在更新中 极简tiktok内容介绍: 榜单模块(主页面一) 榜单页面设计 历史数据查询 ...

  7. 人人皆可操作的108个抖音项目:汽车领域细分及玩法变现 (7)

    相对公众号领域,抖音博主们普遍更注重塑造 IP 人设, 排名前 100 名的车评类账号,绝大 部分都是由真人出镜的自媒体博主, 和美妆/颜值类抖音账号相比,多数车评类账号的命名 更加接地气,通俗易懂. ...

  8. 人人皆可操作的108个抖音项目:情感主播也能年入百万(8)

    互联网赚钱的本质就是曝光引流+成交转化,卖的是信息差.资源交换.网络上大部分项目都是可复制性的. 今天猫哥讲的项目,就是一直需求永不断的情感项目,和人性有关. 在情感领域,那些闷声发大财的,各种玩法, ...

  9. GitHub标星1.6K,大佬开源的抖音项目,刷屏全网!

    点击上方"Github爱好者社区",选择星标 回复"资料",获取小编整理的一份资料 作者:GG哥 来源:GitHub爱好者社区(github_shequ) 这是 ...

最新文章

  1. python format 字典_python 用字典格式化字符串
  2. 代码检查规则:Java语言案例详解
  3. 事实表和维度表是怎么造数据_从电商数据指标到电商数据中台
  4. #pragma warning(pop) 和 #pragma warning(push)的作用
  5. Linux 系统应用编程——出错处理(errno)
  6. 《Spring Data实战》——2.2 定义查询方法
  7. 约束最优化方法 (一) 最优性条件
  8. 微软百名员工公开请愿,力挺“996.ICU”
  9. 人人都能成为安全防范的高手 ——《黑客新型攻击防范:深入剖析犯罪软件》...
  10. None of the configured nodes are available
  11. 计算机30秒自动更换的桌面软件,无需任何软件即可在计算机上的多个桌面墙纸之间自动切换...
  12. [c++]数组的逆输出
  13. 全球物联网产品信息安全国际技术规范(ISO15408体系)——《物联网安全通信模块信息安全技术规范》(IoT Secure Communications Module Protection Profi
  14. Windows 11系统还原点怎么创建?
  15. 测试VPS服务器脚本,一检测VPS网络速度,硬盘性能等
  16. 多线程(1)——什么是多线程
  17. 新年美食鉴赏——基于注意力机制CBAM的美食101分类
  18. 推荐算法之DeepCross模型
  19. Spring(https://www.zhihu.com/question/38597960)
  20. C语言数组初始化骚操作

热门文章

  1. using(){}的使用
  2. s23赛季服务器维护到什么时候,王者荣耀s23赛季什么时候结束 s23赛季结束具体时间...
  3. python线程池传入多个参数_python 线程池ThreadPoolExecutor
  4. 股票下单接口目前开放的有吗?
  5. 数据结构之非线性结构:树、图
  6. 在线Html实体编码/解码 (含10进制,16进制)
  7. [渗透测试]Vulnstack 红队(二)
  8. 使用工具类按一定规则读取Excel文件
  9. IDEA--自定义注释模板
  10. python获取excel工作表名称