我试图编写一个在服务器中应用过滤器的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
由于转换是私密的,我不知道应该如何在服务器中应用过滤器。
答案 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)