用go实现轻量grpc微服务需定义proto接口、生成go代码、初始化服务端与客户端,并处理错误和连接管理;示例包含hello.proto定义、服务端监听50051端口、客户端调用sayhello并输出"hello, alice!"。

用 Go 实现一个轻量、可运行的 gRPC 微服务,关键在于定义清晰的 Protocol Buffer 接口、生成 Go 代码、正确初始化服务端与客户端,并处理基础错误和连接管理。下面是一个完整但不过度封装的示例,聚焦核心流程。
定义 .proto 文件并生成 Go 代码
在 proto/hello.proto 中定义服务:
该系统采用先进的HTML5+CSS3结构,既有手机APP的良好体验,又有智能建站系统的操作方便。在中国,企业网站建设在已有20年,但表现方式基本是一成不变,此产品进行了与众不同的偿试。一切以小微企业实际情况出发,注重核心产品的塑造以及企业文化展示。让小微企业及个人都能找准自身的细分化定位,服务好客户。
syntax = "proto3";
package hello;
option go_package = "./hellopb";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}安装 protoc 和 Go 插件后执行:
立即学习“go语言免费学习笔记(深入)”;
go install google.golang.org/protobuf/cmd/protoc-gen-go@latestgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latestprotoc --go_out=. --go-grpc_out=. proto/hello.proto
生成 hellopb/hello.pb.go 和 hellopb/hello_grpc.pb.go,供服务端和客户端共用。
实现 gRPC 服务端
新建 server/main.go:
package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
pb "your-module-name/hellopb"
)
type server struct {
pb.UnimplementedGreeterServer
}
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{
Message: "Hello, " + req.Name + "!",
}, nil
}
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
defer lis.Close()
grpcServer := grpc.NewServer()
pb.RegisterGreeterServer(grpcServer, &server{})
log.Println("gRPC server listening on :50051")
if err := grpcServer.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}注意点:
- 实现接口时嵌入
UnimplementedGreeterServer,避免未实现方法导致 panic - 使用
context传递超时和取消信号(后续可扩展鉴权、日志等中间件) - 监听地址建议通过 flag 或配置注入,而非硬编码
实现 gRPC 客户端
新建 client/main.go:
package main
import (
"context"
"log"
"time"
"google.golang.org/grpc"
pb "your-module-name/hellopb"
)
func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
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()
r, err := client.SayHello(ctx, &pb.HelloRequest{Name: "Alice"})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Reply: %s", r.GetMessage())
}关键细节:
-
grpc.WithInsecure()表示不启用 TLS(生产环境应配置证书) -
grpc.WithBlock()阻塞等待连接建立成功,便于调试;线上可改用异步连接 + 连接状态监听 -
context.WithTimeout控制单次 RPC 超时,防止永久阻塞 - 客户端复用
*grpc.ClientConn,不要每次调用都 Dial
运行与验证
分别启动服务端和客户端:
go run server/main.go- 另开终端:
go run client/main.go
输出应为:Reply: Hello, Alice!
若报错 “connection refused”,检查端口是否被占用、服务端是否已运行、防火墙设置。









