rpc框架之avro 学习 1 - hello world

简介: avro是hadoop的一个子项目,提供的功能与thrift、Protocol Buffer类似,都支持二进制高效序列化,也自带RPC机制,但是avro使用起来更简单,无需象thrift那样生成目标语言源代码,目前支持的语言有java、c#、php、c++等(详情见:https://cwiki.

avro是hadoop的一个子项目,提供的功能与thrift、Protocol Buffer类似,都支持二进制高效序列化,也自带RPC机制,但是avro使用起来更简单,无需象thrift那样生成目标语言源代码,目前支持的语言有java、c#、php、c++等(详情见:https://cwiki.apache.org/confluence/display/AVRO/Supported+Languages),hadoop生态圈中的hive、pig已经在使用avro

avro-client模块中的pom.xml参考以下内容:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>yjmyzz.avro</groupId>
 8     <artifactId>avro-client</artifactId>
 9     <version>1.0</version>
10 
11     <properties>
12         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
13         <compiler-plugin.version>2.3.2</compiler-plugin.version>
14         <avro.version>1.7.5</avro.version>
15     </properties>
16 
17     <dependencies>
18         <dependency>
19             <groupId>junit</groupId>
20             <artifactId>junit</artifactId>
21             <version>4.10</version>
22             <scope>test</scope>
23         </dependency>
24         <dependency>
25             <groupId>org.slf4j</groupId>
26             <artifactId>slf4j-simple</artifactId>
27             <version>1.6.4</version>
28             <scope>compile</scope>
29         </dependency>
30         <dependency>
31             <groupId>org.apache.avro</groupId>
32             <artifactId>avro</artifactId>
33             <version>${avro.version}</version>
34         </dependency>
35         <dependency>
36             <groupId>org.apache.avro</groupId>
37             <artifactId>avro-ipc</artifactId>
38             <version>${avro.version}</version>
39         </dependency>
40 
41         <dependency>
42             <groupId>yjmyzz.avro</groupId>
43             <artifactId>avro-contract</artifactId>
44             <version>1.0</version>
45         </dependency>
46     </dependencies>
47 
48     <build>
49         <plugins>
50             <plugin>
51                 <groupId>org.apache.maven.plugins</groupId>
52                 <artifactId>maven-compiler-plugin</artifactId>
53                 <version>${compiler-plugin.version}</version>
54             </plugin>
55             <plugin>
56                 <groupId>org.apache.avro</groupId>
57                 <artifactId>avro-maven-plugin</artifactId>
58                 <version>${avro.version}</version>
59                 <executions>
60                     <execution>
61                         <id>schemas</id>
62                         <phase>generate-sources</phase>
63 
64                         <goals>
65                             <goal>schema</goal>
66                             <goal>protocol</goal>
67                             <goal>idl-protocol</goal>
68                         </goals>
69                     </execution>
70                 </executions>
71             </plugin>
72         </plugins>
73     </build>
74 
75 
76 </project>
View Code

一、定义文件示例

Person.avsc

{
  "namespace": "yjmyzz.avro.study.dto",
  "type": "record",
  "name": "Person",
  "fields": [
    {
      "name": "age",
      "type": "int"
    },
    {
      "name": "name",
      "type": "string"
    },
    {
      "name": "sex",
      "type": "boolean"
    },
    {
      "name": "salary",
      "type": "double"
    },
    {
      "name": "childrenCount",
      "type": "int"
    }
  ]
}

QueryParameter.avsc

{
  "namespace": "yjmyzz.avro.study.dto",
  "type": "record",
  "name": "QueryParameter",
  "fields": [
    {
      "name": "ageStart",
      "type": "int"
    },
    {
      "name": "ageEnd",
      "type": "int"
    }
  ]
}

DemoService.avdl

@namespace ("yjmyzz.avro.study.service")
protocol DemoService
{
    import schema "Person.avsc";
    import schema "QueryParameter.avsc";
    string ping();
    array<yjmyzz.avro.study.dto.Person> getPersonList(yjmyzz.avro.study.dto.QueryParameter queryParameter);
}

二、服务端

DemoServiceImpl.java

package yjmyzz.avro.study;

import yjmyzz.avro.study.dto.Person;
import yjmyzz.avro.study.dto.QueryParameter;
import yjmyzz.avro.study.service.DemoService;
import java.util.ArrayList;
import java.util.List;

public class DemoServiceImpl implements DemoService {

    public String ping() {
        System.out.println("ping()");
        return "pong";
    }

    public List<Person> getPersonList(QueryParameter parameter) {
        //System.out.println(parameter.getAgeStart() + " - " + parameter.getAgeEnd());

        List<Person> list = new ArrayList<Person>(10);
        for (int i = 0; i < 10; i++) {
            Person p = new Person();
            p.setAge(i);
            p.setChildrenCount(i);
            p.setName("test" + i);
            p.setSalary(10000D);
            p.setSex(true);
            list.add(p);
        }
        return list;
    }
}

AvroServer.java

package yjmyzz.avro.study;

import org.apache.avro.ipc.NettyServer;
import org.apache.avro.ipc.Server;
import org.apache.avro.ipc.specific.SpecificResponder;
import yjmyzz.avro.study.service.DemoService;

import java.net.InetSocketAddress;

public class AvroServer {

    public static void main(String[] args) {

        System.out.println("Starting avro server...");

        Server server = new NettyServer(new SpecificResponder(DemoService.class,
                new DemoServiceImpl()),
                new InetSocketAddress(65111));
        
        System.out.println("Avro erver started.");
    }
}

三、客户端

AvroClient.java

package yjmyzz.avro.study;

import org.apache.avro.AvroRemoteException;
import org.apache.avro.ipc.NettyTransceiver;
import org.apache.avro.ipc.specific.SpecificRequestor;
import yjmyzz.avro.study.dto.QueryParameter;
import yjmyzz.avro.study.service.DemoService;

import java.net.InetSocketAddress;


public class AvroClient {

    public static void main(String[] args) throws Exception {

        NettyTransceiver client = new NettyTransceiver(new InetSocketAddress(65111));
        DemoService proxy = (DemoService) SpecificRequestor.getClient(DemoService.class, client);

        System.out.println(proxy.ping());

        int max = 100000;

        Long start = System.currentTimeMillis();

        for (int i = 0; i < max; i++) {
            call(proxy);
        }

        Long end = System.currentTimeMillis();

        Long elapse = end - start;

        int perform = Double.valueOf(max / (elapse / 1000d)).intValue();

        System.out.print("avro " + max + " 次RPC调用,耗时:" + elapse + "毫秒,平均" + perform + "次/秒");


        // cleanup
        client.close();
    }

    private static void call(DemoService proxy) throws AvroRemoteException {

        //client.ping();
        //System.out.println("ping()=>" + client.ping());

        QueryParameter parameter = new QueryParameter();
        parameter.setAgeStart(5);
        parameter.setAgeEnd(50);

        proxy.getPersonList(parameter);
        //System.out.println(client.getPersonList(parameter));
    }
}

 avro 100000 次RPC调用,耗时:18617毫秒,平均5371次/秒

注:虽然很多关于thrift、avro的性能评测文章提到avro性能不输于thrift,但就本文的示例而言,在同一台笔记本上,avro的性能只有thrift的约1/2.

附:文中示例代码下载 http://code.taobao.org/svn/avro-rpc-demo/trunk/

参考文章:
https://github.com/phunt/avro-rpc-quickstart

http://avro.apache.org/docs/current/spec.html#Protocol+Declaration

http://avro.apache.org/docs/current/idl.html

http://avro.apache.org/docs/current/gettingstartedjava.html

Apache Avro 与 Thrift 比较

目录
相关文章
|
存储 缓存 Linux
【实战指南】嵌入式RPC框架设计实践:六大核心类构建高效RPC框架
在先前的文章基础上,本文讨论如何通过分层封装提升一个针对嵌入式Linux的RPC框架的易用性。设计包括自动服务注册、高性能通信、泛型序列化和简洁API。框架分为6个关键类:BindingHub、SharedRingBuffer、Parcel、Binder、IBinder和BindInterface。BindingHub负责服务注册,SharedRingBuffer实现高效数据传输,Parcel处理序列化,而Binder和IBinder分别用于服务端和客户端交互。BindInterface提供简单的初始化接口,简化应用集成。测试案例展示了客户端和服务端的交互,验证了RPC功能的有效性。
852 93
|
自然语言处理 负载均衡 API
gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
gRPC 是一种现代开源高性能远程过程调用(RPC)框架,支持多种编程语言,可在任何环境中运行。它通过高效的连接方式,支持负载平衡、跟踪、健康检查和身份验证,适用于微服务架构、移动设备和浏览器客户端连接后端服务等场景。gRPC 使用 Protocol Buffers 作为接口定义语言,支持四种服务方法:一元 RPC、服务器流式处理、客户端流式处理和双向流式处理。
|
Dubbo 网络协议 Java
RPC框架:一文带你搞懂RPC
这篇文章全面介绍了RPC(远程过程调用)的概念、原理和应用场景,解释了RPC如何工作以及为什么在分布式系统中广泛使用,并探讨了几种常用的RPC框架如Thrift、gRPC、Dubbo和Spring Cloud,同时详细阐述了RPC调用流程和实现透明化远程服务调用的关键技术,包括动态代理和消息的编码解码过程。
RPC框架:一文带你搞懂RPC
|
XML 负载均衡 监控
分布式-dubbo-简易版的RPC框架
分布式-dubbo-简易版的RPC框架
|
分布式计算 负载均衡 数据安全/隐私保护
什么是RPC?有哪些RPC框架?
RPC(Remote Procedure Call,远程过程调用)是一种允许运行在一台计算机上的程序调用另一台计算机上子程序的技术。这种技术屏蔽了底层的网络通信细节,使得程序间的远程通信如同本地调用一样简单。RPC机制使得开发者能够构建分布式计算系统,其中不同的组件可以分布在不同的计算机上,但它们之间可以像在同一台机器上一样相互调用。
744 8
|
XML 存储 JSON
(十二)探索高性能通信与RPC框架基石:Json、ProtoBuf、Hessian序列化详解
如今这个分布式风靡的时代,网络通信技术,是每位技术人员必须掌握的技能,因为无论是哪种分布式技术,都离不开心跳、选举、节点感知、数据同步……等机制,而究其根本,这些技术的本质都是网络间的数据交互。正因如此,想要构建一个高性能的分布式组件/系统,不得不思考一个问题:怎么才能让数据传输的速度更快?
1033 1
|
网络协议 Dubbo Java
什么是RPC?RPC和HTTP对比?RPC有什么缺点?市面上常用的RPC框架?
选择合适的RPC框架和通信协议,对于构建高效、稳定的分布式系统至关重要。开发者需要根据自己的业务需求和系统架构,综合考虑各种因素,做出适宜的技术选型。
1775 1
|
负载均衡 Java
使用Java实现RPC框架
使用Java实现RPC框架
|
负载均衡 Java
|
分布式计算 资源调度 网络协议
分布式系统详解--框架(Hadoop--RPC协议)
分布式系统详解--框架(Hadoop--RPC协议)
325 0