[英]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.