Golang-gRPC

文章目录[x]
  1. 1:gRPC
  2. 1.1:rpc客户端和服务端代码实现
  3. 1.2:gRPC实现

gRPC

rpc客户端和服务端代码实现

服务端代码

package main

import (
  "fmt"
  "net"
  "net/rpc"
)

type Te struct {
}

func (*Te) Test(key string, res *string) error {
  *res = key + "hello"
  return nil
}

func main() {
  //绑定对象方法
  err := rpc.RegisterName("test", new(Te))
  if err != nil {
    fmt.Println("注册rpc失败", err)
    return
  }
  //设置监听
  listener, err := net.Listen("tcp", "127.0.0.1:8080")
  if err != nil {
    fmt.Println("listen创建失败", err)
    return
  }
  defer listener.Close()
  fmt.Println("开始监听")
  //建立连接
  con, err := listener.Accept()
  if err != nil {
    fmt.Println("Accept 建立失败", err)
    return
  }
  fmt.Println("连接成功")
  defer con.Close()
  rpc.ServeConn(con)
}

客户端代码实现

package main

import (
  "fmt"
  "net/rpc"
)

func main() {
  //连接服务器
  con, err := rpc.Dial("tcp", "127.0.0.1:8080")
  if err != nil {
    fmt.Println("连接服务器失败", err)
    return
  }
  defer con.Close()
  var ans string
  err = con.Call("test.Test", "charmber", &ans)
  if err != nil {
    fmt.Println("函数调用失败", err)
    return
  }
  fmt.Println(ans)

}

gRPC实现

  • 新建Product.protoc

    syntax="proto3";
    option go_package="../server";
    
    package server;
    
    
    message ProductRequest{
      int32 prod_id=1;
    }
    
    message ProductResponse{
      int32 prod_stock=1;
    }
    
    service ProductServer{
      rpc GetProductStock(ProductRequest) returns(ProductResponse);
    }
    
    

执行命令:protoc --go_out=plugins=grpc:../server Product.proto

会在server目录下生成一个pb.go结尾文件

创建服务端:

1.继承实现请求接口GetProductStock

package server

import "context"

type ProductServer struct {
}

func (pd *ProductServer) GetProductStock(ctx context.Context, request *ProductRequest) (*ProductResponse, error) {
  return &ProductResponse{ProdStock: request.ProdId + 1}, nil
}

2.创建服务端代码

package main

import (
  "fmt"
  "google.golang.org/grpc"
  "grpc/server"
  "net"
)

func main() {
//创建grpc服务
  rpcServer := grpc.NewServer()
  注册grpc服务
  server.RegisterProductServerServer(rpcServer, new(server.ProductServer))
//监听服务端口
  listener, err := net.Listen("tcp", ":8080")
  if err != nil {
    fmt.Println("监听失败", err)
    return
  } else {
    fmt.Println("success!")
  }
  _ = rpcServer.Serve(listener)
}

3.创建grpc客户端

package main

import (
  "context"
  "fmt"
  "google.golang.org/grpc"
  "grpc/server"
)

func main() {
//新建连接
  conn, err := grpc.Dial(":8080", grpc.WithInsecure())
  if err != nil {
    fmt.Println("err:", err)
  }
  //延迟关闭连接
  defer conn.Close()
  //调用方法
  productServer := server.NewProductServerClient(conn)
  resp, err := productServer.GetProductStock(context.Background(), &server.ProductRequest{ProdId: 32})
  if err != nil {
    fmt.Println("调用失败", err)
    return
  }
  fmt.Println("ProductStock", resp.ProdStock)

}
点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像