go-grpc实践指南-02Hello gRPC
gRPC的基本使用非常简单,看完这部分的第一个示例就可以直接用了。但是在实际环境中,我们不会仅仅满足于能用,而是要更好的使用。一个完整的服务包括:授权认证、数据追踪、负载均衡...,我们从一个简单的项目开始,说明gRPC的基本使用姿势,然后一点点细化扩展,逐步深入完善,打造一个完整的RPC服务。
HelloGrpc
按照惯例,这里也从一个Hello项目开始,本项目定义了一个Hello Service,客户端发送包含字符串名字的请求,服务端返回Hello消息。
流程:
- 编写.proto描述文件
- 编译生成.pb.go文件
- 服务端实现约定的接口并提供服务
- 客户端按照约定调用.pb.go文件中的方法请求服务
项目结构:
|—— hello/
|—— client/
|—— main.go // 客户端
|—— server/
|—— main.go // 服务端
|—— proto/
|—— hello/
|—— hello.proto // proto描述文件
|—— hello.pb.go // proto编译后文件
Step1:编写描述文件:hello.proto
syntax = "proto3";
package hello;
option go_package = "./hello";
// 定义Hello服务
service Hello {
// 定义SayHello方法
rpc SayHello(HelloRequest) returns (HelloResponse) {}
}
// HelloRequest 请求结构
message HelloRequest {
string name = 1;
}
// HelloResponse 响应结构
message HelloResponse {
string message = 1;
}
hello.proto文件中定义了一个Hello Service,该服务包含一个SayHello方法,同时声明了HelloRequest和HelloResponse消息结构用于请求和响应。客户端使用HelloRequest参数调用SayHello方法请求服务端,服务端响应HelloResponse消息。一个最简单的服务就定义好了。
Step2:编译生成.pb.go文件
cd .\proto\hello\
protoc --go_out=plugins=grpc:. --go_opt=paths=source_relative .\hello.proto
在当前目录内生成的hello.pb.go文件,按照.proto文件中的说明,包含服务端接口HelloServer描述,客户端接口及实现HelloClient,及HelloRequest、HelloResponse结构体。
Step3:实现服务端接口 server/main.go
package main
import (
"context"
"google.golang.org/grpc"
"my_grpc/proto/hello"
"net"
)
type HelloService struct{
hello.UnimplementedHelloServer
}
func (t *HelloService) SayHello(ctx context.Context, in *hello.HelloRequest) (*hello.HelloResponse, error) {
return &hello.HelloResponse{Message: "hello " + in.Name}, nil
}
func main() {
listen, _ := net.Listen("tcp", ":9000")
gServer := grpc.NewServer()
hello.RegisterHelloServer(gServer, &HelloService{})
_ = gServer.Serve(listen)
}
服务端引入编译后的proto包,定义一个空结构用于实现约定的接口,接口描述可以查看hello.pb.go文件中的HelloServer接口描述。实例化grpc Server并注册HelloService,开始提供服务。
运行:go run main.go
Step4:实现客户端调用 client/main.go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"my_grpc/proto/hello"
)
func main() {
clientConn, _ := grpc.Dial(":9000", grpc.WithTransportCredentials(insecure.NewCredentials()))
helloClient := hello.NewHelloClient(clientConn)
reply, _ := helloClient.SayHello(context.Background(), &hello.HelloRequest{Name: "张三"})
fmt.Println(reply)
}
客户端初始化连接后直接调用hello.pb.go中实现的SayHello方法,即可向服务端发起请求,使用姿势就像调用本地方法一样。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)