用 Go 语言实现一个最简单的 gRPC 服务端

在这篇博客中,我讲一下如何用 Go 语言实现一个简单的 gRPC 服务端,包括必要的准备工作和基础操作。我们将使用 Protocol Buffers 定义服务接口,并实现加法和减法功能。

此篇文章服务于前两篇博客:
基于Vue3+Ts+Vite项目中grpc-Web的应用以及其中的坑

vue3+Ts中grpc-web的代码封装思路

1. 前期准备

1.1 安装 Go

确保你的计算机上已经安装 Go 语言环境。可以通过以下命令检查 Go 的安装:

bash 复制代码
go version
1.2 安装 gRPC 和 Protocol Buffers

使用 Go 的包管理工具安装 gRPC 和 Protocol Buffers:

bash 复制代码
go get google.golang.org/grpc
go get google.golang.org/protobuf/cmd/protoc-gen-go
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc

确保将 GOPATH/bin 添加到系统的环境变量中,以便使用 protoc-gen-goprotoc-gen-go-grpc

2. 定义 gRPC 服务

创建一个名为 calculation.proto 的文件,定义我们的 gRPC 服务和消息格式,注释可以见上面提到的第一篇文章:

protobuf 复制代码
syntax = "proto3";

package calculation;

option go_package = "./helloWorld;proto";

service CalculationService {
  rpc Add(AddRequest) returns (AddResponse);
  rpc Subtract(SubtractRequest) returns (SubtractResponse);
}

message AddRequest {
  double num1 = 1;
  double num2 = 2;
}

message AddResponse {
  double result = 1;
}

message SubtractRequest {
  double num1 = 1;
  double num2 = 2;
}

message SubtractResponse {
  double result = 1;
}

3. 生成 Go 代码

在终端中运行以下命令,使用 protoc 生成 Go 代码:

bash 复制代码
protoc --go_out=. --go-grpc_out=. calculation.proto

这将生成与 calculation.proto 文件对应的 Go 文件。

4. 实现 gRPC 服务端

创建一个名为 main.go 的文件,编写服务端代码:

go 复制代码
package main

import (
	"context"
	"fmt"
	proto "go-learn/protobuf/helloWorld" // 导入生成的 proto 包
	"google.golang.org/grpc"
	"net"
	"strconv"
)

type Server struct {
	proto.UnimplementedCalculationServiceServer // 嵌入未实现的结构体
}

// 实现 Add 方法
func (s Server) Add(ctx context.Context, request *proto.AddRequest) (*proto.AddResponse, error) {
	fmt.Printf("Received Add request: %v\n", request)
	return &proto.AddResponse{
		Result: request.Num1 + request.Num2,
	}, nil
}

// 实现 Subtract 方法
func (s Server) Subtract(ctx context.Context, request *proto.SubtractRequest) (*proto.SubtractResponse, error) {
	fmt.Printf("Received Subtract request: %v\n", request)
	return &proto.SubtractResponse{
		Result: request.Num1 - request.Num2,
	}, nil
}

func main() {
	g := grpc.NewServer() // 创建 gRPC 服务器
	proto.RegisterCalculationServiceServer(g, &Server{}) // 注册服务
	lis, err := net.Listen("tcp", "0.0.0.0:8088") // 监听端口
	if err != nil {
		panic("failed to listen:" + err.Error())
	}
	err = g.Serve(lis) // 启动 gRPC 服务器
	if err != nil {
		panic("failed to start grpc:" + err.Error())
	}
}

5. 运行 gRPC 服务端

在终端中,运行以下命令启动服务端:

bash 复制代码
go run main.go

6. 测试 gRPC 服务

可以通过文章一提到的前端接口来测试接口是否成功,也可以使用 gRPC 客户端工具(如 Postman、grpcurl 或自定义客户端)来测试我们的 gRPC 服务。

总结

在这篇博客中,可以了解了如何用 Go 语言实现一个简单的 gRPC 服务端,定义了加法和减法功能,并通过 Protocol Buffers 生成了相应的 Go 代码。这个基础示例可以为进一步扩展和应用 gRPC 提供了良好的基础。

目前go语言在自学中,后面会记录更多go语言相关内容。

相关推荐
Dream_Snowar1 小时前
速通Python 第三节
开发语言·python
超爱吃士力架1 小时前
邀请逻辑
java·linux·后端
高山我梦口香糖2 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
信号处理学渣2 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客2 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
jasmine s2 小时前
Pandas
开发语言·python
biomooc3 小时前
R 语言 | 绘图的文字格式(绘制上标、下标、斜体、文字标注等)
开发语言·r语言
骇客野人3 小时前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
black^sugar3 小时前
纯前端实现更新检测
开发语言·前端·javascript
404NooFound3 小时前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql