在看项目代码时看到了 hessian 感觉一点都不熟悉,询问导师,引出了一批自己不知道的 知识或技术吧,rmi 及人们常说的RPC 调用 远程服务调用,至少我看了RMI 后 觉得有些概念真的是有些虚,以至于让你觉得很高大上,(同等想起当时覃超老师的算 法课上说 dp dynamic programing 动态规划时说它 就是说的太噱头了)。
在我学习了Hessian HTTP client 及 Rest template 后,感觉他们 的就是感觉一种 模拟 postman 的Java版 去传入参数 、设置请求头请求信息、 去进行get post delete 等请求 。hessian 说实话学的不多,然后HTTP client 及 Rest template 尤其是给我这种感觉。hessian 是建立在二进制的基础上进行传输有一定的限制,后两者可以转为json 去进行request 及对response进行解析。
应用场景:
比如说你的系统要调用,阿里云视频点播服务,你需要用到 阿里云提供的sdk啊,什么的 让自己的项目变成客户端,然后去远程调用 阿里云服务端的service,或者用的是微服务,自己的一个微服务项目如何调用别的微服务的方法呢?就可以通过rmi 的方式来实现。
服务端和客户端进行通信时 必须有两者都知道的 接口 (Java类) 然后 客户端去利用hessian 去构建 url 的request是利用的io。客户端要知道调用传输的接口类,服务端要有接口的实现类。
有一个要远程调用的接口 服务端要实现该接口及方法,客户端要调用该url 请求及返回该类。
关键步骤 客户端去请求 接口的,返回该接口的类。
String url = "http://localhost/testHessian";
// hessian 工程来实现
HessianProxyFactory factory = new HessianProxyFactory();
UserApi userApi = (UserApi) factory.create(UserApi.class, url);
HttpClient
通过是线程池的角度 ,来解决大量的请求
http client必备的条件
连接池
超时时间设置(连接超时、读取超时等)
是否支持异步
请求和响应的编解码
可扩展性
客户端代码实现。
public static void doGetTestOne() {
// 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
//第一步 ---创建 客户端
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
// 创建Get请求
//第二步 --创建一个请求
HttpGet httpGet = new HttpGet("http://localhost:8011/doSendHttp");
// 响应模型
//第三步 --创建 一个响应去接受
CloseableHttpResponse response = null;
try {
// 由客户端执行(发送)Get请求
response = httpClient.execute(httpGet);
// 第四步 -- 客户端 执行创建额请求 返回给响应
HttpEntity responseEntity = response.getEntity();
System.out.println("响应状态为:" + response.getStatusLine());
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
RestTemplate
是spring提供的一种进行远程方法调用的场景,可以借助 Eureka 来协助实现,将消费者和提供者注册到服务中,通过服务发现来调用。
消费者(客户端的代码实现,restTemplate 来发送服务)
@Autowired
DiscoveryClient discoveryClient;
@Autowired //注入 restTemplate 来使用
RestTemplate restTemplate;
@GetMapping("/sayHello")
public String hello(String name) {
// 发现获得一个 叫 provide 中的实例
List<ServiceInstance> list = discoveryClient.getInstances("provider");
ServiceInstance instance = list.get(0);
//获得 端口 主机名
String host = instance.getHost();
int port = instance.getPort();
// 发送 rmi 调用 标注返回值类型为string
String s = restTemplate.getForObject("http://" + host + ":" + port + "/sayHello?name={1}", String.class, name);
return s;
}
提供者(服务端一个简单的 提供)
@GetMapping("/sayHello")
public String SayHello(String name) {
return "sayHello" + name + "!";
}
okhttp
也是一个请求发送服务
https://www.jianshu.com/p/10382cc71127
当自己写项目时会再进行了解更细致的用法。
拓展 RMI 与 RPC 的区别
详细看这位老哥写的博客文章,详细清楚。
https://www.cnblogs.com/yanggb/p/11213448.html
自己理解一下就是 ,rmi 只是针对Java来说的就像 从纯Java层面来完成的一种功能,而 rpc不是, rpc 是依靠网络层面的来完成的service 的通信, rmi 就是Java版的 rpc。
自己学习时网上的例子的 demo 代码 都能跑通 代码还是能说,原博客也在代码里面。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。