调用线程必须为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中,阴影可以定义为“在渲染器支持的情况下,有一个可以产生阴影的光,照射在若干个可以产生阴影的物体上,并在某个可以接受阴影的物体上产生阴影”。所以,要产生阴影,渲染器、光、物体,接…

shell总结(0基础入门)

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

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

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

github基本使用教程

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

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应用程序 抛出和处理的非严重错误.非严重错误又分为…

DOM Element对象的offsetXXX方法

原生js的offset***方法 c.offsetLeft 和 c.offsetTop 一般指当前元素的CSS边框相对于其offsetParent的X和Y坐标c.offsetHeight 和 c.offsetWidth 当前元素及其所有内容的高度&#xff0c;宽度。c.offsetParent 大多数元素都的都是指<body> 参考《javascript权威指南 第六…

出现一个黑色框按不动_创意 | 这才是走心的衣架设计,给衣服一个高逼格的家!...

12月&#xff0c;来到了年底剁手的时节自己新买的秋冬衣服&#xff0c;加上以前的衣服几乎都要把你的衣橱给撑爆了只恨衣架不够用&#xff0c;够用也没有空间可以挂衣服了也许以前的衣架只是为了挂衣服&#xff0c;让空间变得整洁一些&#xff1b;现如今&#xff0c;衣架从样式…

windows搜索工具_加快搞定并替代 Windows 10 搜索框搜索文件速度的免费小工具

毫无疑问&#xff0c;Everything 搜索是 Windows 操作系统上可用的最快的搜索工具之一。它比内置的 Windows 搜索工具快得多&#xff0c;因为它几乎立即返回结果&#xff0c;并支持许多自定义选项以优化搜索。而今天大眼仔要给大家分享的是可以把 Everything 固定的任务栏上的免…

excel线性拟合的斜率_协方差分析:方差分析与线性回归的统一

转自个人微信公众号【Memo_Cleon】的统计学习笔记&#xff1a;协方差分析&#xff1a;方差分析与线性回归的统一。在进行数据分析时&#xff0c;有时候我们会遇到数据基线不平的情况&#xff0c;比如两样本的t检验的示例&#xff0c;比较Labe和Meto用药13周的降压效果&#xff…

状态模式和策略模式的区别

区别主要体现在行为上&#xff0c;而不是结构上&#xff0c;所以&#xff0c;看时序图就能很好的看出两者的区别。 状态模式 看1.4&#xff0c;状态B是状态A创建的&#xff0c;也就是由系统本身控制的。调用者不能直接指定或改变系统的状态转移 所以&#xff0c;状态是系统自…

如何截获打印机文件_打印、复印还不会,如何在办公室里混?全程详细教学

我们在职场中&#xff0c;经常需要用到打印机&#xff0c;相信很多人都还不会打印、复印文件&#xff0c;求人不如求己&#xff0c;今天就来详细教学&#xff0c;一起来学习吧。如何使用打印机&#xff1f;首先用一根电源线和一根USB线&#xff0c;将电脑主机与打印机连接&…

外观模式案例分析

策划案 要实现选中和未选中功能&#xff1a; 未选中状态&#xff1a;点击图形进入选中状态 选中状态&#xff1a;点击<按钮进入未选中状态 实现代码 请问这是什么模式&#xff1f; import TransformController from ./TransformController //操作框控制器类 import To…

input ios问题 小程序_小程序可以解决哪些问题??

小程序是近几年移动互联网领域的热点&#xff0c;随着移动互联网在消费端逐渐进入到了存量时代&#xff0c;小程序成为了互联网平台向各个领域垂直发展的重要策略&#xff0c;而广大的中小创业者要想充分利用大型互联网平台的流量资源&#xff0c;小程序也是一个非常重要的渠道…

sprintf函数_三分钟学 Go 语言——函数深度解析(下) 可变参数

接连两篇函数专题深度解析&#xff0c;相信大家已经对函数的语法有了深入的了解。函数简单使用和基本知识解析匿名函数和闭包五一放假期间&#xff0c;我懂得&#xff0c;估计你们都不想学习。小熊这两天因为个人种种令人难受的原因&#xff0c;没有能更新&#xff0c;也没有提…

手工画设计模式的类图

画图成果 面试常考设计模式&#xff0c;往往需要动手画类图。之前面试的时候碰到画类图&#xff0c;往往直奔主题&#xff0c;立即开始画&#xff0c;往往画得很乱。其实面试是一个过程&#xff0c;看中的是思考分析解决问题的过程&#xff0c;结果反而不那么重要。画设计模式…

Reason: image not found

刚生的Xcode8&#xff0c;出现好多Error&#xff0c;有些Error真的太麻烦不想记录&#xff0c;现在这个挺简单的&#xff0c;就记下来&#xff0c;控制台输出的Error信息如下&#xff1a; fix&#xff1a; Target -> Build Phases ->Link Binary With Libraries&#xff…

怎么查看usb读取信息_电脑弹出USB设备时提示该设备正在使用中的解决方法

转载的文章&#xff0c;原文&#xff1a;电脑弹出USB设备时提示该设备正在使用中的解决方法&#xff0d;系统城​www.xitongcheng.com电脑弹出USB设备时提示该设备正在使用&#xff0c;虽然在正常显示时并没有程序在使用&#xff0c;但是确实会出现这种情况&#xff0c;实际上确…