ToB企服应用市场:ToB评测及商务社交产业平台

标题: Go Zero 与复杂.proto文件:构建强大的游戏服务架构 [打印本页]

作者: 盛世宏图    时间: 2024-9-25 19:13
标题: Go Zero 与复杂.proto文件:构建强大的游戏服务架构



一、引言


在游戏开辟中,高效且可扩展的后端服务架构至关紧张。Go Zero 框架凭借其强大的功能,特殊是基于.proto文件的自动代码生成,为我们提供了一种高效的开辟方式。本文将深入探讨一个更复杂的.proto文件示例,并展示如何利用它在 Go Zero 中构建游戏服务架构。

二、.proto文件概述


我们的.proto文件界说了多个服务,涵盖了游戏中的关键功能模块。以下是其主要内容:

1. 用户服务(UserService)




2. 物品服务(ItemService)




3. 任务服务(QuestService)



  1. syntax = "proto3";
  2. package mygame;
  3. // 用户服务
  4. service UserService {
  5.     rpc GetUser(GetUserRequest) returns (GetUserResponse);
  6.     rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
  7. }
  8. // 用户请求和响应消息
  9. message GetUserRequest {
  10.     string user_id = 1;
  11. }
  12. message GetUserResponse {
  13.     string user_id = 1;
  14.     string username = 2;
  15.     string email = 3;
  16. }
  17. message UpdateUserRequest {
  18.     string user_id = 1;
  19.     string username = 2;
  20.     string email = 3;
  21. }
  22. message UpdateUserResponse {
  23.     bool success = 1;
  24. }
  25. // 物品服务
  26. service ItemService {
  27.     rpc GetItem(GetItemRequest) returns (GetItemResponse);
  28.     rpc CreateItem(CreateItemRequest) returns (CreateItemResponse);
  29. }
  30. // 物品请求和响应消息
  31. message GetItemRequest {
  32.     string item_id = 1;
  33. }
  34. message GetItemResponse {
  35.     string item_id = 1;
  36.     string name = 2;
  37.     int32 quantity = 3;
  38. }
  39. message CreateItemRequest {
  40.     string name = 1;
  41.     int32 quantity = 2;
  42. }
  43. message CreateItemResponse {
  44.     string item_id = 1;
  45.     bool success = 2;
  46. }
  47. // 任务服务
  48. service QuestService {
  49.     rpc GetQuest(GetQuestRequest) returns (GetQuestResponse);
  50.     rpc CompleteQuest(CompleteQuestRequest) returns (CompleteQuestResponse);
  51. }
  52. // 任务请求和响应消息
  53. message GetQuestRequest {
  54.     string quest_id = 1;
  55. }
  56. message GetQuestResponse {
  57.     string quest_id = 1;
  58.     string name = 2;
  59.     string description = 3;
  60. }
  61. message CompleteQuestRequest {
  62.     string quest_id = 1;
  63. }
  64. message CompleteQuestResponse {
  65.     bool success = 1;
  66.     string reward = 2;
  67. }
复制代码

三、使用 Go Zero 工具生成代码


1. 安装goctl


可以通过以下下令安装goctl:

  1. go install github.com/zeromicro/go-zero/tools/goctl@latest
复制代码

2. 生成代码


假设上面的.proto文件名为game.proto,位于当前目次下。可以使用以下下令生成服务端代码:

  1. goctl rpc protoc game.proto --go_out=. --go-grpc_out=. --zrpc_out=.
复制代码

这将生成多个文件,主要按照服务进行区分:




  1. // user_service.go
  2. type UserService struct{}
  3. func (s *UserService) GetUser(ctx context.Context, in *GetUserRequest) (*GetUserResponse, error) {
  4.     // 实现获取用户逻辑
  5.     return &GetUserResponse{UserID: in.UserID, Username: "example_username", Email: "example@example.com"}, nil
  6. }
  7. func (s *UserService) UpdateUser(ctx context.Context, in *UpdateUserRequest) (*UpdateUserResponse, error) {
  8.     // 实现更新用户逻辑
  9.     return &UpdateUserResponse{Success: true}, nil
  10. }
复制代码

  1. // item_service.go
  2. type ItemService struct{}
  3. func (s *ItemService) GetItem(ctx context.Context, in *GetItemRequest) (*GetItemResponse, error) {
  4.     // 实现获取物品逻辑
  5.     return &GetItemResponse{ItemID: in.ItemID, Name: "example_item", Quantity: 10}, nil
  6. }
  7. func (s *ItemService) CreateItem(ctx context.Context, in *CreateItemRequest) (*CreateItemResponse, error) {
  8.     // 实现创建物品逻辑
  9.     return &CreateItemResponse{ItemID: "new_item_id", Success: true}, nil
  10. }
复制代码

  1. // quest_service.go
  2. type QuestService struct{}
  3. func (s *QuestService) GetQuest(ctx context.Context, in *GetQuestRequest) (*GetQuestResponse, error) {
  4.     // 实现获取任务逻辑
  5.     return &GetQuestResponse{QuestID: in.QuestID, Name: "example_quest", Description: "example_description"}, nil
  6. }
  7. func (s *QuestService) CompleteQuest(ctx context.Context, in *CompleteQuestRequest) (*CompleteQuestResponse, error) {
  8.     // 实现完成任务逻辑
  9.     return &CompleteQuestResponse{Success: true, Reward: "example_reward"}, nil
  10. }
复制代码



  1. func main() {
  2.     s := engine.NewServer(
  3.         rpc.NewServer(
  4.             mygame.RegisterUserServiceServer(&UserService{}),
  5.             mygame.RegisterItemServiceServer(&ItemService{}),
  6.             mygame.RegisterQuestServiceServer(&QuestService{}),
  7.         ),
  8.     )
  9.     s.Start()
  10. }
复制代码

对于客户端代码,可以使用以下下令:

  1. goctl rpc client game.proto --zrpc
复制代码

这将生成客户端代码,用于调用长途服务。客户端代码也会按照服务进行区分,方便调用差别的服务方法。

四、总结


通过这个复杂的.proto文件示例,我们展示了如安在 Go Zero 中构建一个功能丰富的游戏服务架构。利用.proto文件界说清晰的服务接口,再结合goctl工具自动生成代码,大大提高了开辟效率和代码的可维护性。无论是在游戏开辟还是其他领域的微服务架构中,这种方式都具有很大的代价。

希望这篇博客文章能够帮助你更好地明白和运用 Go Zero 与.proto文件,为你的项目开辟带来更多的便利和强大的功能。

第一个题目,带rpc和不带rpc有什么区别 第二个题目.api文件和.proto文件可以交换吗

一、带 rpc 和不带 rpc 的区别

在 Protobuf 界说中,使用 “rpc” 关键字界说的是长途过程调用(Remote Procedure Call)方法。


二、.api 文件和.proto 文件可以交换吗

.api文件和.proto文件一样平常不能直接交换。


综上所述,带 “rpc” 和不带 “rpc” 在 Protobuf 中有明白的功能区分,而.api文件和.proto文件通常不能交换使用。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4