searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

使用Go语言开发gRPC服务

2025-08-15 10:30:51
0
0

这篇文章将介绍如何使用 Go 语言开发基于 Protocol Buffers (Proto 文件) 协议的 gRPC 服务器端(Server)和客户端(Client)。通过该文章使读者掌握基本的 gRPC Server、Client 开发步骤、工具和方法。

1. 安装开发工具

确保安装以下工具和库:

  • Go 语言开发工具:正确配置 Go 语言开发环境
  • Protocol Buffers Compiler (protoc):用于编译 .proto 文件
  • gRPC 和 Protocol Buffers 的 Go 插件:用于生成 Server、Client 框架代码
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

2. 创建 Proto 文件

创建一个 .proto 文件,定义消息结构和服务方法。例如,创建一个名为 example.proto 的文件,内容如下:

syntax = "proto3";

package example;

// 定义消息
message Request {
    string name = 1;
}

message Response {
    string message = 1;
}

// 定义服务
service Greeter {
    rpc SayHello(Request) returns (Response);
}

3. 生成 Go 框架代码

使用 protoc 命令生成 Go 框架代码:

# --go_out 消息代码输出文件夹, --go-grpc_out gRPC代码输出文件夹
protoc --go_out=. --go-grpc_out=. example.proto

生成如下两个文件:

  • example.pb.go包含消息类型、结构定义及消息序列化/反序列化
  • example_grpc.pb.go:包含 gRPC 服务的接口定义和实现

4. 实现 gRPC 服务器

使用上面生成的 Go 消息和服务代码实现 gRPC 服务器,创建一个 Go 文件(例如 server.go)内容如下:

package main

import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"
    pb "path/to/your/generated/package" // 替换为生成代码的实际包路径
)

// server 结构体实现了 GreeterServer 接口
type server struct {
    pb.UnimplementedGreeterServer // 嵌入未实现的服务器
}

// 实现 SayHello 方法
func (s *server) SayHello(ctx context.Context, req *pb.Request) (*pb.Response, error) {
    return &pb.Response{Message: "Hello " + req.Name}, nil
}

func main() {
    // 创建 gRPC 服务器
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})

    // 监听端口
    listener, err := net.Listen("tcp", ":50051")
    if err != nil {
        log.Fatalf("Failed to listen: %v", err)
    }

    log.Println("Server is running on port :50051")
    if err := s.Serve(listener); err != nil {
        log.Fatalf("Failed to serve: %v", err)
    }
}

5. 实现 gRPC 客户端

实现 gRPC 客户端,创建一个 Go 文件(例如 client.go)内容如下:

package main

import (
    "context"
    "log"
    "time"

    "google.golang.org/grpc"
    pb "path/to/your/generated/package" // 替换为生成代码的实际包路径
)

func main() {
    // 连接到 gRPC 服务器
    conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("Did not connect: %v", err)
    }
    defer conn.Close()

    client := pb.NewGreeterClient(conn)

    // 设置超时
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()

    // 调用 SayHello 方法
    response, err := client.SayHello(ctx, &pb.Request{Name: "World"})
    if err != nil {
        log.Fatalf("Could not greet: %v", err)
    }

    log.Printf("Response from server: %s", response.Message)
}

6. 运行服务器和客户端

  1. 运行 gRPC 服务器
go run server.go
  1. 在另一个终端运行 gRPC 客户端
go run client.go

总结

通过以上步骤,我们使用 Go 语言基于 Protocol Buffers 开发了完整的 gRPC 服务器端和客户端。读者可以参考上面介绍的工具、方法和步骤,实现自己的业务需求。

0条评论
0 / 1000
张军
5文章数
0粉丝数
张军
5 文章 | 0 粉丝
原创

使用Go语言开发gRPC服务

2025-08-15 10:30:51
0
0

这篇文章将介绍如何使用 Go 语言开发基于 Protocol Buffers (Proto 文件) 协议的 gRPC 服务器端(Server)和客户端(Client)。通过该文章使读者掌握基本的 gRPC Server、Client 开发步骤、工具和方法。

1. 安装开发工具

确保安装以下工具和库:

  • Go 语言开发工具:正确配置 Go 语言开发环境
  • Protocol Buffers Compiler (protoc):用于编译 .proto 文件
  • gRPC 和 Protocol Buffers 的 Go 插件:用于生成 Server、Client 框架代码
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

2. 创建 Proto 文件

创建一个 .proto 文件,定义消息结构和服务方法。例如,创建一个名为 example.proto 的文件,内容如下:

syntax = "proto3";

package example;

// 定义消息
message Request {
    string name = 1;
}

message Response {
    string message = 1;
}

// 定义服务
service Greeter {
    rpc SayHello(Request) returns (Response);
}

3. 生成 Go 框架代码

使用 protoc 命令生成 Go 框架代码:

# --go_out 消息代码输出文件夹, --go-grpc_out gRPC代码输出文件夹
protoc --go_out=. --go-grpc_out=. example.proto

生成如下两个文件:

  • example.pb.go包含消息类型、结构定义及消息序列化/反序列化
  • example_grpc.pb.go:包含 gRPC 服务的接口定义和实现

4. 实现 gRPC 服务器

使用上面生成的 Go 消息和服务代码实现 gRPC 服务器,创建一个 Go 文件(例如 server.go)内容如下:

package main

import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"
    pb "path/to/your/generated/package" // 替换为生成代码的实际包路径
)

// server 结构体实现了 GreeterServer 接口
type server struct {
    pb.UnimplementedGreeterServer // 嵌入未实现的服务器
}

// 实现 SayHello 方法
func (s *server) SayHello(ctx context.Context, req *pb.Request) (*pb.Response, error) {
    return &pb.Response{Message: "Hello " + req.Name}, nil
}

func main() {
    // 创建 gRPC 服务器
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})

    // 监听端口
    listener, err := net.Listen("tcp", ":50051")
    if err != nil {
        log.Fatalf("Failed to listen: %v", err)
    }

    log.Println("Server is running on port :50051")
    if err := s.Serve(listener); err != nil {
        log.Fatalf("Failed to serve: %v", err)
    }
}

5. 实现 gRPC 客户端

实现 gRPC 客户端,创建一个 Go 文件(例如 client.go)内容如下:

package main

import (
    "context"
    "log"
    "time"

    "google.golang.org/grpc"
    pb "path/to/your/generated/package" // 替换为生成代码的实际包路径
)

func main() {
    // 连接到 gRPC 服务器
    conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("Did not connect: %v", err)
    }
    defer conn.Close()

    client := pb.NewGreeterClient(conn)

    // 设置超时
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()

    // 调用 SayHello 方法
    response, err := client.SayHello(ctx, &pb.Request{Name: "World"})
    if err != nil {
        log.Fatalf("Could not greet: %v", err)
    }

    log.Printf("Response from server: %s", response.Message)
}

6. 运行服务器和客户端

  1. 运行 gRPC 服务器
go run server.go
  1. 在另一个终端运行 gRPC 客户端
go run client.go

总结

通过以上步骤,我们使用 Go 语言基于 Protocol Buffers 开发了完整的 gRPC 服务器端和客户端。读者可以参考上面介绍的工具、方法和步骤,实现自己的业务需求。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0