`

Avro RPC的两种实现方法:静态实现和动态实现

    博客分类:
  • Avro
 
阅读更多

使用Avro可实现如下几种方式的轻量级RPC, 每种方式都可用动态编码和静态编码来实现:

HTTP:

HttpServer

HttpTransceiver

 

UDP

DatagramServer

DatagramTransceiver

 

Netty

NettyServer

NettyTransceiver

 

TCP

SocketServer

SocketTransceiver

 

安全TCP

SaslSocketServer

SaslSocketTransceiver

 

1.  添加maven依赖包

		<dependency>
		  <groupId>org.apache.avro</groupId>
		  <artifactId>avro</artifactId>
		  <version>1.8.1</version>
		</dependency>
		<dependency>
            <groupId>org.apache.avro</groupId>
            <artifactId>avro-ipc</artifactId>
            <version>1.8.1</version>
        </dependency>

 

 

2. 静态方法实现Netty RPC

2.1 下载 avro-tools-1.8.1.jar

2.2 编译mail.avpr, 生成java代码Message.java 和 Mail.java

mail.avpr:

{"namespace": "org.hdp.practice.rpc.netty",
 "protocol": "Mail",

 "types": [
     {"name": "Message", "type": "record",
      "fields": [
          {"name": "to",   "type": "string"},
          {"name": "from", "type": "string"},
          {"name": "body", "type": "string"}
      ]
     }
 ],

 "messages": {
     "send": {
         "request": [{"name": "message", "type": "Message"}],
         "response": "string"
     }
 }
}

 运行命令: java -jar avro-tools-1.8.1.jar compile protocol mail.avpr .

 

2.3 java代码

public class MyServer {
	public static class MailImpl implements Mail{
		@Override
	    public Utf8 send(Message message) {
	        System.out.println("Sending message");
	        return new Utf8("Sending message to " + message.getTo().toString()
	                + " from " + message.getFrom().toString()
	                + " with body " + message.getBody().toString());
	    }
	}
	
	public static void main(String[] args) throws IOException {
		System.out.println("Starting server");
		NettyServer server = new NettyServer(new SpecificResponder(Mail.class, new MailImpl()), new InetSocketAddress(65111));
        System.out.println("Server started");
	}
}

public class MyClient {
    public static void main(String[] args) throws IOException {
        if (args.length != 3) {
            System.out.println("Usage: <to> <from> <body>");
            System.exit(1);
        }

        NettyTransceiver client = new NettyTransceiver(new InetSocketAddress(65111));
        Mail proxy = (Mail) SpecificRequestor.getClient(Mail.class, client);
        System.out.println("Client built, got proxy");

        Message message = new Message();
        message.setTo(new Utf8(args[0]));
        message.setFrom(new Utf8(args[1]));
        message.setBody(new Utf8(args[2]));
        System.out.println("Calling proxy.send with message:  " + message.toString());
        System.out.println("Result: " + proxy.send(message));

        client.close();
    }
}

 

 

3. 动态方法实现HTTP RPC

3.1  message.avpr

{  
    "namespace": "cn.slimsmart.avro.demo",  
    "protocol": "messageProtocol",  
    "doc": "This is a message.",  
    "name": "Message",  
    "types": [  
        {"name":"message", "type":"record",  
            "fields":[  
                {"name":"name", "type":"string"},  
                {"name":"type", "type":"int"},  
                {"name":"price", "type":"double"},  
                {"name":"valid", "type":"boolean"},  
                {"name":"content", "type":"string"}  
             ]  
        }  
    ],  
    "messages":    {  
        "sendMessage":{  
            "doc" : "message test",  
            "request" :[{"name":"message","type":"message" }],  
            "response" :"message"  
        }           
    }     
}

 

3.2 java 代码

public class Server extends GenericResponder {  
	  
    private Protocol protocol = null;  
    private int port;  
  
    public Server(Protocol protocol, int port) {  
        super(protocol);  
        this.protocol = protocol;  
        this.port = port;  
    }  
  
    @Override  
    public Object respond(Message message, Object request) throws Exception {  
        GenericRecord req = (GenericRecord) request;  
        GenericRecord reMessage = null;  
        if (message.getName().equals("sendMessage")) {  
            GenericRecord msg = (GenericRecord)req.get("message");  
            System.out.print("接收到数据:");  
            System.out.println(msg);  
            //取得返回值的类型  
            reMessage =  new GenericData.Record(protocol.getType("message"));   
            //直接构造回复  
            reMessage.put("name", "苹果");  
            reMessage.put("type", 100);  
            reMessage.put("price", 4.6);  
            reMessage.put("valid", true);  
            reMessage.put("content", "最新上架货物");  
        }  
        return reMessage;  
    }  
  
    public void run() {  
        try {  
            HttpServer server = new HttpServer(this, port);  
            server.start();  
            server.join();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    public static void main(String[] args) {  
        new Server(Utils.getProtocol(), 9090).run();  
    }  
}


public class Client {  
	  
    private Protocol protocol = null;  
    private String host = null;  
    private int port = 0;  
    private int count = 0;  
  
    public Client(Protocol protocol, String host, int port, int count) {  
        this.protocol = protocol;  
        this.host = host;  
        this.port = port;  
        this.count = count;  
    }  
  
    public long sendMessage() throws Exception {  
        GenericRecord requestData = new GenericData.Record(protocol.getType("message"));  
        requestData.put("name", "香梨");  
        requestData.put("type", 36);  
        requestData.put("price", 5.6);  
        requestData.put("valid", true);  
        requestData.put("content", "价钱便宜");  
          
        // 初始化请求数据  
        GenericRecord request = new GenericData.Record(protocol.getMessages().get("sendMessage").getRequest());  
        request.put("message", requestData);  
  
        Transceiver t = new HttpTransceiver(new URL("http://" + host + ":" + port));  
        GenericRequestor requestor = new GenericRequestor(protocol, t);  
          
        long start = System.currentTimeMillis();  
        for (int i = 0; i < count; i++) {  
              Object result = requestor.request("sendMessage", request);  
              if (result instanceof GenericData.Record) {  
                  GenericData.Record record = (GenericData.Record) result;  
                  System.out.println(record);  
              }  
        }  
        long end = System.currentTimeMillis();  
        System.out.println((end - start)+"ms");  
        return end - start;  
    }  
  
    public long run() {  
        long res = 0;  
        try {  
            res = sendMessage();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return res;  
    }  
  
    public static void main(String[] args) throws Exception {  
        new Client(Utils.getProtocol(), "127.0.0.1", 9090, 5).run();  
    }  
}  


public class Utils {
	public static Protocol getProtocol() {  
        Protocol protocol = null;  
        try {  
            String url = Utils.class.getResource("").getPath()+"message.avpr";
            protocol = Protocol.parse(new File(url));  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return protocol;  
    }  
}

 

 

参考:

https://github.com/phunt/avro-rpc-quickstart/

https://my.oschina.net/tearsky/blog/509610

http://blog.jobbole.com/92290/

分享到:
评论

相关推荐

    Apache Avro RPC简单示例

    Avro RPC是Avro的一个关键特性,它提供了一种标准的方式来定义服务接口,包括方法签名和返回类型。服务端和客户端都使用相同的接口定义(通常是一个`.avpr`文件),这样就能确保双方对数据格式的一致理解。Avro的RPC...

    avro-rpc-demo:avro rpc的演示代码

    “ avro-rpc-demo”是Java实现的avro rpc的演示代码。 作者:zhexin Pan日期:20151103 简介此项目包括Java中的三个实现演示。 第一个是官方网站的快速入门演示,它是数据序列化和反序列化的两种实现,分别称为...

    avro-rpc程序示例

    **Avro RPC简介** Avro是Hadoop生态系统中的一个关键组件..."avro-rpc-quickstart-master"示例项目为开发者提供了学习和实践Avro RPC的起点,通过运行和分析代码,可以深入了解Avro RPC的工作原理和Netty的使用方法。

    avro-rpc-quickstart:Apache Avro RPC快速入门

    代码生成是可选的优化,仅值得为静态类型的语言实现。执照该项目获得了Apache License Version 2.0的许可。介绍该项目中包含的示例应用程序模拟了一个远程服务Mail,其中Avro RPC用于使用该服务发送消息。 本文档...

    avro-in-action:RPC与Apache Avro示例

    通过Avro RPC,服务提供者和消费者可以共享相同的模式,简化了接口定义和实现。 在"avro-in-action-master"中,你可能会找到以下内容: 1. **模式定义**:Avro的JSON模式文件(.avsc),定义了数据结构和接口。 2....

    几种序列化的实现方法 java自带, Writable, Avro

    在Java和其他编程语言中,有多种序列化实现方法,包括Java自带的序列化、Writable接口(常见于Hadoop生态系统)以及Avro。下面将详细介绍这三种序列化方式。 1. **Java自带的序列化** Java内置的序列化机制是通过...

    avro linux C++动态库

    总之,Avro Linux C++动态库为开发者提供了在C++中方便地使用Avro序列化和反序列化的功能,便于在跨语言、跨平台的环境中实现高效、灵活的数据交换。正确配置和使用这些库,可以帮助开发人员实现复杂的数据处理任务...

    avro-1.8.2-API文档-中英对照版.zip

    Maven坐标:org.apache.avro:avro:1.8.2; 标签:apache、avro、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    avro-1.10.0-API文档-中英对照版.zip

    Maven坐标:org.apache.avro:avro:1.10.0; 标签:apache、avro、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    avro-1.8.2-API文档-中文版.zip

    Maven坐标:org.apache.avro:avro:1.8.2; 标签:apache、avro、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...

    avro-1.10.0-API文档-中文版.zip

    Maven坐标:org.apache.avro:avro:1.10.0; 标签:apache、avro、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    avro-1.11.0-API文档-中文版.zip

    Maven坐标:org.apache.avro:avro:1.11.0; 标签:apache、avro、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    Java读写avro所需jar

    1. **Avro-1.7.7.jar**:这是Avro的核心库,包含了一系列的API和实现,使得Java开发者能够创建、序列化和反序列化Avro数据。这个库提供了以下主要功能: - **数据模型**:Avro定义了一种强类型的数据模型,包括基本...

    avro-1.7.4-API文档-中文版.zip

    Maven坐标:org.apache.avro:avro:1.7.4; 标签:apache、avro、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...

    利用AVRO定义avdl文件示例

    AVRO提供了丰富的数据结构类型、快速序列化以及支持动态类型语言和静态类型语言。 数据定义语言avdl是AVRO用于定义数据结构和远程过程调用协议的一种声明性语言。它是AVRO框架中定义数据模型和RPC接口的工具。通过...

    avro-1.8.1

    运行Sqoop报错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/avro/LogicalType,下载此资源放到Sqoop的lib目录下即可

    avro-ipc-1.8.2-API文档-中文版.zip

    Maven坐标:org.apache.avro:avro-ipc:1.8.2; 标签:apache、avro、ipc、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...

    avro-1.7.7-API文档-中文版.zip

    Maven坐标:org.apache.avro:avro:1.7.7; 标签:apache、avro、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...

    avrora:一个方便的Elixir库,可与Avro模式和Confluent:registered:模式注册表一起使用

    这种模式驱动的序列化方法使得在不同的系统之间交换数据变得更加容易和可靠。 **Elixir与Avro的结合** Elixir是一种功能丰富的、基于Erlang虚拟机的编程语言,以其并发性能和简洁的语法著称。avrora库将Avro的强大...

    avro-tool工具jar包

    Avro是Apache软件基金会的一个开源项目,它提供了一种数据序列化系统,广泛应用于大数据处理和分布式计算领域。Avro工具jar包是Avro的一部分,主要用于处理Avro格式的数据,包括编译Avro模式,转换数据,以及合并或...

Global site tag (gtag.js) - Google Analytics