RPC vs HTTP
RPC协议
Remote Produce Call
远程过程调用,类似的还有
RMI
(
Remote Methods Invoke
远程方法调用。自定义数据格式,基于原生TCP
通信,速度快,效率高。早期的
Webservice
,现在流行
Dubbo
,都是RPC的典型 。
优势:
- 调用快
缺点:
- 在同种编程语言内(例如: java只能调用java类型语言)
Http协议
HTTP
其实是一种网络传输协议,基于
TCP
,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用HTTP
协议,也可以用来进行远程服务调用。现在热门的
RESTFul
风格,就可以采用
HTTP
协议实现。Http
实现的技术:
HttpClient
、
RestTemplate
、
SpringCloud OpenFeign
组件等。
优点:
- 通用性强
缺点:
- 效率差点
微服务架构更多的采用
Http
协议
进行远程调用!!!
HTTP远程调用工具
- JDK的URLConnection(底层)
- OKHttp
- Apache HttpClient(*)
HttpClient的远程调用
1.导入HttpClient依赖
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.1.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency
顺便导入了
fastjson
用作后续的
json
数据转换
2.编写HttpClient代码
//方式一:通过HttpClient5
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建Get请求
HttpGet httpGet = new
HttpGet("http://localhost:9001/user/1");
try {
CloseableHttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
String json = EntityUtils.toString(entity);
} catch (Exception e) {
e.printStackTrace();
}
RestTemplate
RestTemplate
介绍
RestTemplate
是
Spring
提供的用于发送
HTTP
请求的客户端工具,它遵循
Restful
原则。
RestTemplate
默
认依赖
JDK
的
Http
连接工具
HttpUrlConnection
,当然你也可以替换不同的底层实现,比如
OkHttp
、
Apache HttpClient
等等。
初始化
RestTemplate
在启动类初始化
RestTemplate
的
Bean
对象
@Bean
public RestTemplate restTemplate(){
//return new RestTemplate(); //默认就是SimpleClientHttpRequestFactory
//return new RestTemplate(new HttpComponentsClientHttpRequestFactory());
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
RestTemplate
底层支持三种
Http
客户端组件:
HttpURLConnection
:
SimpleClientHttpRequestFactory
,这是
JDK
自带的
Http
请求对象。该方 式为默认底层实现。
HttpClient
:
HttpComponentsClientHttpRequestFactory
,这是
Apache
开源的
Http
库。
OkHttp
:
OkHttp3ClientHttpRequestFactory
,
OkHttp
是一款高性能的
Http
开源库。
从开发人员的反馈,和网上的各种
HTTP
客户端性能以及易用程度评测来看,
OkHttp
优于
Apache
HttpClient
、
Apache HttpClient
优于
HttpURLConnection
。所以个人更建议大家将底层
HTTP
实现切换 为OKHTTP
。
切换为
OkHttp
,需要导入
OkHttp
的包:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.7.2</version>
</dependency
切换为
HttpClient
,需要导入相应包:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
使用
RestTemplate
远程调用
//方式二:使用RestTemplate
User user = restTemplate.getForObject("http://localhost:9001/user/" + order.getUserId(), User.class);