简介
本专题将带你使用 axum 和 gRPC 构建一个分布式的博客系统数据结构与Protobuf
本章对我们项目的数据结构和proto进行定义实现分类服务
本章我们实现分类服务,即 `category-srv`实现文章服务
本章将带你实现文章的 gPRC 服务。实现前台web服务
本章将通过使用 axum 调用分类和文章的 gRPC 服务,来实现博客前台Web服务实现管理员服务
本章我们将实现管理员服务实现后台管理web服务
本章将使用 axum 调用 gRPC 服务来实现后台管理的 web 服务安全与鉴权
本章将讨论使用jwt进行鉴权服务扩容、注册、发现和编排
本章将讨论服务管理相关的话题配置中心服务
本章讨论配置中心的实现总结
本专题试图通过一个分布式博客的案例来探讨使用 rust 实现 gRPC 微服务架构的可行性
数据结构与Protobuf
本章对我们项目的数据结构和proto进行定义。
proto 定义
分类服务的定义
syntax = "proto3";
package pb;
message Category {
int32 id = 1;
string name = 2;
bool is_del = 3;
}
// --- 创建分类
message CreateCategoryRequest { string name = 1; }
message CreateCategoryReply { int32 id = 1; }
// -- 修改分类
message EditCategoryRequest {
int32 id = 1;
string name = 2;
}
message EditCategoryReply {
int32 id = 1;
bool ok = 2;
}
// -- 分类列表
message ListCategoryRequest {
optional string name = 1; // 根据分类名称查找
optional bool is_del = 2; // 是否删除
}
message ListCategoryReply { repeated Category categories = 1; }
// -- 删除/恢复分类
message ToggleCategoryRequest { int32 id = 1; }
message ToggleCategoryReply {
int32 id = 1;
bool is_del = 2;
}
// -- 分类是否存在
message CategoryExistsRequest {
oneof condition {
string name = 1;
int32 id = 2;
}
}
message CategoryExistsReply { bool exists = 1; }
// -- 分类详情
message GetCategoryRequest {
int32 id = 1;
optional bool is_del = 2;
}
message GetCategoryReply { optional Category category = 1; }
service CategoryService {
// 创建分类
rpc CreateCategory(CreateCategoryRequest) returns (CreateCategoryReply);
// 修改分类
rpc EditCategory(EditCategoryRequest) returns (EditCategoryReply);
// 分类列表
rpc ListCategory(ListCategoryRequest) returns (ListCategoryReply);
// 删除/恢复分类
rpc ToggleCategory(ToggleCategoryRequest) returns (ToggleCategoryReply);
// 分类是否存在
rpc CategoryExists(CategoryExistsRequest) returns (CategoryExistsReply);
// 获取分类详情
rpc GetCategory(GetCategoryRequest) returns (GetCategoryReply);
}
文章服务的定义
syntax = "proto3";
package pb;
import "google/protobuf/timestamp.proto";
message Topic {
int64 id = 1;
string title = 2;
int32 category_id = 3;
string summary = 4;
string content = 5;
int32 hit = 6;
bool is_del = 7;
google.protobuf.Timestamp dateline = 8;
}
message DatelineRange {
google.protobuf.Timestamp start = 1;
google.protobuf.Timestamp end = 2;
}
// -- 创建文章
message CreateTopicRequest {
string title = 1;
int32 category_id = 2;
string content = 3;
optional string summary = 4; // 如果没有提供摘要,则自动从内容中截取
}
message CreateTopicReply { int64 id = 1; }
// -- 修改文章
message EditTopicRequest {
int64 id = 1;
string title = 2;
int32 category_id = 3;
optional string summary = 4; // 如果没有提供摘要,则自动从内容中截取
string content = 5;
}
message EditTopicReply {
int64 id = 1;
bool ok = 2;
}
// -- 文章列表
message ListTopicRequest {
optional int32 page = 1; // 页码
optional int32 category_id = 2; // 分类
optional string keyword = 3; // 关键字
optional bool is_del = 4; // 是否删除
optional DatelineRange dateline_range = 5; // 时间区间
}
message ListTopicReply {
int32 page = 1; // 当前页码
int32 page_size = 2; // 每页条数
int64 page_totoal = 3; // 总页数
int64 record_total = 4; // 总记录数
repeated Topic topics = 5; // 文章列表
}
// -- 删除/恢复文章
message ToggleTopicRequest { int64 id = 1; }
message ToggleTopicReply {
int64 id = 1;
bool is_del = 2;
}
// -- 获取文章详情
message GetTopicRequest {
int64 id = 1;
optional bool is_del = 2;
optional bool inc_hit = 3; // 是否同时增加点击量
}
message GetTopicReply { optional Topic topic = 1; }
service TopicService {
// 创建文章
rpc CreateTopic(CreateTopicRequest) returns (CreateTopicReply);
// 修改文章
rpc EditTopic(EditTopicRequest) returns (EditTopicReply);
// 文章列表
rpc ListTopic(ListTopicRequest) returns (ListTopicReply);
// 删除/恢复文章
rpc ToggleTopic(ToggleTopicRequest) returns (ToggleTopicReply);
// 获取文章详情
rpc GetTopic(GetTopicRequest) returns (GetTopicReply);
}