基于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.</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","");
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":"","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","");
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":"","msg":"http请求测试成功~","success":true}
是不是感觉很简单,没错,其实,你要是仔细看代码的话,你会发现,和我们正常的Servlet请求是一样的,不同的是
1、请求的时候需要用HttpClient来模拟浏览器端请求
2、服务器端返回结果 需要通过对应的流,而不是返回到界面
另外顺便说一下,这个项目是基于spring mvc实现的,其实也是Restful架构的具体实现方案~
推荐阅读连接:为什么需要RPC,而不是简单的HTTP接口?
怎样用通俗的语言解释什么叫 REST,以及什么是 RESTful?
基于http协议实现RPC远程调用的更多相关文章
- 基于TCP 协议的RPC
前言: 环境: windown 10 Eclipse JDK 1.8 RPC的概念: RPC 是远程过程调用,是分布式网站的基础. 实验 SayHelloService.java 接口类,用于规范 S ...
- 从0到1:全面理解RPC远程调用
上一篇关于 WSGI 的硬核长文,不知道有多少同学,能够从头看到尾的,不管你们有没有看得很过瘾,反正我是写得很爽,总有一种将一样知识吃透了的错觉. 今天我又给自己挖坑了,打算将 rpc 远程调用的知识 ...
- 測试JSON RPC远程调用(JSONclient)
#include <string> #include <iostream> #include <curl/curl.h> /* 标题:JSonclient Auth ...
- 使用Socket&反射&Java流操作进行方法的远程调用(模拟RPC远程调用)
写在前面 阅读本文首先得具备基本的Socket.反射.Java流操作的基本API使用知识:否则本文你可能看不懂... 服务端的端口监听 进行远程调用,那就必须得有客户端和服务端.服务端负责提供服务,客 ...
- Openstack Nova 源码分析 — RPC 远程调用过程
目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacompute ...
- netcore 基于 DispatchProxy 实现一个简单Rpc远程调用
前言 netcore 发布以来,一直很关注netcore的进程.目前在公司负责的网站也历经波折的全部有.net framework 4.0 全部切换到netcore 2.2 版本中.虽然过程遇到的坑不 ...
- go语言net包rpc远程调用的使用
一.基于http的RPC 服务端: package main; import ( "net/rpc" "net/http" "log" ) ...
- 几种基于HTTP协议的RPC性能比较
有了整体的了解后,可以发现Hessian的这个远程过程调用,完全使用动态代理来实现的,其实从客户端代码不难看出,HessianProxyFactory的create方法就是创建接口Basic的代理类, ...
- dubbo集成zookeeper rpc远程调用
注:下面使用dubbo依赖的是zookeeper注册中心,这里没有详细的介绍.在配置之前,请自行准备好zookeeper环境. 后续如果写zookeeper的配置会补放链接 添加Gradle依赖 co ...
随机推荐
- SpringBoot与Dubbo整合上篇
最近学习了一下dubbo,是阿里巴巴公司的一个开源服务框架.目前我们公司实现两个不同系统的之间通信,是采用了Oracle的OSB作为服务的管理(即企业服务总线的一种实现),服务提供方在OSB上注册业务 ...
- Flutter基础Widget之按钮(RaisedButton、FlatButton、OutlineButton,IconButton)
Flutter中给我们预先定义好了一些按钮控件给我们用,常用的按钮如下 RaisedButton :凸起的按钮,其实就是Android中的Material Design风格的Button ,继承自Ma ...
- [java]java String.split()函数的用法分析
转自:http://swiftlet.net/archives/709 一.在java.lang包中有String.split()方法的原型是: public String[] split(Strin ...
- vue-router详解
对于单页应用,官方提供了vue-router进行路由跳转的处理,本篇主要也是基于其官方文档写作而成. 安装 基于传统,我更喜欢采用npm包的形式进行安装. npm install vue-router ...
- Tornado的cookie过期问题
首先,web应用程序是使用HTTP协议进行数据传输,因为HTTP协议是无状态的,所以一旦提交数据完成后,客户端和服务器端的连接就会被关闭,再次进行数据的交换就得重新建立新的连接,那么,有个问题就是服务 ...
- C++ lower_bound 和upper_bound
二分查找的函数有 3 个: 1.lower_bound(起始地址,结束地址,要查找的数值) 返回的是数值 第一个 出现的位置. 2.upper_bound(起始地址,结束地址,要查找的数值) 返回的是 ...
- 发现TypeScript中同名interface接口会自动合并的特性
今天在学习怎么用TypeScript给jQuery写扩展插件时发现一个很有趣的事情
- spring boot 教程(二)模板依赖
在Spring boot中有一个很重要的概念,叫做约定优于配置--软件开发的简约原则.所以Spring boot会按照约定好的文件位置去找我们的包和类. 默认配置 Spring Boot默认提供静态资 ...
- 判断一棵树是否为二叉搜索树(二叉排序树) python
输入一棵树,判断这棵树是否为二叉搜索树.首先要知道什么是排序二叉树,二叉排序树是这样定义的,二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的 ...
- Yahoo! Finance财经数据PYTHON临时读取方法
本篇文章转自简书:http://www.jianshu.com/p/85d563d326a9 这段时间在看量化策略,找到了一个比较不错的开源项目,但是yahoo金融的数据源一直没有找到,在网上找到了这 ...