什么是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的更多相关文章

  1. RPC vs RESTful

    在微服务中,使用什么协议来构建服务体系,一直是个热门话题. 争论的焦点集中在两个候选技术: (binary) RPC or Restful. 以Apache Thrift为代表的二进制RPC,支持多种 ...

  2. 33.服务之间的调用之RPC、Restful深入理解

    33.服务之间的调用之RPC.Restful深入理解 2018年05月08日 01:52:42 郑学炜 阅读数 13577更多 分类专栏: 6.框架   版权声明:本文为博主原创文章,遵循CC 4.0 ...

  3. RPC的解释以及RPC和Restful、RPC和RMI的区别

    如何科学的解释RPC 说起RPC,就不能不提到分布式,这个促使RPC诞生的领域. 假设你有一个计算器接口,Calculator,以及它的实现类CalculatorImpl,那么在系统还是单体应用时,你 ...

  4. RESTful源码学习笔记之RPC和 RESTful 什么区别

    REST,即Representational State Transfer的缩写.翻译过来是表现层状态转换.如果一个架构符合REST原则,就称它为RESTful架构.啥叫json-rpc?接口调用通常 ...

  5. RESTful源码学习笔记之RPC和Restful深入理解

    以下资料搜集自网络 0x00 RPC RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法).通常的实现 ...

  6. RPC、HTTP、RESTful

    RESTful RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义.RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT ...

  7. 【转载】RESTful 架构风格概述

    本文转载自https://blog.igevin.info/posts/restful-architecture-in-general/ 在移动互联网的大潮下,随着docker等技术的兴起,『微服务』 ...

  8. springboot+cloud 学习(二)应用间通信Feign(伪RPC,实则HTTP)

    在微服务中,使用什么协议来构建服务体系,一直是个热门话题. 争论的焦点集中在两个候选技术:  RPC or Restful Restful架构是基于Http应用层协议的产物,RPC架构是基于TCP传输 ...

  9. 不懂RPC实现原理怎能实现架构梦

    RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...

随机推荐

  1. Spark-源码分析02-Luanch Executor

    1.SparkContext.scala sparkcontext 在被new的时候,会执行class中的代码 其中有一个就是创建TaskScheduler 和 SchedulerBackend,而S ...

  2. POJ P2251 Dungeon Master 题解

    深搜,只不过是三维的. #include<iostream> #include<cstring> #include<cstdio> #include<algo ...

  3. 如何用okr做好目标规划

    有朋友和我吐槽公司总是规划一个个振奋人心的目标,让大家对工作充满了热情.然而好的开头却缺少追踪反馈没有好的结尾,那些大家所渴望达成的目标随着时间的流逝便逐渐没有了音信,不再有人主动提起,团队成员迎来的 ...

  4. BZOJ 5507: [gzoi2019]旧词 LCT

    和之前那个 [LNOI]LCA 几乎是同一道题,就是用动态树来维护查分就行. code: #include <bits/stdc++.h> using namespace std; #de ...

  5. 浅谈SPFA判负环

    目录 SPFA判负环 [前言] [不可代替性] [具体实现] SPFA的过程 判负环 [核心代码] [例题] SPFA判负环 有不足的地方请指出 本蒟蒻一定会修改吼 [前言] 最短路的求法中最广为人知 ...

  6. 二八法则(The 80/20 Principle)

    二八法则的定义:在任何一组事物中,最重要的只占其中一小部分,约20%,其余80%尽管占多数,却是次要的. 二八法则的例子:社会上20%的人占有80%的社会财富 20%的工厂有80%的产出 80%的利润 ...

  7. 【loj2552】【CTSC2018】假面

    题目 有\(n\)个敌方单位,初始生命值分别为\(m_1,\cdots,m_n\) : 假面可以释放\(Q\)个技能: $op = 0  ,  id , u , v $ 表示对\(id\)号敌人有\( ...

  8. C++ 类型转换符区别分析

    转载自:https://blog.csdn.net/legalhighhigh/article/details/87459995 1.static_cast用于将参数转换为指定类型.需要注意的是,进行 ...

  9. OpenFOAM——绕流振动

    流体的物性参数为: 密度:1kg/m3 粘度系数:0.01N·s/m2           首先进行建模操作,任何建模软件均可,本算例在ICEM建模和进行网格划分,生成的网格如下: 接下来转入Open ...

  10. ES6继承小实例

    ES6继承小实例 一.总结 一句话总结: js中的类和继承可以多用es6里面的,和其它后端语言的使用方法一样 class Animal { constructor(name) { this.name ...