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

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

相关推荐
人间打气筒(Ada)11 小时前
「码动四季·开源同行」golang:负载均衡如何提高系统可用性?
算法·golang·开源·go·负载均衡·负载均衡算法
牛奔1 天前
Go + Vue 接入行为验证码完整指南
go
人间打气筒(Ada)1 天前
go:如何实现接口限流和降级?
开发语言·中间件·go·限流·etcd·配置中心·降级
我叫黑大帅2 天前
Go 中最强大的权限控制库(Casbin)
后端·面试·go
古城小栈2 天前
Jenkins+K8s实现Go后端服务自动化部署
go·k8s·jenkins
不会写DN3 天前
Gin 实战入门:从环境搭建到企业级常用特性全解析
go·gin
下次一定x3 天前
深度解析 Kratos 客户端服务发现与负载均衡:从 Dial 入口到 gRPC 全链路落地(下篇)
后端·go
乐茵lin3 天前
大厂都在问:如何解决map的并发安全问题?三种方法让你对答如流
开发语言·go·编程·map·并发安全·底层源码·sync.map
不会写DN4 天前
GORM 实战入门:从环境搭建到企业级常用特性全解析
sql·mysql·go·gin
F1FJJ4 天前
Shield CLI 的 PostgreSQL 插件 v0.5.0 发布:数据库导出 + 协作增强,ER 图全新体验
网络·数据库·docker·postgresql·go