go doudou开发gRPC服务快速上手实现详解
简介
本篇攻略旨在介绍如何使用go doudou快速上手实现gRPC服务,并提供2个示例说明。关于go doudou,它是一个快速开发Go语言web应用和RPC服务的轻量级框架。
步骤
步骤1:安装go doudou
安装go doudou,可以参考官方文档进行安装,安装完毕后,确保go doudou已经在使用。
步骤2:生成gRPC接口和客户端代码
使用Protobuf编写服务和消息规范,然后使用protoc-gen-go生成gRPC接口和客户端代码。示例如下:
# 生成gRPC Stub文件夹
$ protoc *.proto --go_out=plugins=grpc:.
示例1:简单的gRPC服务
假设我们要编写一个简单的gRPC服务,它具有以下接口:
service HelloGrpc {
rpc SayHello(HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
首先,在gRPC服务端实现HelloGrpc接口:
package main
import (
"context"
"fmt"
"net"
pb "example/hello_grpc"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
)
const (
port = ":50051"
)
type server struct{}
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{Message: "Hello " + in.Name}, nil
}
func main() {
lis, err := net.Listen("tcp", port)
if err != nil {
fmt.Printf("failed to listen: %v\n", err)
}
s := grpc.NewServer()
pb.RegisterHelloGrpcServer(s, &server{})
reflection.Register(s)
fmt.Println("grpc start...")
if err := s.Serve(lis); err != nil {
fmt.Printf("failed to serve: %v\n", err)
}
}
接着,在gRPC客户端实现HelloGrpc客户端:
package main
import (
"context"
"fmt"
"log"
pb "example/hello_grpc"
"google.golang.org/grpc"
)
const (
address = "localhost:50051"
)
func main() {
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewHelloGrpcClient(conn)
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: "George"})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
}
启动gRPC服务端,然后运行gRPC客户端,将会输出如下结果:
Greeting: Hello George
示例2:gRPC服务使用中间件
假设我们要在gRPC服务中添加中间件,可以使用go doudou提供的gin-like中间件。示例代码如下:
package main
import (
"context"
"fmt"
"net"
pb "example/hello_grpc"
"github.com/huangjunwen/go-doudou/svcmw/ginmw"
"github.com/huangjunwen/go-doudou/svcmw/gjwt"
"github.com/gin-gonic/gin"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
)
const (
port = ":50051"
)
type server struct{}
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{Message: "Hello " + in.Name}, nil
}
func main() {
lis, err := net.Listen("tcp", port)
if err != nil {
fmt.Printf("failed to listen: %v\n", err)
}
s := grpc.NewServer(
grpc.UnaryInterceptor(ginmw.ToGRPCUnaryServerMiddleware(
gjwt.GJWTMiddleware(),
gin.Recovery(),
)),
)
pb.RegisterHelloGrpcServer(s, &server{})
reflection.Register(s)
fmt.Println("grpc start...")
if err := s.Serve(lis); err != nil {
fmt.Printf("failed to serve: %v\n", err)
}
}
在这个示例中,我们使用了go doudou提供的gin-like中间件,并且使用了gjwt中间件。在使用中间件过程中,我们只需要调用ginmw.ToGRPCUnaryServerMiddleware函数将gin-like中间件转为gRPC服务器的中间件,并将输入的中间件列表作为其参数即可。
结论
本篇攻略介绍了如何使用go doudou进行gRPC服务的开发,提供了两个示例。结合Protobuf规范,可以开发出强大的、高效的gRPC服务。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:go doudou开发gRPC服务快速上手实现详解 - Python技术站