我的Mac上运行了一个Ubuntu服务器,我在Ubuntu和Mac上都运行了Thrift服务器。每个Thrift服务器提供的服务是不同的。
限制是我需要只将Mac Thrift服务器IP和端口暴露给客户端。
有什么方法可以将来自客户端的请求从Mac thrift服务器转发到ubuntu服务器?或者就此而言,是否可以让任何其他经纪人根据所请求的服务进行转发?
答案 0 :(得分:0)
不确定。至少有三种方法出现在我的脑海中。它主要取决于API的设计方式以及您是否能够更改它。
如果您无法或无法更改API,请提供便利。每个请求处理程序函数只是将数据转发到另一个,但是完全相似的服务共享相同的Thrift IDL定义。与回应相同。实现起来非常简单,但可能效率较低,因为消息需要在代理上进行解码和编码,这需要使代理始终保持最新状态并且知道该API的旧版本。
为了避免在代理上实现每个API函数只是为了做一些愚蠢的数据混乱,特别是当API随着时间的推移而发展时,可以将所有请求和响应放入一些通用包装器union
,像这样,让你在单个API调用上,这很容易在代理上实现:
union AllRequests {
1: FooRequest foo
2: BarRequest bar
// more as needed
}
union AllResponses {
1: FooResponse foo
2: BarResponse bar
// more as needed
}
service Fowarding {
AllResponses HandleRequest( 1: AllRequests request)
}
消息仍然需要在代理上进行解码和编码,加上IDL版本控制相同的考虑因素。此外,数据格式非常正式,但实际上并不一定是坏事。如果在某一天您想要切换到MQ系统,或者您打算使用Thrift序列化来记录/回放服务调用,那么无论如何这将是最佳选择。
有效负载消息可以序列化为BLOB,然后将其发送到代理服务器,代理服务器将其转发到最终目的地。
service Fowarding {
binary HandleRequest( 1: binary request)
}
这里最大的好处是,代理不需要知道二进制数据中的内容。这对他来说是完全透明的。这也意味着,代理甚至不需要知道用于序列化这些数据的IDL。最后,它还允许向二进制数据添加一些元数据,如果需要优化路由和/或处理:
struct BinaryRequest {
1: binary data
2: string preferredRoute
}
支付的价格显然是双序列化开销。