1

我正在尝试编写一个在服务器中应用过滤器的 finagle-thrift 服务。

finagle-thrift 从您实现的 thrift IDL 生成一个服务接口 (Iface),然后传递给该Thrift.serveIface(addr, Iface)方法。还有另一种方法Thrift.serve(addr, Service[Req, Rep])可用于提供更通用的服务。可以组合服务,所以我想做类似的事情,Thrift.service(addr, myFilter andThen myService)但我不知道如何将 Iface 转换为服务。

Thrift.serveIface方法使用了一个私有方法,该方法serverFromIface执行 Iface 到服务的转换,这将允许我在将服务传递给Thrift.serve. 见:https ://github.com/twitter/finagle/blob/master/finagle-thrift/src/main/scala/com/twitter/finagle/rich.scala

由于该转换是私有的,我不知道应该如何在服务器中应用过滤器。

4

1 回答 1

0

我发现了一种直接构建服务的方法。代码生成器使用服务名称+“$FinagleService”创建一个类。这可以通过对 Iface 实现和 TProtocolFactory 的引用来构造,以生成可与过滤器组合的 Service 对象,并且可以由 Thrift 对象提供服务。

这是一个名为“Hello”的服务的示例:

val service = new Hello$FinagleService(
  iface = new Hello[Future]() {...},
  protocolFactory = Protocols.binaryFactory()
)
val compositeService = myFilter andThen service
Thrift.serve(addr, compositeService)
于 2015-12-10T23:15:13.827 回答