Go框架工程实践 | 青训营笔记

123 阅读2分钟

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

🧡 本堂课重点内容

  • 实战项目介绍
  • 项目功能介绍
  • 关键代码讲解

🧡 实战项目

项目介绍

💌 笔记项目是一个使用 Hertz、Kitex、Gorm 搭建出来的具备一定业务逻辑的后端 API 项目。主要分为三个服务: image.png 技术栈

image.png

项目源码

项目功能介绍

💌 该项目的三个服务分别包含如下功能:

image.png

💌 基本调用链如下:调用方向 demoapi 发送 HTTP 请求,demouser 和 demonote 在启动时通过服务注册将信息注册到 ETCD 中,二者的用户和笔记数据存储到 MySQL 中,demoapi 通过服务发现获取服务信息,进而调用对应的服务。

image.png

关键代码讲解

IDL
github.com/cloudwego/k…

  • ProtoBuf(大项目中的接口协议)
// user.proto
syntax = "proto3";
package user;
option go_package = "userdemo";

message BaseResp {
    int64 status_code = 1;
    string status_message = 2;
    int64 service_time = 3;
}
// User 结构体
message User {
    int64 user_id = 1;
    string user_name = 2;
    string avatar = 3;
}
// 创建用户请求
message CreateUserRequest {
    string user_name = 1;
    string password = 2;
}
// 创建用户响应
message CreateUserResponse {
    BaseResp base_resp = 1;
}
// 批量获取
message MGetUserRequest {
    repeated int64 user_ids = 1;
}

message MGetUserResponse {
    repeated User users = 1;
    BaseResp base_resp = 2;
}
// 查询用户信息
message CheckUserRequest{
    string user_name = 1;
    string password = 2;
}

message CheckUserResponse{
    int64 user_id = 1;
    BaseResp base_resp = 2;
}
// 用户 RPC 服务
service UserService {
    rpc CreateUser (CreateUserRequest) returns (CreateUserResponse) {}
    rpc MGetUser (MGetUserRequest) returns (MGetUserResponse) {}
    rpc CheckUser (CheckUserRequest) returns (CheckUserResponse) {}
}
  • Thrift
// note.thrift
namespace go demonote

struct BaseResp {
    1: i64 status_code
    2: string status_message
    3: i64 service_time
}
// Note 结构体
struct Note {
    1: i64 note_id
    2: i64 user_id
    3: string username
    4: string user_avatar
    5: string title
    6: string content
    7: i64 create_time
}
// 创建笔记请求
struct CreateNoteRequest {
    1: string title (vt.min_size = "1")
    2: string content (vt.min_size = "1")
    3: i64 user_id (vt.gt = "0")
}
// 创建笔记响应
struct CreateNoteResponse {
    1: BaseResp base_resp
}
// 删除
struct DeleteNoteRequest {
    1: i64 note_id (vt.gt = "0")
    2: i64 user_id
}

struct DeleteNoteResponse {
    1: BaseResp base_resp
}
// 更新
struct UpdateNoteRequest {
    1: i64 note_id (vt.gt = "0")
    2: i64 user_id
    3: optional string title
    4: optional string content
}

struct UpdateNoteResponse {
    1: BaseResp base_resp
}
// 查询
struct QueryNoteRequest {
    1: i64 user_id (vt.gt = "0")
    2: optional string search_key
    3: i64 offset (vt.ge = "0")
    4: i64 limit (vt.ge = "0")
}

struct QueryNoteResponse {
    1: list<Note> notes
    2: i64 total
    3: BaseResp base_resp
}
// 批量获取
struct MGetNoteRequest {
    1: list<i64> note_ids (vt.min_size = "1")
}

struct MGetNoteResponse {
    1: list<Note> notes
    2: BaseResp base_resp
}
// 笔记 RPC 服务
service NoteService {
    CreateNoteResponse CreateNote(1: CreateNoteRequest req)
    DeleteNoteResponse DeleteNote(1: DeleteNoteRequest req)
    UpdateNoteResponse UpdateNote(1: UpdateNoteRequest req)
    QueryNoteResponse QueryNote(1: QueryNoteRequest req)
    MGetNoteResponse MGetNote(1: MGetNoteRequest req)
}

Hertz
github.com/cloudwego/k…
Kitex Client
github.com/cloudwego/k…
Kitex Server
github.com/cloudwego/k…
Gorm github.com/cloudwego/k…

课后总结

💌 本节课通过一个笔记项目了解 Gorm/Kitex/Hertz 是什么,熟悉 Gorm/Kitex/Hertz 的基础用法,通过实战案例分析将三个框架的使用串联了起来。