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

相关推荐
q***697712 分钟前
Spring Boot与MyBatis
spring boot·后端·mybatis
coderxiaohan24 分钟前
【C++】多态
开发语言·c++
gfdhy34 分钟前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希
Eiceblue1 小时前
通过 C# 将 HTML 转换为 RTF 富文本格式
开发语言·c#·html
故渊ZY1 小时前
Java 代理模式:从原理到实战的全方位解析
java·开发语言·架构
leon_zeng01 小时前
Qt Modern OpenGL 入门:从零开始绘制彩色图形
开发语言·qt·opengl
会飞的胖达喵1 小时前
Qt CMake 项目构建配置详解
开发语言·qt
ceclar1231 小时前
C++范围操作(2)
开发语言·c++
一个尚在学习的计算机小白1 小时前
java集合
java·开发语言
IUGEI1 小时前
synchronized的工作机制是怎样的?深入解析synchronized底层原理
java·开发语言·后端·c#