GO:Hello gRPC

实现一个 "Hello gRPC" 项目 in Go

在这篇文章中,我们将一步步通过如何在 Go 语言中实现一个简单的 gRPC 服务。 我们将构建一个 "Hello World" 示例,涵盖环境准备、定义服务接口、生成 gRPC 代码、实现服务、编写客户端调用服务以及运行和测试。

环境准备

  1. 确保你已经安装了 Go (版本 1.13 或更高,最好是1.18以上。写文章时候我的环境是1.22.1)。
  2. 安装 Protocol Buffers 编译器 protoc
  3. 安装 gRPC-Go 插件。
bash 复制代码
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

确保 $GOPATH/bin 在你的 PATH 环境变量中。

新建项目目录

创建一个新目录作为项目的根目录,例如 hello-grpc,并在其中创建一个 go.mod 文件来初始化 Go 模块:

bash 复制代码
mkdir hello-grpc
cd hello-grpc
mkdir helloworld
go mod init hello-grpc

定义服务接口

在helloworld这个目录中,创建一个名为 helloworld.proto 的文件,定义你的服务接口:

protobuf 复制代码
syntax = "proto3";

package helloworld;

option go_package = "hello-grpc/helloworld";

// 定义 Greeter 服务
service Greeter {
  // 定义一个 SayHello 方法
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// HelloRequest 消息定义
message HelloRequest {
  string name = 1;
}

// HelloReply 消息定义
message HelloReply {
  string message = 1;
}

生成 gRPC 代码

在项目根目录下,运行以下命令来生成 Go 代码:

bash 复制代码
protoc --go_out=. --go-grpc_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative helloworld/helloworld.proto

这将在项目中生成 helloworld.pb.gohelloworld_grpc.pb.go 文件。

实现服务

在项目根目录下创建一个 server 目录,并在其中创建 server.go

go 复制代码
package main

import (
	"context"
	"log"
	"net"

	pb "hello-grpc/helloworld"

	"google.golang.org/grpc"
)

const (
	port = ":50051"
)

// server 用于实现 helloworld.GreeterServer。
type server struct {
	pb.UnimplementedGreeterServer
}

// SayHello 实现了 helloworld.GreeterServer 接口。
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	log.Printf("Received: %v", in.GetName())
	return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func main() {
	lis, err := net.Listen("tcp", port)
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	pb.RegisterGreeterServer(s, &server{})
	log.Printf("server listening at %v", lis.Addr())
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

编写客户端调用服务

在项目根目录下创建一个 client 目录,并在其中创建 client.go

go 复制代码
package main

import (
	"context"
	"log"
	"os"
	"time"

	pb "hello-grpc/helloworld"

	"google.golang.org/grpc"
)

const (
	address     = "localhost:50051"
	defaultName = "world"
)

func main() {
	// 建立与服务器的连接。
	conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	c := pb.NewGreeterClient(conn)

	// 调用 SayHello 方法。
	name := defaultName
	if len(os.Args) > 1 {
		name = os.Args[1]
	}
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
	if err != nil {
		log.Fatalf("could not greet: %v", err)
	}
	log.Printf("Greeting: %s", r.GetMessage())
}

运行和测试

首先,运行服务器:

bash 复制代码
go run server/server.go

然后,在另一个终端窗口,运行客户端:

bash 复制代码
go run client/client.go

你应该会在客户端看到服务器的问候。

相关推荐
GM_8286 小时前
从0开始在Go当中使用Apache Thrift框架(万字讲解+图文教程+详细代码)
rpc·go·apache·thrift
Kratos开源社区12 小时前
别卷 LangChain 了!Blades AI 框架让 Go 开发者轻松打造智能体
go·agent·ai编程
Kratos开源社区12 小时前
跟 Blades 学 Agent 设计 - 01 用“提示词链”让你的 AI 助手变身超级特工
llm·go·agent
百锦再18 小时前
第10章 错误处理
java·git·ai·rust·go·错误·pathon
Mgx2 天前
从 4.8 秒到 0.25 秒:我是如何把 Go 正则匹配提速 19 倍的?
go
遥天棋子3 天前
实战PaddleOCR自动识别车位坐标并渲染可点击按钮
go
久违 °3 天前
【安全开发】Nuclei源码分析-任务执行流程(三)
安全·网络安全·go
喵个咪3 天前
开箱即用的GO后台管理系统 Kratos Admin - 数据脱敏和隐私保护
后端·go·protobuf
shining3 天前
[Golang] 万字长文,一文入门go语言!
go
百锦再3 天前
第8章 模块系统
android·java·开发语言·python·ai·rust·go