官方给出的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
然后编写服务端代码:
- import java.io.File;
- import org.apache.avro.Protocol;
- import org.apache.avro.Protocol.Message;
- import org.apache.avro.generic.GenericData;
- import org.apache.avro.generic.GenericRecord;
- import org.apache.avro.ipc.HttpServer;
- import org.apache.avro.ipc.Server;
- import org.apache.avro.ipc.generic.GenericResponder;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- public class AvroHttpServer extends GenericResponder {
- private static Log log = LogFactory.getLog(AvroHttpServer.class);
- public AvroHttpServer(Protocol protocol) {
- super(protocol);
- }
- public Object respond(Message message, Object request) throws Exception {
- GenericRecord req = (GenericRecord) request;
- GenericRecord reMessage = null;
- if (message.getName().equals("sayHello")) {
- Object name = req.get("name");
- // do something...
- //取得返回值的类型
- reMessage = new GenericData.Record(super.getLocal().getType("nameMessage"));
- //直接构造回复
- reMessage.put("name", "Hello, " + name.toString());
- log.info(reMessage);
- }
- return reMessage;
- }
- public static void main(String[] args) throws Exception {
- int port = 8088;
- try {
- Server server = new HttpServer(
- new AvroHttpServer(Protocol.parse(
- // new File("helloword.json"))),
- new File("d:/a.avro"))),
- port);
- server.start();
- server.join();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
接下来编写客户端代码:
- import java.io.File;
- import java.net.URL;
- import org.apache.avro.Protocol;
- import org.apache.avro.generic.GenericData;
- import org.apache.avro.generic.GenericRecord;
- import org.apache.avro.ipc.HttpTransceiver;
- import org.apache.avro.ipc.Transceiver;
- import org.apache.avro.ipc.generic.GenericRequestor;
- import org.junit.Before;
- import org.junit.Test;
- public class b {
- private Protocol protocol;
- private GenericRequestor requestor = null;
- @Before
- public void setUp() throws Exception {
- protocol = Protocol.parse(new File("d:/a.avro"));
- Transceiver t = new HttpTransceiver(new URL("http://localhost:8088")); //这里如果要在两台机器上运行记得把localhost改成服务端的ip
- requestor = new GenericRequestor(protocol, t);
- }
- @Test
- public void testSendMessage() throws Exception {
- GenericRecord requestData = new GenericData.Record(protocol.getType("nameMessage"));
- // initiate the request data
- requestData.put("name", "zhenqin");
- System.out.println(requestData);
- Object result = requestor.request("sayHello", requestData);
- if (result instanceof GenericData.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
- import json
- import avro.protocol as proto
- import avro.ipc as ipc
- import avro.io as avroio
- import avro.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://my.oschina.net/zhzhenqin/blog/151040。另外http://www.iteblog.com/archives/1008和http://www.bianceng.cn/Servers/web/201411/46469.htm也对于入门有帮助
http://blog.csdn.net/shb19891/article/details/41778631?utm_source=tuicool&utm_medium=referral
相关推荐
作者: (在上关注我)概括,如果您愿意的话...介绍该项目中包含的示例应用程序模拟了一个远程服务Mail,其中Avro RPC用于使用该服务发送消息。 本文档详细介绍了如何使用Maven构建和运行示例。 Avro jar文件(以及它们
Avro RPC示例源码,包括client与server端,底层采用Netty
RPC(RemoteProcedureCall)——远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPCServer实现了一种抽象的RPC服务,同时提供Call队列。RPCServer作为服务提供者由两个...
“ avro-rpc-demo”是Java实现的avro rpc的演示代码。 作者:zhexin Pan日期:20151103 简介此项目包括Java中的三个实现演示。 第一个是官方网站的快速入门演示,它是数据序列化和反序列化的两种实现,分别称为...
NULL 博文链接:https://fengyilin.iteye.com/blog/2345324
这是一个关于avro的1.8.2版本的avro-tools-1.8.2的jar包
赠送jar包:avro-1.11.0.jar; 赠送原API文档:avro-1.11.0-javadoc.jar; 赠送源代码:avro-1.11.0-sources.jar; 赠送Maven依赖信息文件:avro-1.11.0.pom; 包含翻译后的API文档:avro-1.11.0-javadoc-API文档-...
这是关于avro的avro-1.8.1版本的avro-tools的一个jar包
赠送jar包:avro-1.8.2.jar; 赠送原API文档:avro-1.8.2-javadoc.jar; 赠送源代码:avro-1.8.2-sources.jar; 赠送Maven依赖信息文件:avro-1.8.2.pom; 包含翻译后的API文档:avro-1.8.2-javadoc-API文档-中文...
avro 工具类 java -jar avro-tools-1.8.1.jar tojson --pretty test.avro > output.json
赠送jar包:flink-avro-1.10.0.jar; 赠送原API文档:flink-avro-1.10.0-javadoc.jar; 赠送源代码:flink-avro-1.10.0-sources.jar; 赠送Maven依赖信息文件:flink-avro-1.10.0.pom; 包含翻译后的API文档:flink-...
赠送jar包:avro-1.8.2.jar; 赠送原API文档:avro-1.8.2-javadoc.jar; 赠送源代码:avro-1.8.2-sources.jar; 赠送Maven依赖信息文件:avro-1.8.2.pom; 包含翻译后的API文档:avro-1.8.2-javadoc-API文档-中文...
赠送jar包:avro-1.10.0.jar; 赠送原API文档:avro-1.10.0-javadoc.jar; 赠送源代码:avro-1.10.0-sources.jar; 赠送Maven依赖信息文件:avro-1.10.0.pom; 包含翻译后的API文档:avro-1.10.0-javadoc-API文档-...
Apache Avro™ is a data serialization system. To learn more about Avro, please read the current documentation. To download Avro, please visit the releases page. Developers interested in getting more ...
赠送jar包:avro-ipc-1.8.2.jar; 赠送原API文档:avro-ipc-1.8.2-javadoc.jar; 赠送源代码:avro-ipc-1.8.2-sources.jar; 赠送Maven依赖信息文件:avro-ipc-1.8.2.pom; 包含翻译后的API文档:avro-ipc-1.8.2-...
平均行动RPC与Apache Avro示例。
这个版本为 1.8.2,亲测有效,如果想免积分下载可以访问maven官方库: https://mvnrepository.com/artifact/org.apache.avro/avro-tools
在MapReduce任务中读取Avro文件,会使用到avro-mapred.jar。 然而目前的avro-mapred.jar是基于较老的版本的,使用时会报错: org.apache.hadoop.mapred.YarnChild: Error running child : java.lang....
avro是hadoop中一个序列化项目,avro和mapreduce结合如何使用,可以实现数据结构化并且序列化和反序列化