[go]简单的RPC框架

将信息使用gob压缩,通过TCP进行传输实现远程服务调用。
原教程

主要分为以下几步

  1. 约定数据包传输格式
  2. 约定数据的加密和解密
  3. 服务端对请求的回复的封装
  4. 客户端对函数注册的封装
    项目结构
├── client.go
├── cmd
│   ├── client
│   │   └── main.go
│   ├── server
│   │   └── main.go
│   └── struct
│       └── user.go
├── encode.go
├── message.go
└── server.go

约定数据包传输格式

// message.go

//网络传输数据格式
//两端要约定好数据包的格式
//4字节header uint32

type Session struct {
   
   conn net.Conn
}

func NewSession(conn net.Conn) *Session {
   
   return &Session{
   conn: conn}
}

//对数据封包
func (s *Session) Write(data []byte) error {
   
   buf := make([]byte, 4+len(data))
   //写入头部,记录数据长度
   binary.BigEndian.PutUint32(buf[:4], uint32(len(data)))
   copy(buf[4:], data)
   _, err := s.conn.Write(buf)
   if err != nil {
   
      return err
   }
   return nil
}

//对数据拆包
func (s *Session) Read() ([]byte, error) {
   
   header := make([]byte, 4)
   //读头
   _, err := io.ReadFull(s.conn, header)
   if err != nil {
   
      return nil, err
   }
   //读数据
   dataLen := binary.BigEndian.Uint32(header)
   data := make([]byte, dataLen)
   if _, err := io.ReadFull(s.conn, data); err != nil {
   
      return nil, err
   }
   return data, nil
}

约定数据的加密和解密

使用gob进行压缩,适用于go程序的交互

// encode.go

// RPCData 定义RPC交互的数据结构
type RPCData struct {
   
   // 访问的函数
   Name string
   // 访问时的参数
   Args []interface{
   }
}

func NewRPCData(name string, args []interface{
   }) *RPCData {
   
   return &RPCData{
   
      Name: name,
      Args: args,
   }
}

//数据的压缩
func (data *RPCData) Encode() ([]byte, error) {
   
   var buf bytes.Buffer
   bufEnc 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值