Golang学习之路——之tinyrpc源码阅读

迷南。 2023-10-03 23:42 68阅读 0赞

tinyrpc是一个高性能的基于protocol buffer的rpc框架。项目代码非常少,很适合初学者进行golang的学习。

如果你正在为没有资料学习发愁,文末有相关的学习资料获取方式

tinyrpc功能

tinyrpc基于TCP协议,支持各种压缩格式,基于protocol buffer的序列化协议。其rpc是基于golang原生的net/rpc开发而成。

tinyrpc项目结构

tinyrpc基于net/rpc开发而成,在此基础上集成了额外的能力。项目结构如图:

ee9651c9e63f3405a2cdbf72ffd4a232.png

功能目录如下:

  • codec 编码模块
  • compressor 压缩模块
  • header 请求/响应头模块
  • protoc-gen-tinyrpc 代码生成插件
  • serializer 序列化模块

tinyrpc源码解读

客户端和服务端构建

客户端是以net/rpcrpc.Client为基础构建,在此基础上定义了Option以配置压缩方式和序列化方式:

  1. type Option func(o *options)
  2. type options struct {
  3. compressType compressor.CompressType
  4. serializer serializer.Serializer
  5. }

在创建客户端的时候将配置好的压缩算法和序列化方式作为创建客户端的参数:

  1. func NewClient(conn io.ReadWriteCloser, opts ...Option) *Client {
  2. options := options{
  3. compressType: compressor.Raw,
  4. serializer: serializer.Proto,
  5. }
  6. for _, option := range opts {
  7. option(&options)
  8. }
  9. return &Client{rpc.NewClientWithCodec(
  10. codec.NewClientCodec(conn, options.compressType, options.serializer))}
  11. }

服务端是以net/rpcrpc.Server为基础构建,在此基础上扩展了Server的定义:

  1. type Server struct {
  2. *rpc.Server
  3. serializer.Serializer
  4. }

在创建客户端和开启服务时传入序列化方式:

  1. func NewServer(opts ...Option) *Server {
  2. options := options{
  3. serializer: serializer.Proto,
  4. }
  5. for _, option := range opts {
  6. option(&options)
  7. }
  8. return &Server{&rpc.Server{}, options.serializer}
  9. }
  10. func (s *Server) Serve(lis net.Listener) {
  11. log.Printf("tinyrpc started on: %s", lis.Addr().String())
  12. for {
  13. conn, err := lis.Accept()
  14. if err != nil {
  15. continue
  16. }
  17. go s.Server.ServeCodec(codec.NewServerCodec(conn, s.Serializer))
  18. }
  19. }

压缩算法compressor

压缩算法的实现中首先是定义了压缩的接口:

  1. type Compressor interface {
  2. Zip([]byte) ([]byte, error)
  3. Unzip([]byte) ([]byte, error)
  4. }

压缩的接口包含压缩和解压方法。

压缩算法使用的是uint类型,使用iota来初始化,并且使用map来进行所有压缩算法实现的管理:

  1. type CompressType uint16
  2. const (
  3. Raw CompressType = iota
  4. Gzip
  5. Snappy
  6. Zlib
  7. )
  8. // Compressors which supported by rpc
  9. var Compressors = map[CompressType]Compressor{
  10. Raw: RawCompressor{},
  11. Gzip: GzipCompressor{},
  12. Snappy: SnappyCompressor{},
  13. Zlib: ZlibCompr

发表评论

表情:
评论列表 (有 0 条评论,68人围观)

还没有评论,来说两句吧...

相关阅读