我可以为finagle-thrift应用服务器端过滤器吗?

时间:2015-12-10 20:29:41

标签: scala finagle

我试图编写一个在服务器中应用过滤器的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 to Service转换,允许我在将服务传递给Thrift.serve之前使用过滤器来构建服务。见:https://github.com/twitter/finagle/blob/master/finagle-thrift/src/main/scala/com/twitter/finagle/rich.scala

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

1 个答案:

答案 0 :(得分:0)

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

以下是名为“Hello”的服务示例:

val service = new Hello$FinagleService(
  iface = new Hello[Future]() {...},
  protocolFactory = Protocols.binaryFactory()
)
val compositeService = myFilter andThen service
Thrift.serve(addr, compositeService)