调用线程必须为sta_Java手写分布式系统远程调用RPC框架

一、RPC简介

最近看hadoop底层通信,都是通过RPC实现的。

RPC(Remote Procedure Call Protocol)远程调用: 远程过程调用是一种常用的分布式网络通信协议,它允许运行于 一台计算机的程序调用另一台计算机的子程序,同时将网络的通信细节隐藏起来, 使得用户无须额外地为这个交互作用编程。分布式系统之间的通信大都通过RPC实现

二、RPC请求过程

f7377f85b55bf0547e5bb86824f7ca6e.png
  1. client发起服务调用请求
  2. client stub代理程序将调用的方法,参数按照一定格式封装,通过服务方的地址,发起网络请求
  3. 消息通过网络发送到服务端,server stub接收到消息,进行解包,反射调用本地对应的服务
  4. 本地服务执行将结果返回给server stub,然后server stub会将结果消息打包返回到客户端
  5. client stub接收消息解码,得到最终结果.

三、RPC框架架构

要写一个RPC框架,需要哪些组成部分?

  1. 序列化方式。序列化主要作用是将结构化对象转为字节流以便于通过网络进行传输或写入持久存储。
  2. 远程代理对象,一般使用jdk动态代理或者cglib代理
  3. 服务暴露 设置注册中心Zookeeper
  4. 网络通信,基于事件驱动的Reactor模式

四、RPC框架示例

  1. 服务提供者,运行在服务器端,提供服务接口定义与服务实现类
  2. 服务发布者,运行在服务器端,负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用
  3. 服务消费者,运行在客户端,通过远程代理对象调用远程服务

服务端代码

服务接口:

//计算学生年龄和的接口public interface CalculateService { String cal(Student sta, Student stb);}public class CalculateServiceImpl implements CalculateService { @Override public String cal(Student sta, Student stb) { return "学生年龄之和:" + (sta.getAge() + stb.getAge()); }}

服务发布

public class PublishUtilI { //服务接口集合 private static List serviceList; private static ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,10, TimeUnit.SECONDS, new LinkedBlockingQueue(10)); public static void publish(int port,Object... services) throws IOException { serviceList= Arrays.asList(services); ServerSocket server = new ServerSocket(port); Socket client; while (true) { //阻塞等待请求 client = server.accept(); //使用线程池处理请求 executor.submit(new ServerHandler(client, serviceList)); } }}

反射调用服务

  1. 读取客户端发送的服务名
  2. 判断服务是否发布
  3. 如果发布,反射调用服务端对应服务
  4. 返回结果给客户端
public class ServerHandler implements Runnable { private Socket client = null; private List serviceList = null; public ServerHandler(Socket client, List service) { this.client = client; this.serviceList = service; } @Override public void run() { try ( ObjectInputStream input = new ObjectInputStream(client.getInputStream()); ObjectOutputStream output = new ObjectOutputStream(client.getOutputStream()) ) { // 读取客户端要访问那个service Class serviceClass = (Class) input.readObject(); // 找到该服务类 Object obj = findService(serviceClass); if (obj == null) { output.writeObject(serviceClass.getName() + "服务未发现"); } else { //利用反射调用该方法,返回结果 String methodName = input.readUTF(); //读取UTF编码的String字符串 //读取参数类型 Class>[] parameterTypes = (Class>[]) input.readObject(); //读取参数 Object[] arguments = (Object[]) input.readObject(); Method method = obj.getClass().getMethod(methodName, parameterTypes); //反射执行方法 Object result = method.invoke(obj, arguments); output.writeObject(result); } } catch (Exception e) { e.printStackTrace(); } } private Object findService(Class serviceClass) { for (Object obj : serviceList) { boolean isFather = serviceClass.isAssignableFrom(obj.getClass()); if (isFather) { return obj; } } return null; }}

客户端代码

public class Client { public static void main(String[] args) { CallProxyHandler handler = new CallProxyHandler("127.0.0.1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThreeJS阴影

在threejs中,阴影可以定义为“在渲染器支持的情况下,有一个可以产生阴影的光,照射在若干个可以产生阴影的物体上,并在某个可以接受阴影的物体上产生阴影”。所以,要产生阴影,渲染器、光、物体,接…

python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...

Python 2.x中的字符编码,设计的的确不好,导致初学者,甚至是即使用Python很长时间的人,都会经常遇到字符编解码方面的错误。下面就把一些常见情,尽量的都整理出来,并给出相应的解决办法。看此文之前Python中…

shell总结(0基础入门)

一、简介 shell是用户和操作系统交互的命令行解释器。 shell有很多种: bash、csh、sh、ksh、、、 我们等了linux时看到的命令行就是一个bash。 二、第一个脚本: [rootlinux1 script]# vim first.sh #!/bin/bash#auther:xiaofan#time:2016.10.4#井号是注…

使用webpack打包ES6代码

安装nodejs 根目录下运行 npm init根据提示输入项目相关信息,然后运行: npm install 安装webpack 在项目根目录下运行 npm install webpack --save-dev 安装babel loader 和 转码规则 在根目运行命令: npm install babel-loader --sa…

c语言代码可以python运行吗_c语言如何运行python脚本

目前的C/C与python的混合编程分为两大类:1、使用python调用c/c编写的扩展库,扩展python的功能,我们暂且称为python调用c/c2、使用c/c程序调用执行python中定义的函数等,我们暂且称为c/c调用python本文只针对c/c调用执行python作一…

十万个为什么 —— 为什么一个数的 0 次方只能是 1

1. 幂的排列 212,224,238 ⇒ 20?,2−112 2012. 指数乘法运算 对于所有的实数 x,y,ax⋅ayaxy 因此: 当 y0 时,ax⋅a0ax ⇒ a01当 y−x 时,ax⋅a−xa0 ⇒ a01转载于:https://www.cnblogs.com/mtcnn/p/9423448.html

Threejs性能监视和可视化控制

概述 性能监视是监视threejs运行中的刷新频率,要使用到threejs提供的stat.js,可视化控制是在窗口中显示一个可见的控制框,可以通过鼠标改变其中的值,达到改变threejs对象参数的目的,需要使用到dat.gui.js 性能监视 …

python autoit上传文件_结合python+selenium使用AutoIt V3实现文件、图片上传

1.下载、安装AutoIt V3下载官网:https://www.autoitscript.com/site/autoit/downloads/2.AutoIt V3组件介绍AutoIt Windows Info 或者Au3Info_x64.exe 用于帮助我们识别Windows控件信息。Compile Script to.exe 或者Aut2exe_x64.exe 用于将AutoIt生成 exe …

百度贴吧的数据抓取和分析(一):指定条目帖子信息抓取

这个教程使用BeautifulSoup库爬取指定贴吧的帖子信息。 本教程的代码托管于github: https://github.com/w392807287/spider_baidu_bar 数据分析部分请移步: python版本:3.5.2 使用BeautifulSoup库获取网页信息 引入相关库: from bs4 import …

在ES6类中绑定事件

概述 ES6提供了类,给模块化带来了很大的帮助。在类里面绑定事件,一来是为了使得代码结构清晰,二来是为了可以使用类的变量和方法。但是,由于事件的回调函数并不是由类的实例对象触发,所以,事件回调函数里面…

DevExpress.Utils.ToolTipLocation

private void textBox1_TextChanged(object sender, EventArgs e){if ((sender as TextBox).Text.Length 0){DevExpress.Utils.ToolTipLocation tipLocation new DevExpress.Utils.ToolTipLocation();toolTipController1.ShowHint("不能为空", textBox1, ToolTipLo…

github基本使用教程

2017-10-22 更新 目前已经有一个很好的Github教程—— Git it,可以花半个小时比较全面的了解github的使用,直接在relaese里下载一个最新版,双击运行就可以看到教程了。下面的教程也还可使用。 如果不熟悉 git命令,可以使用 learngitbranchi…

python while九九乘法表儿歌_python使用while循环实现九九乘法表

protocol http not supported or disabled in libcurl apt-getubuntu 14.04 碰到了这个莫名其妙的问题.谷歌了一把,解决方案如下:http://askubuntu.com/questions/683857/curl-1-protocol-https-n ...linux基础-基本命令的讲解(1-7单元)基本命令的讲解 主要内容介绍 1…

EF+postgresql中的一些问题

需要基于MVC的WebAPI搭建一个服务接口,数据存储在postgresql数据库,在使用的过程中遇到了很多问题。做一下记录: (1) System.IO.FileLoadException: 未能加载文件或程序集“Npgsql, Version3.1.2.0, Cultureneutral, P…

Navicat Error 2003 - can't connect to mysql server 'localhost' (10061)

项详细出错对象:Navicat for mysql出错信息:2003 - can’t connect to mysql server ‘localhost’ (10061)出错原因:mysql 服务器没有启动解决办法:去mysql的安装目录下找到“\bin\mysqld.exe”,双击运行!…

▲数据结构 笛卡尔树【2011】五2 C++版

转载于:https://www.cnblogs.com/qilinart/articles/5940726.html

运行时异常与一般异常有何异同_Java修行第015天,异常机制和常用类

1. 异常概念_分类1) 什么叫异常?答:异常(Expection)就是在程序运行过程中所发生的不正常的事件,它会中断正在运行的程序2) 请简述异常的分类?答:异常分为Error(仅靠程序本身无法恢复的严重错误)和由Java应用程序 抛出和处理的非严重错误.非严重错误又分为…

js 自定义事件

自定义事件很难派上用场? 为什么自定义事件很难派上用场,因为以前js不是模块化开发,也很少协作。因为事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到…

uWSGI安装配置

uWSGI安装配置官方网站:http://uwsgi-docs.readthedocs.io环境:CentOS 7.2python-2.7.5一.安装yum -y install gcc gcc-c python-develcurl -sSL https://projects.unbit.it/downloads/uwsgi-2.0.14.tar.gz |tar -xvf - --gzipcd uwsgi-2.0.14make -j4################# uWSGI …

python日志输出 超量 停止_linux 内存分配参数导致的 buffer_pool 分配不出来的问题排查...

linux 内存分配参数导致的 buffer_pool 分配不出来的问题排查:参考:http://blog.csdn.net/jollyjumper/article/details/24127009原文:http://www.cnblogs.com/gomysql/p/6130405.htmlvm.overcommit_memory默认值为:0从内核文档里…