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

相关推荐
web3.08889998 分钟前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python
один but you1 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言
IT_陈寒1 小时前
Redis缓存击穿把我整不会了,原来还有这手操作
前端·人工智能·后端
kyriewen2 小时前
面试官让我查各部门工资最高的员工,我用AI三秒写出窗口函数,他愣了
后端·mysql·面试
文心快码BaiduComate2 小时前
干货|Comate Harness Engineering工程实践指南
前端·后端·程序员
光辉GuangHui2 小时前
Agent Skill 也需要测试:如何搭建 Skill 评估框架
前端·后端·llm
MY_TEUCK2 小时前
【Java 后端 | Nacos 注册中心】微服务治理原理、选型与注册发现实战
java·开发语言·微服务
我是谁的程序员2 小时前
Mac 上生成 AppStoreInfo.plist 文件,App Store 上架
后端·ios
irving同学462382 小时前
Node 后端实战:JWT 认证与生产级错误处理
前端·后端
测试员周周2 小时前
【Appium 系列】第13节-混合测试执行器 — API + UI 的协同执行
开发语言·人工智能·python·功能测试·ui·appium·pytest