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协议假定某些传输协议的存在 ...
随机推荐
- Build Post Office
Description Given a 2D grid, each cell is either an house 1 or empty 0 (the number zero, one), find ...
- LeetCode 979. Distribute Coins in Binary Tree
原题链接在这里:https://leetcode.com/problems/distribute-coins-in-binary-tree/ 题目: Given the root of a binar ...
- Greenplum 常用数据库管理语句,sql工具
转载自:https://blog.csdn.net/you_xian/article/details/78549756作者:lianghc 在greenplum 使用过程中积累的一些常用查询 ...
- c++ 将float 类型转换成string 类型
string Convert(float Num) { ostringstream oss; oss<<Num; string str(oss.str()); return str; }
- CSS块元素、行内元素、行内块元素的转换
一.块元素转行内元素:display:inline 二.行内元素转块元素:display:block div{ display: inline; /*无效 width: 500px; height: ...
- python 获取 一个正整数的二进制
#coding=utf- def getbin(a): out = "" # 辗转相除法 ): div = a mod = a % out += str(mod) ): break ...
- 2015-2016-2《Java程序设计》团队博客5
一.项目进展 本周将所有的项目代码全部进行了汇总总结,归纳在了一起,进行整体的测试.虽然在编写的时候很顺利,也就是片段代码问题不大,但是汇总到一起时还是产生了冲突与不对等的问题,所以我们只能仔细地从细 ...
- 用户账户——《Python编程从入门到实践》
Web应用程序的核心是让任何用户都能够注册账户并能够使用它,不管用户身处何方 1.让用户能够输入数据 建立用于创建用户的身份验证系统之前,我们先来添加几个页面,让用户能够输入数据.当前,只有超级用户能 ...
- mysql事务回滚机制概述
应用场景: 银行取钱,从ATM机取钱,分为以下几个步骤 1 登陆ATM机,输入密码: 2 连接数据库,验证密码: 3 验证成功,获得用户信息,比如存款余额等: 4 用 ...
- Spark(五十三):Spark RPC初尝试使用
基本用法主要掌握一点就行: master slave模式运用:driver 就是master,executor就是slave. 如果executor要想和driver交互必须拿到driver的Endp ...