RPC和RestFul
什么是REST
- REST是一种架构风格,指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。
REST规范把所有内容都视为资源,网络上一切皆资源。- REST并没有创造新的技术,组件或服务,只是使用Web的现有特征和能力。
可以完全通过HTTP协议实现,使用 HTTP 协议处理数据通信。
REST架构对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
什么是RPC
- 远程方法调用,就是像调用本地方法一样调用远程方法.
- RPC框架要做到的最基本的三件事:
- 、服务端如何确定客户端要调用的函数;
- 在远程调用中,客户端和服务端分别维护一个【ID->函数】的对应表, ID在所有进程中都是唯一确定的。
客户端在做远程过程调用时,附上这个ID,服务端通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。- 、如何进行序列化和反序列化;
- 客户端和服务端交互时将参数或结果转化为字节流在网络中传输,那么数据转化为字节流的或者将字节流转换成能读取
的固定格式时就需要进行序列化和反序列化,序列化和反序列化的速度也会影响远程调用的效率。- 、如何进行网络传输(选择何种网络协议);
- 多数RPC框架选择TCP作为传输协议,也有部分选择HTTP。如gRPC使用HTTP2。不同的协议各有利弊。TCP更加高效,
而HTTP在实际应用中更加的灵活。
RPC简单案例实现
创建client
- package com.hadoop.hdfs.rpc2.client;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.lang.reflect.Proxy;
- import java.net.InetSocketAddress;
- import java.net.Socket;
- import java.util.Scanner;
- public class Client<T> {
- public T getClass(Class<?> clazz, InetSocketAddress address) {
- T t = (T) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
- new Class<?>[]{clazz.getInterfaces()[]}, (proxy, method, args) -> {
- Socket socket = new Socket();
- socket.connect(address);
- try (
- ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
- ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
- ) {
- objectOutputStream.writeUTF(clazz.getName());
- objectOutputStream.writeUTF(method.getName());
- objectOutputStream.writeObject(method.getParameterTypes());
- objectOutputStream.writeObject(args);
- return objectInputStream.readObject();
- }finally {
- if (socket!=null){
- socket.close();
- }
- }
- });
- return t;
- }
- }
创建server
- package com.hadoop.hdfs.rpc2.server;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.lang.reflect.Method;
- import java.net.InetSocketAddress;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.concurrent.Executor;
- import java.util.concurrent.Executors;
- public class Server {
- //线程池
- static Executor executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
- public static void exporter(String host, int port) throws IOException {
- try (ServerSocket serverSocket = new ServerSocket();) {
- serverSocket.bind(new InetSocketAddress(host, port));
- //不断监听
- while (true) {
- executor.execute(new Task(serverSocket.accept()));
- }
- }
- }
- private static class Task implements Runnable {
- Socket client = null;
- public Task(Socket client) {
- this.client = client;
- }
- @Override
- public void run() {
- try (
- ObjectInputStream objectInputStream = new ObjectInputStream(client.getInputStream());
- ObjectOutputStream objectOutputStream = new ObjectOutputStream(client.getOutputStream());
- ) {
- String interfaceName = objectInputStream.readUTF();
- Class servce = Class.forName(interfaceName);
- String methodName = objectInputStream.readUTF();
- Class<?>[] parameterTypes = (Class<?>[]) objectInputStream.readObject();
- Object[] arguments = (Object[]) objectInputStream.readObject();
- Method method = servce.getMethod(methodName, parameterTypes);
- Object obj = method.invoke(servce.newInstance(), arguments);
- objectOutputStream.writeObject(obj);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
创建调用的接口和实现类
- package com.hadoop.hdfs.rpc2.server;
- public interface Method {
- public void method1();
- }
- package com.hadoop.hdfs.rpc2.server;
- public class MethodImpl implements Method {
- @Override
- public void method1() {
- System.out.println("method1");
- }
- }
创建测试类
- package com.hadoop.hdfs.rpc2.client;
- import com.hadoop.hdfs.rpc2.server.Method;
- import com.hadoop.hdfs.rpc2.server.MethodImpl;
- import com.hadoop.hdfs.rpc2.server.Server;
- import java.io.IOException;
- import java.net.InetSocketAddress;
- public class Test {
- public static void main(String[] args) {
- //服务器
- new Thread(() -> {
- try {
- Server.exporter("localhost",);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }).start();
- //客户端
- new Thread(() -> {
- Client<Method> import1 = new Client();
- Method method = import1.getClass(MethodImpl.class,new InetSocketAddress("localhost",));
- method.method1();
- }).start();
- }
- }
RPC和RestFul的更多相关文章
- RPC vs RESTful
在微服务中,使用什么协议来构建服务体系,一直是个热门话题. 争论的焦点集中在两个候选技术: (binary) RPC or Restful. 以Apache Thrift为代表的二进制RPC,支持多种 ...
- 33.服务之间的调用之RPC、Restful深入理解
33.服务之间的调用之RPC.Restful深入理解 2018年05月08日 01:52:42 郑学炜 阅读数 13577更多 分类专栏: 6.框架 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- RPC的解释以及RPC和Restful、RPC和RMI的区别
如何科学的解释RPC 说起RPC,就不能不提到分布式,这个促使RPC诞生的领域. 假设你有一个计算器接口,Calculator,以及它的实现类CalculatorImpl,那么在系统还是单体应用时,你 ...
- RESTful源码学习笔记之RPC和 RESTful 什么区别
REST,即Representational State Transfer的缩写.翻译过来是表现层状态转换.如果一个架构符合REST原则,就称它为RESTful架构.啥叫json-rpc?接口调用通常 ...
- RESTful源码学习笔记之RPC和Restful深入理解
以下资料搜集自网络 0x00 RPC RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法).通常的实现 ...
- RPC、HTTP、RESTful
RESTful RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义.RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT ...
- 【转载】RESTful 架构风格概述
本文转载自https://blog.igevin.info/posts/restful-architecture-in-general/ 在移动互联网的大潮下,随着docker等技术的兴起,『微服务』 ...
- springboot+cloud 学习(二)应用间通信Feign(伪RPC,实则HTTP)
在微服务中,使用什么协议来构建服务体系,一直是个热门话题. 争论的焦点集中在两个候选技术: RPC or Restful Restful架构是基于Http应用层协议的产物,RPC架构是基于TCP传输 ...
- 不懂RPC实现原理怎能实现架构梦
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...
随机推荐
- asp.net大附件上传,支持断点续传
以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传 ...
- Mscordacwks.dll/SOS.dll 调试归档
找到个好东西 为什么要归档 此存档提供帮助,并可能提供对以下问题的答案 是否可以使WinDBG在符号存储中找到mscordacwks.dll?, Windbg需要不同版本的mscordacwks.dl ...
- PKUWC2019 Round 2 没去祭
因为今年有两场 PKUWC,所以叫 PKUWC2019 Round 2. 因为一些沙雕原因,今年去不了了. Day 0 一如既往,没有集训就去上数学课,今天讲几何变换,一如既往的只会说"少女 ...
- 微信小程序搜索框代码组件
search.wxml <view class="header"> <view class="search"> <icon typ ...
- koa art-template模板引擎的使用
art-template 模板引擎介绍 art-template 是一个简约.超快的模板引擎. 它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限的运行 性能,并且同 ...
- HTTP/1.0和HTTP/1.1 http2.0的区别,HTTP怎么处理长连接(阿里)
HTTP1.0 HTTP 1.1主要区别 长连接 HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接. HTTP是基于TCP/IP协议的,创 ...
- 刷题记录:[De1ctf] shell shell shell
目录 刷题记录:[De1ctf] shell shell shell 一.知识点 1.源码泄露 2.正则表达式不完善导致sql注入 3.soapclient反序列化->ssrf 4.扫描内网 5 ...
- 【自学Spring Boot】什么是Spring Boot
为啥要有Spring Boot? 以前大学刚开始学java web的时候,需要搭建起web框架,当时使用的是SSH(struts+spring+hibernate),那就开始搭建吧,初学者哪里知道整套 ...
- modao账户
chairman987@163.com 墨刀注册 p@ssw0rd OR 123456
- 第10组 Beta冲刺(2/5)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 新增修改用户信息.任务完成反馈等功能API 服务器后端部署,API接口的bet ...