go-zero(七) RPC服务和ETCD使用

[复制链接]
发表于 2025-12-22 08:03:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
go zero RPC和ETCD

在现实的开发中,微服务通常是分布式的,每个服务运行在独立的历程中,乃至大概在差别的服务器上。RPC答应这些服务以透明的方式相互调用方法,就像在当地调用一样,从而简化了服务间的通讯。
RPC使调用者不须要关注服务的实现细节,只需知道接口,更方便协作编程 ,多数RPC框架可以大概根据服务界说主动天生客户端代码,淘汰了人为错误并加速了开发过程。
RPC可以比传统的HTTP/REST更快地举行数据互换,这在须要高性能和低耽误的微服务体系中尤为告急
一、API和RPC

1.API 和 RPC 的关系

API和RPC是两种差别的服务交互模式,分别用于处理处罚HTTP哀求和服务间的远程调用。
      
  • API(应用步伐编程接口):
         
    • API通常用于袒露微服务的HTTP接口,答应客户端(如前端应用)通过HTTP哀求与微服务举行交互。   
    • API重要处理处罚用户哀求,举行输入验证、路由、HTTP状态码处理处罚等。   
       
  • RPC(远程过程调用):
         
    • RPC用于微服务之间的直接调用,通常通过协议(如gRPC)举行通讯。   
    • RPC更得当于内部服务之间的高效交互,特殊是在须要低耽误和高吞吐量的场景中。   
      
2.API 文件与 Proto 文件的约定

在项目开发中,API界说和RPC界说应保持肯定的约定,以确保服务的同等性和可维护性:
      
  • 接口界说同等性:
         
    • API层和RPC层应只管保持同等的接口,比如在API层界说的哀求和相应布局体,RPC层也应使用类似或相似的布局体。这有助于低落服务侵入和明白本钱。   
       
  • 数据布局的映射:
         
    • 当API哀求到达时,通常须要将HTTP哀求参数映射到RPC调用的参数。此时,可以界说一个公共的哀求和相应数据布局,以淘汰重复界说和维护本钱。   
       
  • 错误处理处罚同等性:
         
    • 在API和RPC之间应保持类似的错误处理处罚逻辑,以便在发生错误时可以大概提供同等的错误相应。   
      
3.示例约定


      
  • **API 文件(.api)**示例:
    1. # 文件: user.api
    2. service user-api {
    3.      
    4.      
    5.     @server(
    6.         rest: {
    7.      
    8.      
    9.             path: /users,
    10.             method: POST
    11.         }
    12.     )
    13.     register(req RegisterRequest) returns (RegisterResponse);
    14.     @server(
    15.         rest: {
    16.      
    17.      
    18.             path: /users/{
    19.      
    20.      id},
    21.             method: GET
    22.         }
    23.     )
    24.     getUser(id int64) returns (GetUserResponse);
    25. }
    26. message RegisterRequest {
    27.      
    28.      
    29.     string name = 1;
    30.     int32 age = 2;
    31. }
    32. message RegisterResponse {
    33.      
    34.      
    35.     int64 id = 1;
    36. }
    37. message GetUserResponse {
    38.      
    39.      
    40.     string name = 1;
    41.     int32 age = 2;
    42. }
    复制代码

  1. **Proto 文件(.proto)**示例:
  2.   ```protobuf
  3.   syntax = "proto3";
  4.   package user;
  5.   service UserService {
  6.    
  7.    
  8.       rpc Register(RegisterRequest) returns (RegisterResponse);
  9.       rpc GetUser(GetUserRequest) returns (GetUserResponse);
  10.   }
  11.   message RegisterRequest {
  12.    
  13.    
  14.       string name = 1;
  15.       int32 age = 2;
  16.   }
  17.   message RegisterResponse {
  18.    
  19.    
  20.       int64 id = 1;
  21.   }
  22.   message GetUserRequest {
  23.    
  24.    
  25.       int64 id = 1;  // 请求者根据ID获取用户信息
  26.   }
  27.   message GetUserResponse {
  28.    
  29.    
  30.       string name = 1;
  31.       int32 age = 2;
  32.   }
复制代码
下面我将通过一个简朴的示例,分析怎样使用go zero框架和 Protocol Buffers 界说 RPC 服务。
二、天生 RPC代码

在这个教程中,我们根据user.api文件,来编写一个user.proto 文件,创建一个用户管理的 RPC 服务.
1.回顾user.api

go zero的 API 文件通常界说 HTTP 接口,包罗哀求和相应的格式。它重要用于 RESTful API 的界说。
我们先来回顾下之前的user.api文件
  1. type (
  2.         RegisterRequest {
  3.    
  4.    
  5.                 Username string `json:"username" validate:"required"` // 注册请求,用户名
  6.                 Password string `json:"password" validate:"required"` // 注册请求,密码
  7.         }
  8.         RegisterResponse {
  9.    
  10.    
  11.                 Message string `json:"message"` // 响应消息
  12.         }
  13. )
  14. type (
  15.         LoginRequest {
  16.    
  17.    
  18.                 Username string `json:"username" validate:"required"` // 登录请求,用户名
  19.                 Password string `json:"password" validate:"required"` // 登录请求,密码
  20.         }
  21.         LoginResponse {
  22.    
  23.    
  24.                 Token string `json:"token"` // 登录响应,JWT token
  25.         }
  26. )
  27. @server (
  28.         group:  user // 代表当前 service 代码块下的路由生成代码时都会被放到 user 目录下
  29.         prefix: /v1 //定义路由前缀为 "/v1"
  30. )
  31. // 微服务名称为 user-ap,生成的代码目录和配置文件将和 user 值相关
  32. service user-api {
  33.    
  34.    
  35.         //用户注册
  36.         @handler RegisterHandler
  37.         //提交post请求   RegisterRequest为请求体  RegisterResponse为响应体
  38.         post /register (RegisterRequest) returns (RegisterResponse)
  39.         //用户登录
  40.         @handler LoginHandler
  41.         post /login (LoginRequest) returns (LoginResponse)
  42. }
  43. //因为我们想要通过jwt来传递数据,所以我们不需求请求信息
  44. type (
  45.         GetInfoResponse {
  46.    
  47.    
  48.                 Username string `json:"username" `
  49.                 Password string `json:"password" `
  50.         }
  51. )
  52. //更新数据我们就简单修改下密码
  53. type (
  54.         UpdataRequest {
  55.    
  56.    
  57.                 Password string `json:"password" ` // 更新请求,新的密码
  58.         }
  59.         UpdataResponse {
  60.    
  61.    
  62.                 Message string `json:"message"` // 更新响应消息
  63.         }
  64. )
  65. @server (
  66.         group:  user
  67.         prefix: /v1
  68.         jwt:    Auth //开启jwt
  69. )
  70. service user-api {
  71.    
  72.    
  73.         @handler GetInfoHandler
  74.         // 不需要请求信息
  75.         post /getinfo returns (GetInfoResponse)
  76.         @handler UpdataHandler
  77.         post /updata (UpdataRequest) returns (UpdataResponse)
  78. }
复制代码
2. 创建user.proto 文件

Proto 文件,用于界说 gRPC 服务和消息格式。它重要用于远程过程调用(RPC),使用 Protocol Buffers 举行数据序列化。
根据user.api文件创建user.proto文件:
  1. syntax = "proto3";  //声明使用 Protocol Buffers 的版本为 3
  2. //proto 包名
  3. package pb;
  4. //生成 golang 代码后的包名
  5. option go_package ="./pb";  //必须要有“./” 这样的路径
  6. //指定生成的 Go 代码的包名为 pb,在同一目录下创建一个名为 pb 的包
  7. //定义用户消息结构
  8. message Users {
  9.    
  10.    
  11.   int64
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表