热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Avro实现RPC

RPC是什么?RPC是指远程过程调用【是一种进程间的通信方式】例如两台服务器A,B,一个应用部署在A上面,A想要调B服务器上的函数或者方法,由于不在一个内存空间,不能直接调用,需要
RPC是什么?
  • RPC是指远程过程调用【是一种进程间的通信方式】
  • 例如两台服务器A,B,一个应用部署在A上面,A想要调B服务器上的函数或者方法,由于不在一个内存空间,不能直接调用,需要通过网络来传达调用的数据
RPC的特点?
  • 简单:语义清晰简单,建立分布式计算更加容易
  • 高效:远程调用简单高效
  • 通用:RPC把远程调用做的和本地调用完全类似,那么就容易被接受,使用起来也没有障碍
RPC架构?

1)用户(User)

2)用户存根(User-Stub)

3)RPC通信包(被称为RPCRuntime)

4)服务器存根(Server)

5)服务器(Server)

技术图片

 当用户发起一个远程CALL的时候,远程如下:

  1. 服务消费方(User)调用以本地方式调用服务;
  2. User-stub(存根)接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体,并交给RPCRuntime模块
  3. RPCRuntime找到服务地址,并将消息发送到服务端
  4. 服务端的RPCRuntime收到消息后,传给Server-stub
  5. Server-stub根据解码结果调用本地的服务
  6. 本地服务执行并将结果返回给Server-stub
  7. server stub将返回结果打包成消息并发送至消费方
  8. client stub接收到消息,并进行解码
  9. 服务消费方得到最终结果
实现步骤

1.创建maven工程,导入pom依赖

xml version="1.0" encoding="UTF-8"?>

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0modelVersion>

  <groupId>com.blbgroupId>
  <artifactId>Avro_RPCartifactId>
  <version>1.0-SNAPSHOTversion>

  <name>Avro_RPCname>
  
  <url>http://www.example.comurl>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <maven.compiler.source>1.7maven.compiler.source>
    <maven.compiler.target>1.7maven.compiler.target>
  properties>

  <dependencies>
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.11version>
      <scope>testscope>
    dependency>
    
    <dependency>
      <groupId>org.apache.avrogroupId>
      <artifactId>avroartifactId>
      <version>1.8.2version>
    dependency>
    
    <dependency>
      <groupId>org.apache.avrogroupId>
      <artifactId>avro-toolsartifactId>
      <version>1.8.2version>
    dependency>
    <dependency>
      <groupId>org.apache.avrogroupId>
      <artifactId>avro-maven-pluginartifactId>
      <version>1.8.2version>
    dependency>
    <dependency>
      <groupId>org.apache.avrogroupId>
      <artifactId>avro-compilerartifactId>
      <version>1.8.2version>
    dependency>
    <dependency>
      <groupId>org.apache.avrogroupId>
      <artifactId>avro-ipcartifactId>
      <version>1.8.2version>
    dependency>
  dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.avrogroupId>
        <artifactId>avro-maven-pluginartifactId>
        <version>1.8.2version>
        <executions>
          <execution>
            <phase>generate-sourcesphase>
            <goals>
              <goal>schemagoal>
            goals>
            <configuration>
              <sourceDirectory>${project.basedir}/src/main/avro/sourceDirectory>
              <outputDirectory>${project.basedir}/src/main/java/outputDirectory>
            configuration>
          execution>
        executions>
      plugin>
      <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-compiler-pluginartifactId>
        <configuration>
          <source>1.8source>
          <target>1.8target>
        configuration>
      plugin>
    plugins>
    <pluginManagement>
      <plugins>
        
        <plugin>
          <artifactId>maven-clean-pluginartifactId>
          <version>3.1.0version>
        plugin>
        
        <plugin>
          <artifactId>maven-resources-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-compiler-pluginartifactId>
          <version>3.8.0version>
        plugin>
        <plugin>
          <artifactId>maven-surefire-pluginartifactId>
          <version>2.22.1version>
        plugin>
        <plugin>
          <artifactId>maven-jar-pluginartifactId>
          <version>3.0.2version>
        plugin>
        <plugin>
          <artifactId>maven-install-pluginartifactId>
          <version>2.5.2version>
        plugin>
        <plugin>
          <artifactId>maven-deploy-pluginartifactId>
          <version>2.8.2version>
        plugin>
        
        <plugin>
          <artifactId>maven-site-pluginartifactId>
          <version>3.7.1version>
        plugin>
        <plugin>
          <artifactId>maven-project-info-reports-pluginartifactId>
          <version>3.0.0version>
        plugin>
      plugins>
    pluginManagement>
  build>
project>

2.在指定目录下编辑acdl文件

a. 如果传递的是基本类型,则示例格式如下:

@namespace("rpc.service")
protocol AddService{
int add(int i,int y);
}

b. 如果传递的是对象,则示例格式如下:

@namespace("rpc.service")
protocol TransferService{
import schema "User.avsc";
void parseUser(avro.domain.User user);
}

c. 如果传递的是map,并且map中包含对象,则示例格式如下:

@namespace("rpc.service")
protocol MapService{
import schema "User.avsc";
void parseUserMap(map userMap);
}

d.这个是我们的User.avdl文件

@namespace("com.service")
protocol AddService{
import schema "user.avsc";
int add(int x , int y);
void parseUser(com.domain.User user);
}

3.根据avro插件生成文件对应的接口类

技术图片

 技术图片

4.实现服务器端接口

package com.blb.service;

import com.blb.pojo.User;
import org.apache.avro.AvroRemoteException;

public class AddServiceImpl implements AddService {
    @Override
    public int add(int x, int y) throws AvroRemoteException {
        System.out.println(x+y);
        return x+y;
    }

    @Override
    public Void parseUser(User user) throws AvroRemoteException {
        System.out.println(user);
        return null;
    }
}

5.实现服务器端

package com.blb.server;

import com.blb.service.AddService;
import com.blb.service.AddServiceImpl;
import org.apache.avro.ipc.NettyServer;
import org.apache.avro.ipc.specific.SpecificResponder;

import java.net.InetSocketAddress;

public class RPC_Server {

    public static void main(String[] args) {
        NettyServer server = new NettyServer(
                new SpecificResponder(AddService.class,new AddServiceImpl()),
                new InetSocketAddress(9999)
        );
        System.out.println("服务端启动");
    }
}

6.实现客户端

package com.blb.client;

import com.blb.service.AddService;
import org.apache.avro.ipc.NettyTransceiver;
import org.apache.avro.ipc.specific.SpecificRequestor;

import java.io.IOException;
import java.net.InetSocketAddress;

public class RPC_Client {

    public static void main(String[] args) throws IOException {
        NettyTransceiver client = new NettyTransceiver(
                new InetSocketAddress("127.0.0.1",9999)
        );
        //--因为接口不能直接使用,avro底层是通过jdk动态代理生成接口的代理对象
        AddService proxy = SpecificRequestor.getClient(AddService.class,client);
        int result = proxy.add(2,3);
        System.out.println("客户端收到结果:"+result);
    }

}

7.运行结果

技术图片 技术图片

Avro实现RPC


推荐阅读
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
author-avatar
蜜爱女_201
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有