什么是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. Build Post Office

    Description Given a 2D grid, each cell is either an house 1 or empty 0 (the number zero, one), find ...

  2. LeetCode 979. Distribute Coins in Binary Tree

    原题链接在这里:https://leetcode.com/problems/distribute-coins-in-binary-tree/ 题目: Given the root of a binar ...

  3. Greenplum 常用数据库管理语句,sql工具

    转载自:https://blog.csdn.net/you_xian/article/details/78549756作者:lianghc      在greenplum 使用过程中积累的一些常用查询 ...

  4. c++ 将float 类型转换成string 类型

    string Convert(float Num) { ostringstream oss; oss<<Num; string str(oss.str()); return str; }

  5. CSS块元素、行内元素、行内块元素的转换

    一.块元素转行内元素:display:inline 二.行内元素转块元素:display:block div{ display: inline; /*无效 width: 500px; height: ...

  6. python 获取 一个正整数的二进制

    #coding=utf- def getbin(a): out = "" # 辗转相除法 ): div = a mod = a % out += str(mod) ): break ...

  7. 2015-2016-2《Java程序设计》团队博客5

    一.项目进展 本周将所有的项目代码全部进行了汇总总结,归纳在了一起,进行整体的测试.虽然在编写的时候很顺利,也就是片段代码问题不大,但是汇总到一起时还是产生了冲突与不对等的问题,所以我们只能仔细地从细 ...

  8. 用户账户——《Python编程从入门到实践》

    Web应用程序的核心是让任何用户都能够注册账户并能够使用它,不管用户身处何方 1.让用户能够输入数据 建立用于创建用户的身份验证系统之前,我们先来添加几个页面,让用户能够输入数据.当前,只有超级用户能 ...

  9. mysql事务回滚机制概述

    应用场景:   银行取钱,从ATM机取钱,分为以下几个步骤       1 登陆ATM机,输入密码:    2 连接数据库,验证密码:    3 验证成功,获得用户信息,比如存款余额等:    4 用 ...

  10. Spark(五十三):Spark RPC初尝试使用

    基本用法主要掌握一点就行: master slave模式运用:driver 就是master,executor就是slave. 如果executor要想和driver交互必须拿到driver的Endp ...