十分钟学会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…


相关文章
|
9天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
40 0
|
3月前
|
传感器 监控 物联网
golang开源的可嵌入应用程序高性能的MQTT服务
golang开源的可嵌入应用程序高性能的MQTT服务
209 3
|
3月前
|
网络协议 Go 数据安全/隐私保护
golang开源的可嵌入应用程序高性能的MQTT服务
golang开源的可嵌入应用程序高性能的MQTT服务
268 2
|
3天前
|
Go
golang学习2,golang开发配置国内镜像
golang学习2,golang开发配置国内镜像
|
3天前
|
安全 Go
golang开发window环境搭建
golang开发window环境搭建
|
8天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
51 1
|
9天前
|
负载均衡 算法 Go
Golang深入浅出之-Go语言中的服务注册与发现机制
【5月更文挑战第4天】本文探讨了Go语言中服务注册与发现的关键原理和实践,包括服务注册、心跳机制、一致性问题和负载均衡策略。示例代码演示了使用Consul进行服务注册和客户端发现服务的实现。在实际应用中,需要解决心跳失效、注册信息一致性和服务负载均衡等问题,以确保微服务架构的稳定性和效率。
19 3
|
4月前
|
Go
golang安装protoc和gRPC步骤
golang安装protoc和gRPC步骤
62 0
|
4月前
|
XML Go 数据格式
【微信公众号开发】基于golang的公众号开发——接入消息自动回复接口
【微信公众号开发】基于golang的公众号开发——接入消息自动回复接口
157 0
|
7天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
135 1