- 浏览: 194814 次
- 性别:
- 来自: 南京
文章分类
最新评论
一.简介
Apache Avro 是一个序列化系统,提供如下功能:
1.丰富的数据结构
2.压缩的、快速的、二进制数据格式
3.存储持久化数据的容器文件
4.RPC功能
5.可以简单实现与动态语言的集成
特点:
Avro在数据读写过程中都利用基于JSON格式的Schemas,因而不用在序列化时对每个数据都要加一个类型等头部信息,从而使序列化保持快而小。并且因为数据加上对应的schema是自描述的,这样也可以促进在动态、脚本语言中的使用。
二、示例
示例参考【https://github.com/phunt/avro-rpc-quickstart】
本示例利用Mail协议简单模拟一个远程服务,Avro将利用这个服务来发送消息
1.编辑avpr协议文件
(1)定义命名空间
(2)定义协议名称
(3)定义类型信息
(4)定义rpc Messages
2.编写pom文件
3.在项目目录下执行 mvn compile ,执行结束后生成 Mail.java 和Message.java文件
4.编写测试程序
5.执行测试,出入参数 tianjin beijing hello
执行结果
6.工程代码参考附件
*当数据类型是 Map<String,String>
默认情况下,avpr文件中数据类型是string时,利用avro-maven-plugin生成的数据类型是CharSequence,比如:
默认生成的类文件:
如果我们想在程序中使用String类型时,需要在avro-maven-plugin 中加入<stringType>String</stringType>
此时生成的Java文件
Apache Avro 是一个序列化系统,提供如下功能:
1.丰富的数据结构
2.压缩的、快速的、二进制数据格式
3.存储持久化数据的容器文件
4.RPC功能
5.可以简单实现与动态语言的集成
特点:
Avro在数据读写过程中都利用基于JSON格式的Schemas,因而不用在序列化时对每个数据都要加一个类型等头部信息,从而使序列化保持快而小。并且因为数据加上对应的schema是自描述的,这样也可以促进在动态、脚本语言中的使用。
二、示例
示例参考【https://github.com/phunt/avro-rpc-quickstart】
本示例利用Mail协议简单模拟一个远程服务,Avro将利用这个服务来发送消息
1.编辑avpr协议文件
{"namespace": "example.proto", (1) "protocol": "Mail", (2) "types": [ (3) {"name": "Message", "type": "record", "fields": [ {"name": "to", "type": "string"}, {"name": "from", "type": "string"}, {"name": "body", "type": "string"} ] } ], "messages": { (4) "send": { "request": [{"name": "message", "type": "Message"}], "response": "string" } } }
(1)定义命名空间
(2)定义协议名称
(3)定义类型信息
(4)定义rpc Messages
2.编写pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>example.qs</groupId> <artifactId>avro-rpc-quickstart</artifactId> <packaging>jar</packaging> <version>1.8.1-SNAPSHOT</version> <name>avro-rpc-quickstart</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <compiler-plugin.version>3.5</compiler-plugin.version> <avro.version>1.8.1</avro.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.6.4</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.avro</groupId> <artifactId>avro</artifactId> <version>${avro.version}</version> </dependency> <dependency> <groupId>org.apache.avro</groupId> <artifactId>avro-ipc</artifactId> <version>${avro.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${compiler-plugin.version}</version> </plugin> <plugin> <groupId>org.apache.avro</groupId> <artifactId>avro-maven-plugin</artifactId> <version>${avro.version}</version> <executions> <execution> <id>schemas</id> <phase>generate-sources</phase> <goals> <goal>schema</goal> <goal>protocol</goal> <goal>idl-protocol</goal> </goals> <configuration> <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory> <outputDirectory>${project.basedir}/src/main/java/</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
3.在项目目录下执行 mvn compile ,执行结束后生成 Mail.java 和Message.java文件
4.编写测试程序
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package example; import java.io.IOException; import java.net.InetSocketAddress; import org.apache.avro.ipc.NettyServer; import org.apache.avro.ipc.NettyTransceiver; import org.apache.avro.ipc.Server; import org.apache.avro.ipc.specific.SpecificRequestor; import org.apache.avro.ipc.specific.SpecificResponder; import org.apache.avro.util.Utf8; import example.proto.Mail; import example.proto.Message; /** * Start a server, attach a client, and send a message. */ public class Main { public static class MailImpl implements Mail { // in this simple example just return details of the message 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()); } } private static Server server; private static void startServer() throws IOException { server = new NettyServer(new SpecificResponder(Mail.class, new MailImpl()), new InetSocketAddress(65111)); // the server implements the Mail protocol (MailImpl) } public static void main(String[] args) throws IOException { if (args.length != 3) { System.out.println("Usage: <to> <from> <body>"); System.exit(1); } System.out.println("Starting server"); // usually this would be another app, but for simplicity startServer(); System.out.println("Server started"); NettyTransceiver client = new NettyTransceiver(new InetSocketAddress(65111)); // client code - attach to the server and send a message Mail proxy = (Mail) SpecificRequestor.getClient(Mail.class, client); System.out.println("Client built, got proxy"); // fill in the Message record and send it 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)); // cleanup client.close(); server.close(); } }
5.执行测试,出入参数 tianjin beijing hello
执行结果
Client built, got proxy Calling proxy.send with message: {"to": "tianjin", "from": "beijing", "body": "hello"} Sending message Result: Sending message to tianjin from beijing with body hello
6.工程代码参考附件
*当数据类型是 Map<String,String>
默认情况下,avpr文件中数据类型是string时,利用avro-maven-plugin生成的数据类型是CharSequence,比如:
{"namespace": "example.proto", "protocol": "Mail", "messages": { "send": { "request": [{"name": "jobId", "type": "string"},{"name": "message", "type": {"type":"map","values":"string"}}], "response": "string" } } }
默认生成的类文件:
/** * Autogenerated by Avro * * DO NOT EDIT DIRECTLY */ package example.proto; @SuppressWarnings("all") @org.apache.avro.specific.AvroGenerated public interface Mail { public static final org.apache.avro.Protocol PROTOCOL = org.apache.avro.Protocol.parse("{\"protocol\":\"Mail\",\"namespace\":\"example.proto\",\"types\":[],\"messages\":{\"send\":{\"request\":[{\"name\":\"jobId\",\"type\":\"string\"},{\"name\":\"message\",\"type\":{\"type\":\"map\",\"values\":\"string\"}}],\"response\":\"string\"}}}"); /** */ java.lang.CharSequence send(java.lang.CharSequence jobId, java.util.Map<java.lang.CharSequence,java.lang.CharSequence> message) throws org.apache.avro.AvroRemoteException; @SuppressWarnings("all") public interface Callback extends Mail { public static final org.apache.avro.Protocol PROTOCOL = example.proto.Mail.PROTOCOL; /** * @throws java.io.IOException The async call could not be completed. */ void send(java.lang.CharSequence jobId, java.util.Map<java.lang.CharSequence,java.lang.CharSequence> message, org.apache.avro.ipc.Callback<java.lang.CharSequence> callback) throws java.io.IOException; } }
如果我们想在程序中使用String类型时,需要在avro-maven-plugin 中加入<stringType>String</stringType>
<groupId>org.apache.avro</groupId> <artifactId>avro-maven-plugin</artifactId> <version>${avro.version}</version> <configuration> <stringType>String</stringType> </configuration>
此时生成的Java文件
/** * Autogenerated by Avro * * DO NOT EDIT DIRECTLY */ package example.proto; @SuppressWarnings("all") @org.apache.avro.specific.AvroGenerated public interface Mail { public static final org.apache.avro.Protocol PROTOCOL = org.apache.avro.Protocol.parse("{\"protocol\":\"Mail\",\"namespace\":\"example.proto\",\"types\":[],\"messages\":{\"send\":{\"request\":[{\"name\":\"jobId\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"message\",\"type\":{\"type\":\"map\",\"values\":{\"type\":\"string\",\"avro.java.string\":\"String\"},\"avro.java.string\":\"String\"}}],\"response\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}}}"); /** */ java.lang.String send(java.lang.String jobId, java.util.Map<java.lang.String,java.lang.String> message) throws org.apache.avro.AvroRemoteException; @SuppressWarnings("all") public interface Callback extends Mail { public static final org.apache.avro.Protocol PROTOCOL = example.proto.Mail.PROTOCOL; /** * @throws java.io.IOException The async call could not be completed. */ void send(java.lang.String jobId, java.util.Map<java.lang.String,java.lang.String> message, org.apache.avro.ipc.Callback<java.lang.String> callback) throws java.io.IOException; } }
- avro-rpc-quickstart-master.rar (13.1 KB)
- 下载次数: 1
相关推荐
作者: (在上关注我)概括,如果您愿意的话...介绍该项目中包含的示例应用程序模拟了一个远程服务Mail,其中Avro RPC用于使用该服务发送消息。 本文档详细介绍了如何使用Maven构建和运行示例。 Avro jar文件(以及它们
**Avro RPC简介** Avro是Hadoop生态系统中的一个关键组件..."avro-rpc-quickstart-master"示例项目为开发者提供了学习和实践Avro RPC的起点,通过运行和分析代码,可以深入了解Avro RPC的工作原理和Netty的使用方法。
这个"avro-in-action: RPC与Apache Avro示例"项目显然旨在帮助开发者理解如何在实际应用中利用Avro进行高效的数据交互。在这个项目中,"avro-in-action-master"可能是源代码仓库的主分支,包含了各种示例代码。 ...
一个示例应用程序,展示了如何使用出色的Apache Avro序列化程序以及实际使用的Avro RPC。 Avro RPC使用下面的Avro序列化器,但也允许客户端方法快速便捷地执行RPC等服务器方法。 RPC参数作为Avro序列化对象通过网络...
在讲解如何使用AVRO定义avdl文件示例之前,我们需要先了解什么是AVRO以及AVRO的数据定义语言avdl。AVRO是一种跨语言的序列化框架,用于实现数据序列化以及远程过程调用(RPC)。它是Apache软件基金会旗下的一个项目。...
Apache Avro:trade_mark: 是一个数据序列化系统。 Avro 提供: 丰富的数据结构。 一种紧凑、快速的二进制数据格式。 一个容器文件,用于存储持久数据。 远程过程调用 (RPC)。 与动态语言的简单集成。 代码生成...
4. **Protocol Buffers**:Avro支持远程过程调用(RPC),通过定义协议,不同服务可以相互通信。这使得Avro成为构建分布式系统中的有力工具。 5. **Language Agnostic**:Avro提供了多种编程语言的实现,包括Java、...
**Avro**是一个强大的数据序列化框架,最初由Apache Hadoop项目开发。它不仅支持动态语言,还提供了丰富的数据结构和高效的二进制数据格式。Avro在RPC中主要负责数据的序列化与反序列化,确保跨平台的数据一致性。 ...
Avro的设计哲学注重于简单性、紧凑性以及与动态语言的兼容性,它特别适合于远程过程调用(RPC)和持久化数据存储。Avro数据通常通过网络传输或存储在文件中,因此支持多种编码方式和数据容器格式,使得Avro非常适合...
BaijiSerializer4J 是一个专为 Java 平台设计的序列化库,其设计理念受到了 Apache Avro 和 Apache Thrift 的启发。这两个开源项目都是为了解决跨语言数据交换的问题,提供了高效的序列化和反序列化机制。...
6. **协议(Protocol)**:除了数据模式,Avro还支持服务间的远程过程调用(RPC)。Avro C++库包含了创建和处理Avro协议的能力,允许开发分布式服务。 7. **集成其他库**:Avro C++库可以方便地与其他C++库和框架...
在提供的压缩包文件名称列表中,"test"可能是测试代码或测试数据,"rpc-simple"可能是简单的RPC实现示例,而"rpc"可能是完整的RPC框架源代码。这些文件可以帮助我们进一步理解RPC框架的工作原理和使用方法,但具体的...
- **avrotest.zip** 包含了Apache Avro的相关测试案例或示例代码。Avro是Hadoop生态系统的一部分,提供了一种紧凑、快速、动态的数据交换格式。 - Avro使用JSON来定义数据类型,并提供了序列化和反序列化的API,...
4. **RPC机制**:Thrift提供了一种简单但强大的RPC模型,允许服务间的直接调用。 接下来是Avro,它是Apache Hadoop项目的一部分,由Doug Cutting创建。Avro的主要功能是数据序列化,同时它也支持远程过程调用。Avro...
在"avro/avro-1.9.2/py3"目录下,我们可以期待找到一系列的Python文件,包括Avro的Python API、示例代码、文档以及可能的测试套件。这些文件将帮助开发者理解和使用Avro在Python环境中的功能。 Avro的核心特性包括...
Thrift和Avro是两种广泛使用的数据序列化和远程过程调用(RPC)框架,它们在分布式系统中扮演着重要角色。在这个实例中,我们将深入理解这两种技术,并探讨它们各自的特性和应用场景。 Thrift是由Facebook开发的一...
- 文档更新:提供了更详尽的文档和示例,帮助开发者更好地理解和使用Avro。 在`perl`目录下,表明Avro-1.10.1版本包含了Perl语言的绑定和支持。这通常意味着Perl程序员可以利用这些库来读写Avro数据,进行RPC通信,...
RPC(Remote Procedure Call)是一种...通过分析和运行这个示例项目,你可以深入理解RPC的基本原理,以及在Java环境中如何实现一个简单的RPC框架。同时,这也将有助于你掌握网络编程、序列化、并发处理等相关技能。
4. **RPC支持**:Avro提供了远程过程调用(RPC)框架,允许服务间通过网络高效地交换数据。这种框架简化了服务接口的定义和实现,支持多种编程语言。 5. **集成Hadoop**:由于Avro与Hadoop生态紧密集成,它可以作为...