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

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

相关推荐
程序员爱钓鱼15 小时前
GoHTML解析利器:github.com/PuerkitoBio/goquery实战指南
后端·google·go
我叫黑大帅16 小时前
Go中的interface的两大用法
后端·面试·go
用户9003486133461 天前
GO语言基础:Context 上下文的概念、取消信号、截止时间、值传递
go
程序员爱钓鱼1 天前
Go语言WebP图像处理实战:golang.org/x/image/webp
后端·google·go
PFinal社区_南丞1 天前
Go语言开发AI智能体:从Function Calling到Agent框架
后端·go
golang学习记2 天前
Fiber v3 适配器模式:17 种写法随便用,老代码"即插即用"🔌
后端·go
用户9003486133462 天前
GO语言基础:变量
go
用户9003486133462 天前
GO语言基础:接口和结构体
go
Nyarlathotep01132 天前
gin03:请求中的参数
后端·go