服务远程调用

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远程调用工具

  • JDKURLConnection(底层)
  • 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林知屿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值