文档章节

基于TCP的RPC实现

少年已不再年少
 少年已不再年少
发布于 10/22 09:19
字数 1011
阅读 11
收藏 0

RPC即远程服务调用

出现原因:随着项目越来越大,访问量越来越大,为了突破性能瓶颈,需要将项目拆分成多个部分,这样比起传统的项目都是本地内存调用,分布式的项目之间需要在网络间进行通信

服务之间的远程调用通常有两种方式,即基于TCP的远程调用和基于Http的远程调用

RPC=Remote Produce Call 是一种技术的概念名词. HTTP是一种协议,RPC可以通过HTTP来实现,也可以通过Socket自己实现一套协议来实现

为什么需要RPC,而不是简单的HTTP接口 

http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议进行传输。但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑

 

基于TCP的RPC实现
1、基本思路

首先,远程控制调用RPC的本质还是底层的Scoket通信。对于简单的设计实现来说,其基本思路是:

1、服务的调用方Consumer通过Socket建立起与服务的提供方Provider的连接;
2、Consumer将需要调用的方法名称和参数通过Socket发送给Provider;
3、Provider获取Consumer请求的数据并进行解析,执行具体的某一个方法,构造返回数据,返回给Consumer;
4、Consumer获得Provider返回的数据进行相应的处理;

 

RPC是基于socket通信,在协议层面处于较底层,优点是传输效率高,但是开发难度相对较高,而HTTP处于较高层面,开发难度相对较小,不用维护socket端口和数据序列化相关问题,但是传输效率比起TCP来低了一些

 

Dubbo(淘宝开源的基于TCP的RPC框架)

Hessian(基于HTTP的远程方法调用)

RMI(远程方法调用)是JAVA自带的远程方法调用工具,不过有一定的局限性,毕竟是JAVA语言最开始时的设计,后来很多框架的原理都基于RMI

 

基于http的RPC实现

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
</dependency>
@Test
    public void testHttpService() throws UnsupportedEncodingException {
        System.out.println("测试http请求开始~");
        //封装请求参数
        Map map = new HashMap<String, String>();
        map.put("reqData","Hello World,世界你好~");
        //http://localhost/testHttpService  请求的服务器地址URL
        String resp = HttpUtil.post("http://localhost/testHttpService", map);
        System.out.println("http服务返回结果为:"+ com.alibaba.fastjson.JSON.toJSON(resp));
    }
@RequestMapping("/testHttpService")
    public void testHttpService(HttpServletRequest request,HttpServletResponse response) throws IOException {
        logger.info("测试HTTP请求 服务端开始~");
        String reqData=request.getParameter("reqData");

        //模拟 相关业务逻辑处理
        logger.info("处理相关业务~reqData="+reqData);

        //模拟 返回业务结果
        logger.info("业务处理完成,返回结果~");
        Map mapResult=new HashMap();
        mapResult.put("success",true);
        mapResult.put("code","0000");
        mapResult.put("msg","http请求测试成功~");
        //防止Http请求中文乱码
        response.setHeader("Content-Type", "text/html;charset=utf-8");
        PrintWriter printWriter=response.getWriter();
        printWriter.write(com.alibaba.fastjson.JSON.toJSONString(mapResult));
        printWriter.flush();
        logger.info("测试HTTP请求 服务端结束~");

    }

© 著作权归作者所有

少年已不再年少
粉丝 4
博文 185
码字总数 52252
作品 0
泰安
程序员
私信 提问
基于Tcp协议与基于Http协议的RPC简介笔记

前言:之前对于RPC方面的学习多限于对RMI原理的学习,直到今天在看陈康贤前辈的《大型分布式网站架构-设计与实践》这本书的时候,才发现原来RPC可以基于TCP协议也可以基于HTTP协议(这里所说...

浮躁的码农
2018/05/28
34
0
HTTP,TCP, socket,RPC 与gRPC都是啥?

TCP/HTTP与socket 首先回顾下计算机网络的五(七)层协议:物理层、数据链路层、网络层、传输层、(会话层、表示层)和应用层。那么从协议上来讲: TCP是传输层协议,主要解决数据如何在网络中传...

RichardBillion
2018/04/19
0
0
如何使用Netty开发实现高性能的RPC服务器

RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议。说的再直白一点,就是客户端在不必知道调用细节的...

vshcxl
2017/10/20
252
0
Spring+Netty+Protostuff+ZooKeeper实现轻量级RPC服务

RPC简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。 RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协...

Listen_ing
2016/05/26
2.7K
12
大型分布式网络架构设计与实践笔记01. RPC

RPC 定义 RPC, Remote Process Call, 远程方法调用. RPC 将本地调用转变为远程服务器上的调用,给系统的处理能力和吞吐量无限制提升提供了可能,是实现分布式计算的基础。 服务 Provider 扩容...

机器学习小蜜蜂
2016/08/22
423
0

没有更多内容

加载失败,请刷新页面

加载更多

前端的一些雕虫小技,从100%和滚动条说起

1、100%和滚动条 当我们在css中把html和body同时设为100%时,会出现滚动条 html, body { width: 100%; height: 100%; } 原因是html和b...

wphmoon
31分钟前
6
0
电力区块链应用案例【2019】

随着区块链技术的日益普及,出现了大量创业企业尝试使用区块链技术来解决能源与电力行业中存在的问题。在本文中,我们将介绍其中的三个能源区块链项目。 能源行业以价格不透明著称:消费者很...

汇智网教程
52分钟前
7
0
聊聊rocketmq的adjustThreadPoolNumsThreshold

序 本文主要研究一下rocketmq的adjustThreadPoolNumsThreshold DefaultMQPushConsumer rocketmq-client-4.5.2-sources.jar!/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.ja......

go4it
今天
9
0
关于早起

早起是非常好的事情,但是像如果前一天睡得晚,或者第二天早上是非常冷的时候,那就不是很美好了。 但是本身早起是一件非常棒的事情,我记得我每次早起 如果不觉得困的话,世界是那么安静,脑...

T型人才追梦者
今天
7
0
Java输入输出

JDK中的InputStream/OutputStream构成了IO输入输出继承层次的基础。它们都是面向字节序列的,每次可以从序列中读入或者写出一个字节或者指定大小的字节数组。但是面向字节流的输入输出不便于...

ytuan996
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部