GithubHelp home page GithubHelp logo

magicbill / avro-rpc-quickstart Goto Github PK

View Code? Open in Web Editor NEW

This project forked from phunt/avro-rpc-quickstart

0.0 2.0 0.0 353 KB

Apache Avro RPC Quick Start. Avro is a subproject of Apache Hadoop.

Home Page: http://hadoop.apache.org/avro/

License: Apache License 2.0

avro-rpc-quickstart's Introduction

Author: Patrick Hunt (follow me on twitter)

Summary

This is a starter kit, a project template if you will, for Apache Avro intended to bootstrap your Avro based project. You’ll learn how to declare a protocol, generate and compile your code, and run a working “Hello World” type example.

What’s Apache Avro?

From the official site: “Avro is a data serialization system”

Avro provides:

  • Rich data structures.
  • A compact, fast, binary data format.
  • A container file, to store persistent data.
  • Remote procedure call (RPC).
  • Simple integration with dynamic languages. Code generation is not required to read or write data files nor to use or implement RPC protocols. Code generation as an optional optimization, only worth implementing for statically typed languages.

License

This project is licensed under the Apache License Version 2.0

Introduction

The sample application included in this project simulates a remote service, Mail, where Avro RPC is used to send a message using the service. This document details how to build and run the sample using Maven. The Avro jar files (and jars they depend upon) will be downloaded automatically.

In this sample project you will find four sets of files:

  1. This documentation
  2. Sample Avro protocol declaration
  3. Java quick start
    • Maven build file
    • Sample application – i.e. Main program
  4. Python quick start
    • Sample application – i.e. client/server scripts
  5. Ruby quick start
    • Sample application – i.e. client/server scripts

mail.avpr – Avro Protocol Declaration

Notice that all examples (java, python, and ruby) share the same Avro protocol declaration. I’ve not demonstrated it here, but the implmentations are interoperable – the java client can talk to the python server and vice-versa. (which I’ll leave as an exercise for the reader)

src/main/avro should contain all of the Avro protocol & schema specifications. mail.avpr declares our simple “Mail” service. You will see:

  1. the name & namespace of the protocol
  2. any specialized types used in the messages, Message in this case
  3. we are declaring a “send” message type which takes a Message as an argument and returns a result string

Read more about Avro’s protocol declaration

Current supported quickstart implementations

  • Java
  • Python
  • Ruby

Each of these implementions is detailed below:

Java

Requirements

  • Maven

Java Maven build file

  • pom.xml – this file specifies the dependencies of the project, primarily Avro itself.

You’ll see the plugin section, which contains:

This plugin element causes the Avro Maven Plugin’s compile goal to run during the “generate-sources” maven phase.

            <plugin>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro-maven-plugin</artifactId>
                <version>1.7.5</version>
                <executions>
                    <execution>
                        <id>schemas</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>schema</goal>
                            <goal>protocol</goal>
                            <goal>idl-protocol</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

Main.java – the main() routine of the Java Mail sample

src/main/java/example/Main.java

  1. the MailImpl class implements the Mail protocol defined in mail.avpr
  2. the startServer() method starts the server which implements the Mail service (Mail/MailImpl)
  3. the main function takes three arguments; to, from and body of the message. After the server is started a Mail client is created, attached to the service, and used to send a “Message”, the result of the RPC call is printed to the console.

Compiling the Java sample

All generated files (source, class, etc…) are written to the “target” directory.

mvn compile

Note: integration with eclipse is very simple. Just type “mvn eclipse:eclipse” (see the maven-eclipse-plugin documentation for more details).

Running the Java sample

mvn -e exec:java -Dexec.mainClass=example.Main -Dexec.args='avro_user pat Hello_World'

Python

Requirements

Avro is available from pypi

It seems that the Avro python egg requires snappy.

sudo apt-get install libsnappy-dev sudo pip install python-snappy sudo pip install avro

Python – start_server.py

Run this first to start the python avro Mail server.

  1. the MailResponder class implements the Mail protocol defined in mail.avpr
  2. main starts the server which implements the Mail service (Mail/MailResponder)

Python – send_message.py

You’ll see that the structure of the python code is similar to the java/ruby source.

src/main/python/send_message.py

  1. the main function takes three arguments; to, from and body of the message. After the server is started a Mail client is created, attached to the service, and used to send a “Message”, the result of the RPC call is printed to the console.

Run the python

From the src/main/python directory run:

./start_server.py

then in a separate shell run:

./send_message.py avro_user pat Hello_World

Ruby

Requirements

Install the avro ruby gem

sudo gem install avro

Ruby – sample_ipc_server.rb

Run this first to start the ruby avro Mail server.

  1. the MailResponder class implements the Mail protocol defined in mail.avpr
  2. main starts the server which implements the Mail service (Mail/MailResponder)

Ruby – sample_ipc_client.rb

You’ll see that the structure of the ruby code is similar to the java/python source.

src/main/ruby/sample_ipc_client.rb

  1. the main function takes three arguments; to, from and body of the message. After the server is started a Mail client is created, attached to the service, and used to send a “Message”, the result of the RPC call is printed to the console.

Run the ruby

From the src/main/ruby directory run:

ruby -r 'rubygems' ./sample_ipc_server.rb

then in a separate shell run:

ruby -r 'rubygems' ./sample_ipc_client.rb avro_user pat Hello_World

avro-rpc-quickstart's People

Contributors

phunt avatar spullara avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.