簡體   English   中英

我想在一個傳輸上使用多個服務(Thrift)

[英]I'd like to use multiple services on one transport ( Thrift )

我想創建幾個服務,我想使用不同的標識符。 所以我的意思是:

我有一個用戶和項目服務。 我想同時使用這些。

我的意思是我可以在xmlrpc上的“handlermap”中添加更多“服務”。

http://ws.apache.org/xmlrpc/server.html

phm.addHandler("Users",
             Users.class); 
phm.addHandler("Projects",
               Projects.class);

我想在節儉中做同樣的事情。

這是一個簡單的例子:test.thrift

typedef i64 UserId

struct Bonk
{
  1: string message,
  2: i32 type
}

struct Insanity
{
  1: map<Bonk, UserId> userMap,
  2: list<Bonk> xtructs
}



service ThriftTest
{
  void         testVoid(),
  string       testString(1: string test),
  byte         testByte(1: byte test),
  i32          testI32(1: i32 test),
  i64          testI64(1: i64 test),
  double       testDouble(1: double test),
  list<map<i32,i32>> testMap(1: map<i32,i32> test),
  map<string,string> testStringMap(1: map<string,string> test),
  set<i32>     testSet(1: set<i32> test),
  map<i32,map<i32,i32>> testMapMap(1: i32 test),
  map<UserId, map<i32,Insanity>> testInsanity(1: Insanity argument)
}

然后我創建一個implementatino,然后將其添加到TServer的實例。

Users.Processor users_proccesor = new Users.Processor(New UsersImpl());
Projects.Processor project_processor = new Projects.Processors(new ProjectsImp());
// I would like to add Users and Projects  
ThriftTest.Processor prc = new ThriftTest.Processor(new ThiftTestImp());
            TServerTransport serverTransport = new TServerSocket(9090);
            TServer server = new TSimpleServer(new Args(serverTransport).processor( prc ));

這是我的大問題,我無法添加服務器的多個實例。

提前謝謝你的幫助。

現在正在整合多路復用服務(本質上就是你想要做的)。 已經有許多語言的補丁可用,已經被接受或正在被審查過程中。

https://issues.apache.org/jira/browse/THRIFT-563是一個很好的起點。

PS:歡迎評論者和貢獻;-)

RPC調用通過TMessage結構中的線路傳輸,該結構沒有“targetService”字段。 因此,沒有直接的方法將多個服務綁定到單個端口,而無需將此字段添加到TMessage並重新編譯thrift。

通過實現類似於TSimpleSever(或任何其他TServer)的自定義TServer,可以進行黑客攻擊。

服務器應該在循環中讀取目標服務並獲得相應的處理器:

      ...
      inputProtocol = inputProtocolFactory_.getProtocol(inputTransport);
      outputProtocol = outputProtocolFactory_.getProtocol(outputTransport);
      do {
        String target = inputProtocol.readString();
        processor = processorFactoryMap.get(target).getProcessor(client);
      while (processor.process(inputProtocol, outputProtocol));
      ...

客戶端應為每條消息添加目標服務字符串。 這可以通過將TBinaryProtocol包裝在自定義協議中來完成:

public void writeMessageBegin(TMessage message) throws TException {
    wrapped.writeString(target);
    wrapped.writeMessageBegin(message);
}

這種方法的主要缺點是失去了與其他客戶端的互操作性。 因此,可能最好在不同端口上啟動兩個不同的TServer,或者在單個thrift服務中定義所有方法,然后將調用委托給適當的處理程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM