使用protobuf

时间:2017-06-09 14:28:49

标签: optimization go protocol-buffers grpc

我目前正在使用golang上的grpc,并试图找出制作可扩展的“瘦”api的最佳方法,我可以使用它来将所有请求传递给相关服务。

我目前的结构是:

  • 服务1
    • routes.go
    • rpc.go
  • 服务2
    • routes.go
    • rpc.go

在路径文件中,它创建一个新的routeGroup,然后我在main中注册,然后路由的每个处理程序将任何params等解析为protobuf请求并调用RPC中的函数:

func showFeed(c *gin.Context) {
    message, err := RpcFeedGet(&social.ShowRequest{LocationId: 1})

    resp := http.HttpResponse{c, "feed", err, message} 
    http.ParseResponse(&resp) //Checks if there is an error and handles response headers etc.
}

现在在rpc中我正在为每个服务定义下面的内容,这对我来说似乎非常低效,因为有很多代码重用,我将如何优化/减少此方法中的代码重用

func connect() (*grpc.ClientConn, pb.Service1Client) {

    //Consul is being used for discovery, this just gets the address to dial
    consul := discovery.Init()
    service, err := consul.Lookup("service1", "")

    if err != nil {
        log.Fatalf("Unable to get service definition: %w", err)
    }

    //Dial the connection to the service
    conn, err := grpc.Dial(service.Address(), grpc.WithInsecure())

    if err != nil {
        log.Fatalf("Unable to connect to client service: %v", err)
    }

    //Creates the service client (service1) and returns it
    client := pb.NewService1Client(conn)

    return conn, client
}

func RpcFeedGet(data *pb.ShowRequest) (string, error) {
    conn, client := connect()
    defer conn.Close()

    //This line calls the protobuf GetFeed rpc service
    resp, err := client.GetFeed(context.Background(), data)

    return rpcHelp.CheckResponse(resp, err) //Handles any errors returned
}

有没有办法可以将函数传递给调用Rpc函数中的连接/延迟的子函数,并规范化connect()方法,这样我就不必为每个服务重新声明它?请记住它在每个实例上返回一个不同的客户端?

0 个答案:

没有答案