java 构建avro rpc_avro入门之rpc

官方给出的rpc资料太少了,这个链接https://github.com/phunt/avro-rpc-quickstart上有相关的说明

现在对在java下使用总结如下:

我这里没有使用maven,直接在项目中加入使用到的jar包有:avro-1.7.7.jar、avro-tools-1.7.7.jar、 jackson-core-asl-1.8.8.jar、jackson-mapper-asl-1.8.8.jar

当然,如果你需要,你也可以在Avro源码中进行编译,获取avro-1.7.7.jar和avro-tools-1.7.7.jar

Avro协议是以JSON结构性描述文本。协议定义了基本的通信的数据类型,名称。并且还包含可调用的方法等。首先定义协议文件

{

"namespace":"avro",

"doc":"This is a message.",

"protocol":"messageProtocol",

"name":"HelloWorld",

"types":[

{

"name":"nameMessage",

"type":"record",

"fields":[ {"name":"name","type":"string"} ]

}

],

"messages":{

"sayHello":{

"doc":"say Hello to manbers",

"request":[ {"name":"name","type":"string"} ],

"response":"nameMessage"

}

}

}

保存在d盘 a.avro

然后编写服务端代码:

importjava.io.File;

importorg.apache.avro.Protocol;

importorg.apache.avro.Protocol.Message;

importorg.apache.avro.generic.GenericData;

importorg.apache.avro.generic.GenericRecord;

importorg.apache.avro.ipc.HttpServer;

importorg.apache.avro.ipc.Server;

importorg.apache.avro.ipc.generic.GenericResponder;

importorg.apache.commons.logging.Log;

importorg.apache.commons.logging.LogFactory;

publicclassAvroHttpServerextendsGenericResponder {

privatestaticLog log = LogFactory.getLog(AvroHttpServer.class);

publicAvroHttpServer(Protocol protocol) {

super(protocol);

}

publicObject respond(Message message, Object request)throwsException {

GenericRecord req = (GenericRecord) request;

GenericRecord reMessage = null;

if(message.getName().equals("sayHello")) {

Object name = req.get("name");

//  do something...

//取得返回值的类型

reMessage = newGenericData.Record(super.getLocal().getType("nameMessage"));

//直接构造回复

reMessage.put("name","Hello, "+ name.toString());

log.info(reMessage);

}

returnreMessage;

}

publicstaticvoidmain(String[] args)throwsException {

intport =8088;

try{

Server server = newHttpServer(

newAvroHttpServer(Protocol.parse(

//                            new File("helloword.json"))),

newFile("d:/a.avro"))),

port);

server.start();

server.join();

} catch(Exception e) {

e.printStackTrace();

}

}

}

接下来编写客户端代码:

importjava.io.File;

importjava.net.URL;

importorg.apache.avro.Protocol;

importorg.apache.avro.generic.GenericData;

importorg.apache.avro.generic.GenericRecord;

importorg.apache.avro.ipc.HttpTransceiver;

importorg.apache.avro.ipc.Transceiver;

importorg.apache.avro.ipc.generic.GenericRequestor;

importorg.junit.Before;

importorg.junit.Test;

publicclassb {

privateProtocol protocol;

privateGenericRequestor requestor =null;

@Before

publicvoidsetUp()throwsException {

protocol = Protocol.parse(newFile("d:/a.avro"));

Transceiver t = newHttpTransceiver(newURL("http://localhost:8088"));  //这里如果要在两台机器上运行记得把localhost改成服务端的ip

requestor = newGenericRequestor(protocol, t);

}

@Test

publicvoidtestSendMessage()throwsException {

GenericRecord requestData = newGenericData.Record(protocol.getType("nameMessage"));

// initiate the request data

requestData.put("name","zhenqin");

System.out.println(requestData);

Object result = requestor.request("sayHello", requestData);

if(resultinstanceofGenericData.Record) {

GenericData.Record record = (GenericData.Record) result;

System.out.println(record.get("name"));

}

System.out.println(result);

}

}

上面先运行服务端在运行客户端,可以看到客户端收到消息。

{"name":"zhenqin"}

Hello, zhenqin

{"name":"Hello, zhenqin"}

以上参考http://my.oschina.net/zhzhenqin/blog/151040

至于用Python编写跨语言的客户端,具体内容还有待研究>>>>>>>>>重新弄了下python客户端的测试:

服务端继续使用java,客户端运行环境如下:python2.7,avro的python安装包在这里。下载解压,然后cd到该目录下执行

python setup.py install安装完毕

接下来只需要执行客户端代码如下:

#!encoding:utf-8

importjson

importavro.protocol as proto

importavro.ipc as ipc

importavro.io as avroio

importavro.schema as schema

__author__ = 'zhenqin'

PROTOCOL = proto.parse(open(r'd:/a.avro','r').read())

def testPro():

client = ipc.HTTPTransceiver("192.168.1.98",8088)

requestor = ipc.Requestor(PROTOCOL, client)

message = dict()

message["name"] ="ZhenQin"

v = requestor.request('sayHello', message)

print("Result: "+ str(v))

# cleanup

client.close()

if__name__ =='__main__':

testPro()

http://blog.csdn.net/shb19891/article/details/41778631?utm_source=tuicool&utm_medium=referral

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值