欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 快速实现golang的grpc服务

快速实现golang的grpc服务

2025/6/18 18:28:05 来源:https://blog.csdn.net/qq_45499910/article/details/148603884  浏览:    关键词:快速实现golang的grpc服务

文章目录

  • 1、安装服务
  • 2、检查安装版本情况
  • 3、编写proto文件
  • 4、生成代码
  • 5、实现业务逻辑
  • 6、创建provider
  • 7、测试调用

1、安装服务

1、protoc安装
需去官网下载
protobuf
2、命令行安装protoc-gen-go和protoc-gen-go-grpc

$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

2、检查安装版本情况

protoc --version
# libprotoc 29.0protoc-gen-go --version
# protoc-gen-go v1.28.1protoc-gen-go-grpc --version
# protoc-gen-go-grpc 1.2.0

3、编写proto文件

syntax = "proto3";import "google/protobuf/descriptor.proto";
import "information.proto";
import "interfaceTest.proto";package interfaceTest;
option go_package="gopkg.inshopline.com/demo/book/api/grpc/gen/testGateway";message NodeReq{string id = 1;repeated string ids = 2;interfaceTest.baseDto baseField = 3;information.OpenAPIContext openAPIContext = 4;
}message TestDataTypeNodeListResponse{string code = 1;string message = 2;repeated interfaceTest.InterfaceDataTypeReq data = 3;
}service TestGatewayService {rpc testDataTypeNode(NodeReq) returns(TestDataTypeNodeListResponse);}

4、生成代码

#!/bin/bash# 与proto放在同一级,当前目录生成**.grpc.pb.go**.pb.go
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative interfaceTest.proto

或者
在这里插入图片描述

#!/bin/bash# gRPC二方API库相对于当前脚本的文件路径
working_directory=./grpccd $working_directory || exit 1
echo working_directory="$(pwd)"if [ ! -f "go.mod" ]; thenecho no go.mod file in "$(pwd)"exit 1
fimodule=$(grep '^module' go.mod | head -1)
module_path=${module#*"module "}
echo module_path="$module_path"cd ./proto || exit 1# package specification: https://protobuf.dev/reference/go/go-generated/#package
for f in *.proto; doif [ ! -f "$f" ]; thencontinueficmd="protoc \\--proto_path=. \\--go_out=../gen/ \\--go_opt=module=$module_path/gen \\--go-grpc_out=require_unimplemented_servers=false:../gen/ \\--go-grpc_opt=module=$module_path/gen \\$f"echo command="$cmd"eval "$cmd"
done

然后会生成2个文件
testGateway.pb.go
testGateway_grpc.pb.go

5、实现业务逻辑

实现proto中定义的方法

testGateway_grpc.pb.go中代码片段

// TestGatewayServiceServer is the server API for TestGatewayService service.
// All implementations should embed UnimplementedTestGatewayServiceServer
// for forward compatibility
type TestGatewayServiceServer interface {TestDataTypeNode(context.Context, *NodeReq) (*TestDataTypeNodeListResponse, error)
}// UnimplementedTestGatewayServiceServer should be embedded to have forward compatible implementations.
type UnimplementedTestGatewayServiceServer struct {
}

实现TestGatewayServiceServer方法

package testGatewayimport ("context""encoding/json""errors""fmt""gopkg.inshopline.com/commons/logx""gopkg.inshopline.com/demo/book/api/grpc/gen/interfaceTest""gopkg.inshopline.com/demo/book/api/grpc/gen/testGateway""time"
)var (logger                                      = logx.GetLogger("core-testGateway")_      testGateway.TestGatewayServiceServer = (*TestGatewayService)(nil)
)type TestGatewayService struct {testGateway.UnimplementedTestGatewayServiceServer
}func (t TestGatewayService) TestDataTypeNode(ctx context.Context, req *testGateway.NodeReq) (*testGateway.TestDataTypeNodeListResponse, error) {reqBody, _ := json.Marshal(req)logger.Infof(ctx, "TestDataTypeNode request body: %s", string(reqBody))result := &testGateway.TestDataTypeNodeListResponse{Code:    "0",Message: "success",Data:    []*interfaceTest.InterfaceDataTypeReq{},}resonse := &interfaceTest.InterfaceDataTypeReq{}mockRes := ""for _, reqId := range req.Ids {switch reqId {case "1":mockRes = "{\"id\":\"1\",\"dataURL\":\"1\",\"dataURI\":\"1\",\"dataUUID\":\"1\",\"dataFloat\":323.12,\"dataDouble\":434.23,\"dataString\":\"test interface\",\"dataBigDecimal\":132.23,\"dataBoolean\":true,\"dataShort\":12,\"dataChar\":\"c\",\"dataInt\":123,\"dataListStr\":[\"13\",\"设计gql\"],\"dataObject\":{\"objectId\":\"144fas\",\"objectSex\":\"男\",\"objectName\":\"黑海\"},\"dataObjectList\":[{\"objectId\":\"144fas\",\"objectSex\":\"男\",\"objectName\":\"黑海\"},{\"objectId\":\"jdisf1443\",\"objectSex\":\"女\",\"objectName\":\"闰土\"}],\"dataMap\":{\"mapKey\":\"name\",\"mapValue\":\"哈哈\"},\"dataMapList\":[{\"mapKey\":\"name\",\"mapValue\":\"哈哈\"},{\"mapKey\":\"hua\",\"mapValue\":\"heiei\"}]}"err := json.Unmarshal([]byte(mockRes), &resonse)if err != nil {logger.Errorf(ctx, "json unmarshal err: %s", err.Error())result.Code = "1"result.Message = fmt.Sprintf("json unmarshal err: %s", err.Error())break}case "2":mockRes = "{\"id\":\"2\",\"dataURL\":\"2\",\"dataURI\":\"2\",\"dataUUID\":\"2\",\"dataFloat\":0.0,\"dataDouble\":0.0,\"dataString\":\"2\",\"dataBigDecimal\":22.22,\"dataBoolean\":false,\"dataShort\":0,\"dataChar\":\"\\u0000\",\"dataInt\":0,\"dataListStr\":[\"22\",\"设计gql22\"],\"dataObject\":null,\"dataObjectList\":null,\"dataMap\":null,\"dataMapList\":[{\"mapKey\":null,\"mapValue\":null},{\"mapKey\":\"hua\",\"mapValue\":\"heiei\"}]}"err := json.Unmarshal([]byte(mockRes), &resonse)if err != nil {logger.Errorf(ctx, "json unmarshal err: %s", err.Error())result.Code = "1"result.Message = fmt.Sprintf("json unmarshal err: %s", err.Error())break}case "3":breakcase "4":return &testGateway.TestDataTypeNodeListResponse{Code:    "0",Message: "test data is []",}, nilcase "5":time.Sleep(3 * time.Second)breakcase "6":return nil, errors.New("异常测试")case "7":result.Code = "TS001"result.Message = "错误码测试"case "8":result.Code = "TS002"result.Message = "错误码测试2"}result.Data = append(result.Data, resonse)}return result, nil
}

6、创建provider


package providerimport ("context"test_gateway "demo/book/core/biz/testGateway""gopkg.inshopline.com/demo/book/api/grpc/gen/testGateway"
)// @Author: lyd
// @File: testGatewayService.go
// @Date: 2025/6/12 11:19
// @Description: 测试网关type TestGatewayProvider struct {
}var (_                  testGateway.TestGatewayServiceServer = (*TestGatewayProvider)(nil)testGatewayService                                      = &test_gateway.TestGatewayService{}
)func (T *TestGatewayProvider) TestDataTypeNode(ctx context.Context, req *testGateway.NodeReq) (*testGateway.TestDataTypeNodeListResponse, error) {return testGatewayService.TestDataTypeNode(ctx, req)
}
package providerimport ("google.golang.org/grpc""gopkg.inshopline.com/demo/book/api/grpc/gen/testGateway"
)func RegisterGrpcProvider(server *grpc.Server) {testGateway.RegisterTestGatewayServiceServer(server, &TestGatewayProvider{})
}

然后启动时注册上去就好了

7、测试调用

postman调用正常
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词