用 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语言相关内容。

相关推荐
lly2024064 分钟前
抽象工厂模式
开发语言
一只小松许️7 分钟前
Rust切片、结构体、枚举
开发语言·rust
SFLYQ24 分钟前
Go AICode 工具调研
后端
这里有鱼汤34 分钟前
Python模块化开发,从此告别乱糟糟的代码!
前端·后端·python
这里有鱼汤36 分钟前
高手也容易忽略的 Python 命名空间与作用域
前端·后端·python
捡田螺的小男孩37 分钟前
新来的技术总监,把DDD落地的那叫一个高级优雅!
java·后端
陳長生.44 分钟前
JAVA EE_多线程-初阶(二)
java·开发语言·jvm·java-ee
QTX187301 小时前
常见的 JavaScript 框架和库
开发语言·javascript·ecmascript
xiezhr1 小时前
程序员为什么总是加班?
前端·后端·程序员
猿java1 小时前
银行系统需要服务降级吗?
java·后端·面试