GitEval-Backend 是一个后端服务项目,旨在通过分析用户的 GitHub 数据和行为,评估其技术领域、国籍、活动情况,并对用户进行评分。该项目采用 MVC 架构,通过多层设计实现了高可维护性和可扩展性。
项目遵循 MVC 设计模式,分为 api、client、conf、controller、docs、middleware、model、pkg、service 等层,达到代码的高解耦性和模块化。
bash复制代码GitEval-Backend
├── api # API 层:请求、响应体结构与路由定义
│ ├── request # 请求体结构定义
│ ├── response # 响应体结构定义
│ └── route # 路由配置
├── client # gRPC 客户端:用于与 LLM(大语言模型)服务进行通信
│ ├── gen # 自动生成的 gRPC 代码
│ └── proto # gRPC 协议文件及客户端封装
├── conf # 配置文件:加载和管理配置信息
├── controller # 控制器层:处理业务逻辑与请求响应
├── docs # API 文档:Swagger 及生成文件
├── middleware # 中间件层:JWT 验证等
├── model # 数据模型层:数据库与缓存操作
├── pkg # 工具层:封装通用工具和第三方库
├── service # 服务层:定义核心业务逻辑
├── .dockerignore # Docker 忽略配置
├── .gitignore # Git 忽略配置
├── Dockerfile # Docker 配置文件
├── go.mod # Go 模块配置文件
├── main.go # 程序入口文件
├── README.md # 项目说明文档
├── wire.go # 依赖注入配置文件
└── wire_gen.go # wire 生成的依赖注入文件
本项目遵循微服务架构,通过 gRPC 实现与外部服务的高效通信。为了实现高效的数据存储和查询,系统引入了 MySQL 和 Redis。
- MySQL:用于持久化存储用户信息、GitHub 仓库数据、用户关系等结构化数据。
- Redis:用于缓存用户的登录状态、JWT 黑名单以及临时数据,确保高效的数据读取和减少数据库压力。
以下是系统架构的简单示意图,展示了各个模块及其交互方式:
+-----------------------+
| Frontend |
+----------+------------+
|
|
+---------v---------+
| API Gateway | #这里是nginx
+---------+---------+
|
+---------v---------+
| Middleware | #涉及jwt验证的请求
+---------+---------+
|
+---------v---------+
| Controller | #分发请求
+---------+---------+
|
+---------v---------+
| Service | #实现服务逻辑
+---------+---------+
|
+---------------+----------------+
| |
+--------v-------+ +-------v------+
| Model | | LLM (gRPC) | #处理大模型部分逻辑
+--------+-------+ +--------------+
|
+----------v---------+
| MySQL | Redis |
+------------+-------+
-
- 生成令牌:在用户成功登录后,系统会生成一个 JWT 令牌用于标识用户身份。
- 安全验证:每次请求时,服务器会验证 JWT 的合法性,确保只有持有有效令牌的用户才能访问受限资源。
- 黑名单机制:当用户登出时,其 JWT 会被存储在 Redis 的黑名单中,确保该令牌即使在有效期内也无法继续使用,从而提升安全性。
- 用户长连接管理:每个登录的用户在系统中会建立一个 GitHub 客户端连接,用于拉取用户 GitHub 数据,如仓库信息和活动记录。
- 高效存储:利用
sync.Map维护用户的长连接客户端,确保高效的连接管理。 - 定时清理:系统会定时清理长时间未使用的客户端连接,防止资源浪费并提高系统的可扩展性。
- 高效传输:gRPC(Google Remote Procedure Call)用于在系统与 LLM(大语言模型)服务之间建立高效的通信机制。它基于 HTTP/2 传输协议,相比传统 REST 提供更低的延迟和更好的性能。
- 安全性:gRPC 本身支持多种认证机制,使得服务间通信更加安全可靠。
- 可扩展性:基于 protobuf(协议缓冲区)定义接口,易于扩展和维护,特别适用于微服务架构。
- 自动化依赖注入:使用 Google 的 Wire 工具自动生成依赖注入代码,简化了各个模块之间的依赖管理。
- 提升模块解耦性:通过依赖注入,实现各模块之间的松耦合,避免模块之间的硬编码依赖,提高代码的可维护性和可测试性。
- 简化开发:开发人员只需定义依赖关系,Wire 会自动生成相应的依赖注入代码,降低开发复杂度。
- MySQL:用于存储核心用户数据、仓库信息等持久化数据。表结构设计上,充分考虑了数据的规范化和查询性能的优化,确保数据的完整性和高效查询。
- Redis:用作缓存和黑名单存储。用户的 JWT 黑名单、GitHub 用户连接池的缓存等都存储在 Redis 中。
- GitHub 授权登录:用户首先通过
login接口获取 GitHub 授权链接,授权成功后回调到系统的callback接口。系统会获取 GitHub 返回的授权code,以此获取用户的基本信息和 GitHub 访问权限。 - 用户数据初始化:在用户初次登录时,系统会初始化其基本信息,包括用户名、头像等,同时启动异步任务获取用户的社交关系网并预测其国籍和技术领域。
- 数据收集:系统通过 GitHub API 获取用户各个仓库的 README 内容、主要编程语言等数据。
- LLM 推断:将仓库信息传递给 LLM 服务,通过 NLP 模型分析 README 和代码内容,推断用户的技术领域,例如前端开发、后端开发、数据科学等。
- 好友关系网分析:系统通过获取用户的 GitHub 好友列表,并分析这些好友的国籍信息。
- 推断方法:基于好友的地理分布,通过统计分析推断出用户的国籍,进而提高推荐和个性化服务的准确性。
- 活跃度分析:系统会根据用户的 GitHub 活动数据(如 push、commit、issue、pull request 等)统计用户在 GitHub 上的活跃度。
- 综合评价:利用这些活动数据生成用户的活跃度得分和影响力评价,便于后续在 TalentRank 中对用户进行综合打分。
- 仓库评分:针对用户公开的仓库,系统根据其 star 数、fork 数、仓库大小等参数综合计算初步分数。
- 活动评分:对于已登录用户,还会纳入 commit 数、issue 数等活动数据进行加权,综合评估用户的开发能力和活跃程度。
- 排名展示:根据综合评分对用户进行排名展示,提供给第三方应用或平台作推荐使用。
- 国籍置信度:若国籍推断的置信度低于 0.5,则系统会将该用户的国籍设为 N/A,避免误判影响推荐。
- 领域置信度:若技术领域的推断置信度低于 0.6,则该领域信息将被设为 N/A,确保展示的领域信息具备较高的可靠性。