基于http协议实现RPC远程调用

今天简单说一下基本Http协议来实现RPC框架~

基于Http协议实现RPC框架:

优点:

1、简单、实用、开发方便

缺点:

1、性能不是很稳定,在海量数据时,完全顶不住,容易宕机

2、因为不是走的注册中心,不便于维护、监控以及统计分析

但是对于大多数公司而言,不会又像淘宝、京东那样大的数据量,所以基于Http协议的RPC,实现多个系统间的解耦,还是很实用的~

下面,我们进入正题,通过Java实现简单的RPC调用

一、maven 引入第三方jar包(不是maven项目,可以自己去网上下载一个对应的jar)

            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.2</version>
            </dependency>

二、http的代码实现

1、简易版的Http请求

客户端代码:

    @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));
    }

服务端代码:

服务端 需要提供一个web服务以及相关的请求路径:http://localhost/testHttpService

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

    }

测试流程

1、启动WEB服务

2、客户端进行调用

输出结果:

测试http请求开始~
http服务返回结果为:{"code":"0000","msg":"http请求测试成功~","success":true}

2、升级版的Http请求调用

此处的升级重要是为了传参方便,服务器端不用每个参数都通过request获取到

1、创建一个传输参数的Bean类

package com.jd.test;

/**
 * Created by zhanghao10 on 2017/4/17.
 */
public class MapParam {

    private String reqData;//请求数据

    public String getReqData() {
        return reqData;
    }

    public void setReqData(String reqData) {
        this.reqData = reqData;
    }
}

2、客户端代码:

 @Test
    public void testHttpServiceEntity() throws IOException {
        System.out.println("测试http请求开始~");
        //封装请求参数
        Map map = new HashMap<String, String>();
        map.put("reqData","Hello World,世界你好~");

        //封装HTTP请求参数
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("http://localhost/testHttpService");
        List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
        nameValuePairList.add(new BasicNameValuePair("reqData","Hello World,世界你好~"));

        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairList,"UTF-8"));
        HttpResponse httpResponse=httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        String resp = EntityUtils.toString(httpEntity);
        System.out.println("http服务返回结果为:"+ com.alibaba.fastjson.JSON.toJSON(resp));
    }

3、服务端代码

@RequestMapping("/testHttpService")
    public void testHttpService(MapParam mapParam,HttpSrvletRequest request,HttpServletResponse response) throws IOException {
        logger.info("测试HTTP请求 服务端开始~"+ com.alibaba.fastjson.JSON.toJSON(mapParam));
        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请求 服务端结束~");

    }

测试流程

1、启动WEB服务

2、客户端进行调用

测试结果:

测试http请求开始~
http服务返回结果为:{"code":"0000","msg":"http请求测试成功~","success":true}

是不是感觉很简单,没错,其实,你要是仔细看代码的话,你会发现,和我们正常的Servlet请求是一样的,不同的是

1、请求的时候需要用HttpClient来模拟浏览器端请求

2、服务器端返回结果 需要通过对应的流,而不是返回到界面

推荐阅读连接:为什么需要RPC,而不是简单的HTTP接口?

时间: 2024-08-23 19:40:58

基于http协议实现RPC远程调用的相关文章

徒手撸框架--实现 RPC 远程调用

微服务,已经是每个互联网开发者必须掌握的一项技术.而 RPC 框架,是构成微服务最重要的组成部分之一.趁最近有时间.又看了看 dubbo 的源码.dubbo 为了做到灵活和解耦,使用了大量的设计模式和 SPI机制,要看懂 dubbo 的代码也不太容易. 按照<徒手撸框架>系列文章的套路,我还是会极简的实现一个 RPC 框架.帮助大家理解 RPC 框架的原理. 广义的来讲一个完整的 RPC 包含了很多组件,包括服务发现,服务治理,远程调用,调用链分析,网关等等.我将会慢慢的实现这些功能,这篇文章

测试JSON RPC远程调用(JSON客户端)

#include <string> #include <iostream> #include <curl/curl.h> /* 标题:JSon客户端 Author: Kagula LastUpdateDate:2014-05-17 描述:测试JSON RPC远程调用 测试环境:Windows 8.1.Visual Studio 2013 SP1 curl-7.36.0 CPPCMS 1.0.4(JSON服务端) Java Servlet (JSON服务端) */ sta

測试JSON RPC远程调用(JSONclient)

#include <string> #include <iostream> #include <curl/curl.h> /* 标题:JSonclient Author: Kagula LastUpdateDate:2014-05-17 描写叙述:測试JSON RPC远程调用 測试环境:Windows 8.1.Visual Studio 2013 SP1 curl-7.36.0 CPPCMS 1.0.4(JSON服务端) Java Servlet (JSON服务端) *

go语言net包rpc远程调用的使用

一.基于http的RPC 服务端: package main; import ( "net/rpc" "net/http" "log" ) //go对RPC的支持,支持三个级别:TCP.HTTP.JSONRPC //go的RPC只支持GO开发的服务器与客户端之间的交互,因为采用了gob编码 //注意字段必须是导出 type Params struct { Width, Height int; } type Rect struct{} //函数必须

dubbo集成zookeeper rpc远程调用

注:下面使用dubbo依赖的是zookeeper注册中心,这里没有详细的介绍.在配置之前,请自行准备好zookeeper环境. 后续如果写zookeeper的配置会补放链接 添加Gradle依赖 compile group: 'com.alibaba', name: 'dubbo', version: '2.5.10'//dubbo compile group: 'org.apache.zookeeper', name: 'zookeeper', version: '3.3.3'//zookee

rpc远程调用开发

RPC即远程过程调用,适用于集群管理,集群节点就是RPCServer,而我们发起远程调用的web服务器就是RPCClient.所以是少数rpcClient(可能一个)对多个RPCServer(集群节点). 今天讲述的RPC开发希望实现这样一个效果,在RPCClient上(也就是web服务器)执行一条shell命令,要求指定的远程主机执行指定的命令.命令的格式如下 rpc_client address command 比如 ./ssan_client 192.168.1.1 vmstat 希望这条

[原]基于Telnet协议的Jenkins远程部署

最近奉命研究Jenkins的自动远程部署,刚开始进行还算顺利.但是,紧接着问题就来了,我们要部署的目标机器是Telnet协议的.而接触过jenkins的都知道,所有的插件里面只有用于本地部署的和基于SSH协议远程部署的,并没有一个是基于Telnet协议的.那么这该怎么解决呢? 当然,你也可以为你的目标机器安装SSH服务. 我先说说解决的思路,然后再附上具体的步骤和shell脚本. 思路:将jenkins安装在linux系统上 --->  SVN check out 部署的项目  --->  m

RPC远程调用概念 &amp;amp;&amp;amp; demo实例

RPC是指远程过程调用,直观说法就是A通过网络调用B的过程方法. 也就是说两台serverA.B,一个应用部署在Aserver上,想要调用Bserver上应用提供的函数/方法,因为不在一个内存空间,不能直接调用.须要通过网络来表达调用的语义和传达调用的数据. 为什么RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完毕的需求,比方比方不同的系统间的通讯,甚至不同的组织间的通讯.因为计算能力须要横向扩展.须要在多台机器组成的集群上部署应用 首先要解决寻址的问题,也就是说,Aserv

RPC远程调用概念 &amp;&amp; demo实例

RPC是指远程过程调用,直观说法就是A通过网络调用B的过程方法.也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据. 为什么RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如比如不同的系统间的通讯,甚至不同的组织间的通讯.由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用 首先要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的