java 构建avro rpc_avro入门之rpc

现在对在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编写跨语言的客户端,具体内容还有待研究

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值