前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go实现grpc通信

go实现grpc通信

作者头像
仙士可
发布2022-04-25 09:28:08
5590
发布2022-04-25 09:28:08
举报
文章被收录于专栏:仙士可博客仙士可博客

准备环境

代码语言:javascript
复制
go get google.golang.org/grpc
go get google.golang.org/protobuf

代码实现

新增 chat/chat.proto 文件:

代码语言:javascript
复制
syntax = "proto3";

package template;
option go_package = "../chat";
message Message{
  string body = 1;
}

service ChatService{
  rpc SayHello(Message) returns (Message){}
  rpc BroadcastMessage2(Message) returns (Message) {}
}

命令生成pb.go

代码语言:javascript
复制
protoc --go_out=plugins=grpc:chat ./chat/chat.proto
仙士可博客
仙士可博客

编写chat 服务文件 chat.go:

代码语言:javascript
复制
package chat

import (
   "context"
   "log"
)

type Server struct {
}

func (receiver *Server) SayHello(ctx context.Context, in *Message) (*Message, error) {
   log.Printf("Receive message body from client: %s", in.Body)
   return &Message{Body: "Hello From the Server!"}, nil
}

func (receiver *Server) Test(ctx context.Context, in *Message) (*Message, error) {
   log.Printf("test new message from a client: %s", in.Body)
   return &Message{Body: "test message!"}, nil
}

编写grpc-server服务端:

代码语言:javascript
复制
package main

import (
   "fmt"
   "google.golang.org/grpc"
   "grpc-study/chat"
   "log"
   "net"
)

func main() {
   fmt.Println("Go gRPC Beginners Tutorial!")

   listen, err := net.Listen("tcp", ":9000")
   if err != nil {
      log.Fatalf("failed to listen: %v", err)
   }

   grpcServer := grpc.NewServer()
   s := chat.Server{}

   chat.RegisterChatServiceServer(grpcServer, &s)

   if err := grpcServer.Serve(listen); err != nil {
      log.Fatalf("failed to serve: %s", err)
   }
}

grpc-client 客户端调用

代码语言:javascript
复制
package main

import (
   "context"
   "google.golang.org/grpc"
   "grpc-study/chat"
   "log"
   "time"
)

func main() {
   var conn *grpc.ClientConn
   conn, err := grpc.Dial(":9000", grpc.WithInsecure())
   if err != nil {
      log.Fatalf("did not connect: %s \n", err)
   }
   defer conn.Close()

   c := chat.NewChatServiceClient(conn)
   for true {
      response, err := c.SayHello(context.Background(), &chat.Message{Body: "66666"})
      if err != nil {
         log.Fatalf("Error when calling SayHello: %s", err)
      }
      log.Printf("Response from server: %s", response.Body)
      broadcastMessage, err := c.Test(context.Background(), &chat.Message{Body: "123"})
      if err != nil {
         log.Fatalf("Error when calling Broadcast Message: %s", err)
      }
      log.Printf("Response from server: %s", broadcastMessage.Body)

      time.Sleep(1*time.Second)
   }
}

启动

仙士可博客
仙士可博客

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备环境
  • 代码实现
    • 新增 chat/chat.proto 文件:
      • 命令生成pb.go
    • 编写chat 服务文件 chat.go:
      • 编写grpc-server服务端:
        • grpc-client 客户端调用
        • 启动
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档