十分钟学会Golang开发gRPC服务2

简介: 十分钟学会Golang开发gRPC服务2

5、编写gRPC服务端程序


这里先上代码:

package main
import (
  "context"
  "fmt"
  "grpcdemo/proto"
  "net"
  "google.golang.org/grpc"
)
type server struct {
  proto.UnimplementedHelloServer
}
func (s *server) Say(ctx context.Context, req *proto.SayRequest) (*proto.SayResponse, error) {
  fmt.Println("request:", req.Name)
  return &proto.SayResponse{Message: "Hello " + req.Name}, nil
}
func main() {
  listen, err := net.Listen("tcp", ":8001")
  if err != nil {
    fmt.Printf("failed to listen: %v", err)
    return
  }
  s := grpc.NewServer()
  proto.RegisterHelloServer(s, &server{})
  //reflection.Register(s)
  defer func() {
    s.Stop()
    listen.Close()
  }()
  fmt.Println("Serving 8001...")
  err = s.Serve(listen)
  if err != nil {
    fmt.Printf("failed to serve: %v", err)
    return
  }
}

整个过程如下:先定义一个名为 server 的类型,它去实现hello_grpc.pb.go中生成的HelloServer接口;然后通过grpc.NewServer创建一个gRPC服务器;然后将server类型的实例注册到这个gRPC服务器;最后让这个gRPC服务器在某个本地网络端口监听上开始接受客户端请求。

代码中注释了一行:reflection.Register(s)  它是注册了一个特殊的service,能让外部获得server中已注册的服务和方法。这对于开发时可能比较有用,具体细节可以看这里:github.com/grpc/grpc-g…

如果直接粘贴这段代码的话,会有很多包没有引用进来,可以通过 go get 获取这些包,也可以执行命令:go mod tidy 来引入需要的包。

这里边还import了一个 grpcdemo/proto ,这个是我这边项目的mod是grpcdemo,gRPC代理程序的package是proto,如果你的不一样,需要修改下。


6、编写gRPC客户端程序


访问gRPC服务也是通过hello_grpc.pb.go中生成的方法,直接上代码:

package main
import (
  "bufio"
  "context"
  "fmt"
  "grpchello/proto"
  "os"
  "google.golang.org/grpc"
  "google.golang.org/grpc/credentials/insecure"
)
func main() {
  var serviceHost = "127.0.0.1:8001"
  conn, err := grpc.Dial(serviceHost, grpc.WithTransportCredentials(insecure.NewCredentials()))
  if err != nil {
    fmt.Println(err)
  }
  defer conn.Close()
  client := proto.NewHelloClient(conn)
  rsp, err := client.Say(context.TODO(), &proto.SayRequest{
    Name: "BOSIMA",
  })
  if err != nil {
    fmt.Println(err)
  }
  fmt.Println(rsp)
  fmt.Println("按回车键退出程序...")
  in := bufio.NewReader(os.Stdin)
  _, _, _ = in.ReadLine()
}

上边服务端程序的监听端口指定的 8001,所以这里先创建了一个到 127.0.0.1:8001 的连接;然后使用这个连接创建指定服务的客户端 proto.NewHelloClient(conn) ;然后使用这个客户端调用相应的方法。

hello_grpc.pb.go 已经生成了创建客户端的函数以及调用方法的函数,开发人员直接调用就好了。


7、运行程序


可以使用 go run xxx.go 来编译并运行程序。这里为了方便测试,先使用 go build 将它们编译为exe,然后再双击运行。实际运行效果如下:

1689142273966.png

以上就是本文的主要内容了,protoc-gen-go  和 protoc-gen-go-grpc 这两个插件都是gPRC官方提供的,官方也提供了其它多种语言的代理生成插件,其它框架或者语言开发的gRPC程序,只要符合gRPC规范,就能实现相互之间的互相访问。

完整代码示例已经上传到Github:github.com/bosima/go-d…


相关文章
|
2月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
99 3
Golang语言之gRPC程序设计示例
|
2月前
|
Go API
Golang语言开发注意事项
这篇文章总结了Go语言开发中的注意事项,包括语法细节、注释使用、代码风格、API文档的利用以及如何使用godoc工具来生成文档。
37 2
|
3月前
|
监控 测试技术 API
|
3月前
|
监控 Serverless Go
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
|
3月前
|
Java Serverless Go
Golang 开发函数计算问题之在 Golang 中避免 "concurrent map writes" 异常如何解决
Golang 开发函数计算问题之在 Golang 中避免 "concurrent map writes" 异常如何解决
|
3月前
|
Serverless Go
Golang 开发函数计算问题之defer 中的 recover() 没有捕获到 如何解决
Golang 开发函数计算问题之defer 中的 recover() 没有捕获到 如何解决
|
4月前
|
监控 Go
golang开发 gorilla websocket的使用
【7月更文挑战第11天】在Golang中, 使用Gorilla WebSocket库可轻松实现WebSocket通信。安装库: `go get github.com/gorilla/websocket`。创建连接: `websocket.DefaultDialer.Dial("ws://url", nil)`。发送消息: `conn.WriteMessage(websocket.TextMessage, []byte("Hello"))`。接收消息: 循环调用`conn.ReadMessage()`。适用于实时聊天或股票行情等场景。
106 0
|
5月前
|
Go 开发工具 C语言
从零开始使用golang开发
【6月更文挑战第17天】本文介绍 Go 语言安装与配置等操作。包括.下载与安装从[Go官网](https://golang.org/dl/)下载对应平台的安装包,安装时可自定义路径。安装验证,使用 `go version` 检查版本。环境配置和变量设置,包管理等
55 1
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
106 4
Golang语言之管道channel快速入门篇
|
2月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
64 4
Golang语言文件操作快速入门篇