Golang Go语言中 thrift 和 grpc 的问题
Golang Go语言中 thrift 和 grpc 的问题
最近在撸一个自己弄着玩的 api 网关, 对外是 http 的 restful 接口, 对内想用 gprc 和 thrift。
gprc 和 thrift 都可以用生成的文件调用, 这样的话是如果服务端新增接口,那么调用端也要配合新增,就是纯 c/s 模式。 我想的是撸个网关,然后调用内部的服务,内部服务新增接口,不需要修改网关的代码,可以直接调用过去。
比如,通过 consul 时候发现有新增的服务,调用时候可以省去新增服务的 client 端,网关这边 gprc 可以直接用 gprc.Invoke 调用,不是用 pb 文件的 XX 方法。 但是搞 thrift 时候找不到类似 gprc.Invoke 的方法,不知道怎么弄。 难道 thrift 必须两边都用上生成的文件才可以嘛?
更多关于Golang Go语言中 thrift 和 grpc 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
thrift 得提供接口的包给调用方才行
更多关于Golang Go语言中 thrift 和 grpc 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我知道怎么玩了,
正常情况下是这样<br>transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())<br>protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()<br>transport, err := thrift.NewTSocket(net.JoinHostPort(HOST, PORT))<br>useTransport,_ := transportFactory.GetTransport(transport)<br>transport.Open()<br>client := usersrv.NewUserInfoServiceClientFactory(useTransport, protocolFactory)<br><br><br>然后 client.GetUserById(context.TODO(), id)<br>
参考了 gprc.Invoke,观察了下 thrift 的调用方法<br><br>type UserInfoServiceClient struct {<br> c thrift.TClient<br>}<br><br>// Deprecated: Use NewUserInfoService instead<br>func NewUserInfoServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *UserInfoServiceClient {<br> return &UserInfoServiceClient{<br> c: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)),<br> }<br>}
后来,直接自己构造里面的 thrift.TClient,
stClient:=thrift.NewTStandardClient(protocolFactory.GetProtocol(useTransport), protocolFactory.GetProtocol(useTransport))
var _args0 usersrv.UserInfoServiceGetUserByNameArgs
_args0.Namea = “123”
var _result1 usersrv.UserInfoServiceGetUserByIdResult
stClient.Call(context.Background(),“getUserById”, &_args0, &_result1);
//if err = stClient.Call(context.Background(),“getUserById”, &_args0, &_result1); err != nil {
// fmt.Println(err)
// return
//}
fmt.Println(_result1.GetSuccess())
前提是知道入参跟出参是什么,不过自定义网关消息的结构是通用的。比如说现在是
usersrv.UserInfoServiceGetUserByNameArgs,usersrv.UserInfoServiceGetUserByIdResult,
以后通用起来可能就是 ApiGateway.MessageRequest , ApiGateway.MessageResponse 这样。只需要接口定义时候确定成通用的格式就好了。
针对Golang中Thrift和gRPC的问题,以下是一些专业解答:
Thrift和gRPC都是高性能的RPC(远程过程调用)框架,它们在Golang中都有广泛的应用。
Thrift是一个跨语言的服务部署框架,通过IDL(接口定义语言)定义RPC的接口和数据类型,然后生成不同语言的代码。它支持二进制传输格式,具有跨语言、高效的特点。在Golang中,使用Thrift需要先定义IDL文件,然后使用gothrift工具生成Go语言的接口代码,最后实现这些接口并开启服务。
gRPC则是由Google开发的,基于HTTP/2协议标准的高性能RPC框架。它使用ProtoBuf作为序列化协议,支持众多开发语言。在Golang中,使用gRPC需要先编写.proto文件定义服务接口和数据类型,然后使用protoc编译器和gRPC的Go插件生成Go代码,最后实现服务接口并启动gRPC服务器。
两者在序列化协议、传输协议和服务治理等方面有所不同。Thrift提供了多种序列化协议和传输协议的选择,而gRPC则主要使用ProtoBuf进行序列化。此外,gRPC在服务治理方面提供了更多的支持,如服务发现、负载均衡等。
选择Thrift还是gRPC取决于具体的应用场景和需求。如果需要跨语言支持或者对序列化协议和传输协议有更多的控制要求,可以考虑使用Thrift;如果更注重服务治理和性能优化,gRPC可能是一个更好的选择。