青训营项目的目录结构分析 | 青训营笔记

118 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

前言

在上一篇文章中,我简单的说明了一下我们这次项目的架构:

tiktok/
├── api-gateway           // 网关
├── idl                   // IDL
├── pkg                   // 库代码
│   ├── errno             // 错误处理
│   ├── configs           // 初始化配置
│   ├── constants         // 全局常量
│   ├── utils             // 通用函数
├── services              // 服务模块
│   ├── video             // 视频模块
│   ├── comment           // 评论 & 点赞模块
│   ├── user              // 用户模块
│   ├── follow            // 关注模块
│   └── chat              // 聊天模块
├── postman               // Postman配置
├── docs                  // 文档(待补充)
├── docker-compose.yaml   // Docker开发环境配置
└── README.md             // 项目介绍(待补充)

但是这是整个项目的整体框架,今天这篇文章我梳理了一下具体到网关和微服务部分的目录设计

这个目录设计我参考了我先前写的golang项目,以及字节跳动Kitex的官方demo,还有Hertz的官方demo

但是个人认为还是有很大的上升空间,我感觉在一些请求包装处理上可以做的更好

网关

这部分是负责HTTP与微服务之间的衔接

网关部分在我认为需要满足这些要求:

  • 与微服务建立通信
  • 限流
  • 拆封请求,打包返回数据
  • 负载均衡

在网关部分,我的设计暂时如下

tiktok/
├── api-gateway           // 网关
│   ├── biz               // 核心
│   ├── handler           // HTTP处理
│   ├── model             // 模型
│   ├── router            // 路由
│   ├── rpc               // RPC
├── main.go               // 程序入口
├── Makefile              // 常用指令
├── router.go
├── router_gen.go

通常来说,对于一个HTTP请求,首先会到达路由,路由分发到handler,再由handler拆解请求与rpc服务进行通讯

可以注意到我这里是没有鉴权部分的,我参考了某些公司会使用到的用户中台,也就是说,把用户鉴权、信息、注册登录等融合成一个项目,其他项目会与这个项目进行交互

结合到RPC部分,我就把鉴权部分丢给了user服务,让user服务当作一个小的”用户中台“

微服务

我们队伍由我担任队长,我是负责网关部分的设计,其余队友负责实现微服务

因此微服务部分目录结构没有做到完全统一,但是大部分差距不大

这里以我参与度较高的user服务为例,因为涉及到鉴权部分,我对user服务做了一些个人修改,也就是说,这个不是队友自己写的

user/
├── kitex_gen             // Kitex生成代码,后续迁移到根目录
├── client                // 客户端测试代码,会在开发完毕后删除
├── configs               // 微服务启动配置,包括数据库连接
├── service               // 微服务实际处理模块
├── model                 // 自定义结构体
├── script                // 编译指令
├── main.go               // 程序入口
├── handler.go            // 请求处理
├── kitex.yaml            // kitex配置
├── Makefile              // 常用指令

这是大部分微服务的结构吧

请求首先会在handler.go部分进行处理,handler部分先对请求进行处理,然后把请求转发到service层,在service层完成数据库交互/token生成等内容

总体请求思路

HTTP <-> API Gateway <-> Microservices

然后在Gateway和Microservices层再对请求做分层拆封处理

网关和微服务应该是各自分了3层,也就是一个请求应该会经过6个层面

其实并不清楚分层的原因究竟是什么,但是我分层后代码结构明显清晰了非常多,而且写起来效率更高。

还是要继续学习啊