Skip to content

GitEval/GitEval-Backend

Repository files navigation

GitEval-Backend

GitEval-Backend 是一个后端服务项目,旨在通过分析用户的 GitHub 数据和行为,评估其技术领域、国籍、活动情况,并对用户进行评分。该项目采用 MVC 架构,通过多层设计实现了高可维护性和可扩展性。

项目结构

项目遵循 MVC 设计模式,分为 apiclientconfcontrollerdocsmiddlewaremodelpkgservice 等层,达到代码的高解耦性和模块化。

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 |
      +------------+-------+

  • 核心技术实现

    1. JWT 用户身份验证

    • 生成令牌:在用户成功登录后,系统会生成一个 JWT 令牌用于标识用户身份。
    • 安全验证:每次请求时,服务器会验证 JWT 的合法性,确保只有持有有效令牌的用户才能访问受限资源。
    • 黑名单机制:当用户登出时,其 JWT 会被存储在 Redis 的黑名单中,确保该令牌即使在有效期内也无法继续使用,从而提升安全性。

    2. GitHub 客户端池管理

    • 用户长连接管理:每个登录的用户在系统中会建立一个 GitHub 客户端连接,用于拉取用户 GitHub 数据,如仓库信息和活动记录。
    • 高效存储:利用 sync.Map 维护用户的长连接客户端,确保高效的连接管理。
    • 定时清理:系统会定时清理长时间未使用的客户端连接,防止资源浪费并提高系统的可扩展性。

    3. gRPC 通信

    • 高效传输:gRPC(Google Remote Procedure Call)用于在系统与 LLM(大语言模型)服务之间建立高效的通信机制。它基于 HTTP/2 传输协议,相比传统 REST 提供更低的延迟和更好的性能。
    • 安全性:gRPC 本身支持多种认证机制,使得服务间通信更加安全可靠。
    • 可扩展性:基于 protobuf(协议缓冲区)定义接口,易于扩展和维护,特别适用于微服务架构。

    4. Wire 依赖注入管理

    • 自动化依赖注入:使用 Google 的 Wire 工具自动生成依赖注入代码,简化了各个模块之间的依赖管理。
    • 提升模块解耦性:通过依赖注入,实现各模块之间的松耦合,避免模块之间的硬编码依赖,提高代码的可维护性和可测试性。
    • 简化开发:开发人员只需定义依赖关系,Wire 会自动生成相应的依赖注入代码,降低开发复杂度。

    5. 数据库与缓存管理

    • MySQL:用于存储核心用户数据、仓库信息等持久化数据。表结构设计上,充分考虑了数据的规范化和查询性能的优化,确保数据的完整性和高效查询。
    • Redis:用作缓存和黑名单存储。用户的 JWT 黑名单、GitHub 用户连接池的缓存等都存储在 Redis 中。

    主要服务逻辑

    1. 用户登录与注册

    • GitHub 授权登录:用户首先通过 login 接口获取 GitHub 授权链接,授权成功后回调到系统的 callback 接口。系统会获取 GitHub 返回的授权 code,以此获取用户的基本信息和 GitHub 访问权限。
    • 用户数据初始化:在用户初次登录时,系统会初始化其基本信息,包括用户名、头像等,同时启动异步任务获取用户的社交关系网并预测其国籍和技术领域。

    2. 领域推断

    • 数据收集:系统通过 GitHub API 获取用户各个仓库的 README 内容、主要编程语言等数据。
    • LLM 推断:将仓库信息传递给 LLM 服务,通过 NLP 模型分析 README 和代码内容,推断用户的技术领域,例如前端开发、后端开发、数据科学等。

    3. 国籍推断

    • 好友关系网分析:系统通过获取用户的 GitHub 好友列表,并分析这些好友的国籍信息。
    • 推断方法:基于好友的地理分布,通过统计分析推断出用户的国籍,进而提高推荐和个性化服务的准确性。

    4. 用户评价

    • 活跃度分析:系统会根据用户的 GitHub 活动数据(如 push、commit、issue、pull request 等)统计用户在 GitHub 上的活跃度。
    • 综合评价:利用这些活动数据生成用户的活跃度得分和影响力评价,便于后续在 TalentRank 中对用户进行综合打分。

    5. TalentRank 排名评分

    • 仓库评分:针对用户公开的仓库,系统根据其 star 数、fork 数、仓库大小等参数综合计算初步分数。
    • 活动评分:对于已登录用户,还会纳入 commit 数、issue 数等活动数据进行加权,综合评估用户的开发能力和活跃程度。
    • 排名展示:根据综合评分对用户进行排名展示,提供给第三方应用或平台作推荐使用。

    6. 置信度处理

    • 国籍置信度:若国籍推断的置信度低于 0.5,则系统会将该用户的国籍设为 N/A,避免误判影响推荐。
    • 领域置信度:若技术领域的推断置信度低于 0.6,则该领域信息将被设为 N/A,确保展示的领域信息具备较高的可靠性。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors