基于TCP的RPC实现

RPC即远程服务调用html

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

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

RPC=Remote Produce Call 是一种技术的概念名词. HTTP是一种协议,RPC能够经过HTTP来实现,也能够经过Socket本身实现一套协议来实现安全

为何须要RPC,而不是简单的HTTP接口 服务器

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

 

基于TCP的RPC实现
一、基本思路架构

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

一、服务的调用方Consumer经过Socket创建起与服务的提供方Provider的链接;
二、Consumer将须要调用的方法名称和参数经过Socket发送给Provider;
三、Provider获取Consumer请求的数据并进行解析,执行具体的某一个方法,构造返回数据,返回给Consumer;
四、Consumer得到Provider返回的数据进行相应的处理;框架

 

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

 

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请求 服务端结束~");

    }
相关文章
相关标签/搜索