我目前正在使用golang上的grpc,并试图找出制作可扩展的“瘦”api的最佳方法,我可以使用它来将所有请求传递给相关服务。
我目前的结构是:
在路径文件中,它创建一个新的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()
方法,这样我就不必为每个服务重新声明它?请记住它在每个实例上返回一个不同的客户端?