go实现grpc通信

简介: go实现grpc通信

准备环境

go get google.golang.org/grpc
go get google.golang.org/protobuf

代码实现

新增 chat/chat.proto 文件:

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

protoc --go_out=plugins=grpc:chat ./chat/chat.proto

image.png

编写chat 服务文件 chat.go:

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服务端:


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 客户端调用

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)
   }
}

启动


image.png

目录
相关文章
|
4月前
|
安全 Go 数据处理
Go语言CSP编程实战:通道通信技术
Go语言CSP编程实战:通道通信技术
73 0
|
4月前
|
安全 Go
Go新手步步为赢:并发编程通信指南
Go新手步步为赢:并发编程通信指南
41 0
|
4月前
|
网络协议 Java Go
【Go语言专栏】Go语言中的WebSocket实时通信应用
【4月更文挑战第30天】Go语言(Golang)是Google开发的编程语言,适用于云计算、微服务等领域。本文介绍了WebSocket,一种实现浏览器与服务器全双工通信的协议,其特点是实时性、全双工和轻量级。在Go中实现WebSocket,可以使用gorilla/websocket库。示例展示了如何创建服务器端和客户端,实现消息的收发。WebSocket广泛应用于聊天、游戏、通知推送和实时数据同步等场景。学习Go语言中的WebSocket对于开发实时通信应用至关重要。
153 0
|
1月前
|
网络协议 Go
|
4月前
|
自然语言处理 Java 编译器
【Go语言专栏】Go语言中的gRPC框架应用
【4月更文挑战第30天】Go语言的gRPC是一个高性能RPC框架,基于HTTP/2和Protocol Buffers,支持多语言。其特点包括高性能、强类型和双向流。在Go中使用gRPC,需定义接口(如hello.proto),生成Go代码,实现服务器端(注册服务到gRPC服务器)和客户端(调用服务)。此外,gRPC还提供流、错误处理和拦截器等高级特性,适用于复杂通信场景。
56 1
|
4月前
|
安全 Java Go
【Go语言专栏】Go语言中的加密与安全通信
【4月更文挑战第30天】本文介绍了Go语言中的加密与安全通信。通过使用golang.org/x/crypto/ssh/terminal库实现终端加密,以及golang.org/x/net/websocket库实现WebSocket安全通信。文章展示了安装库的命令、加密操作及WebSocket通信的示例代码。此外,还列举了安全通信在数据传输加密、用户认证、密码保护和文件加密等场景的应用。掌握这些知识对开发安全的Web应用至关重要。
53 0
|
4月前
|
缓存 监控 前端开发
【Go 语言专栏】Go 语言中的 WebSocket 实时通信应用
【4月更文挑战第30天】本文探讨了Go语言在WebSocket实时通信中的应用。WebSocket作为全双工通信协议,允许持续的双向通信。Go语言凭借其高效和并发特性,适合构建实时应用。文中概述了在Go中实现WebSocket的基本步骤,包括服务器和客户端的建立与通信,并列举了实时聊天、数据监控和在线协作等应用案例。同时,强调了消息格式、并发处理、错误处理和安全性的注意事项。通过数据压缩、缓存管理和连接管理等策略可优化性能。Go语言还能与数据库和前端框架结合,提升用户体验。总之,Go语言为WebSocket实时通信提供了强大支持,有望在更多领域发挥作用。
95 0
|
11月前
|
搜索推荐 Go 微服务
Go 语言怎么一键生成一个 gRPC 服务?
Go 语言怎么一键生成一个 gRPC 服务?
48 0
|
11月前
|
Go 微服务
Go 微服务工具包 Go kit 怎么集成 gRPC?
Go 微服务工具包 Go kit 怎么集成 gRPC?
75 0
|
4月前
|
Java Go API
玩转gRPC—Go使用gRPC通信实战
玩转gRPC—Go使用gRPC通信实战
67 1