前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RMI 远程方法调用

RMI 远程方法调用

原创
作者头像
猎户星座1
修改2020-08-03 10:57:23
1.3K0
修改2020-08-03 10:57:23
举报
文章被收录于专栏:Java Study

在看项目代码时看到了 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 的方式来实现。

Hssian

服务端和客户端进行通信时 必须有两者都知道的 接口 (Java类) 然后 客户端去利用hessian 去构建 url 的request是利用的io。客户端要知道调用传输的接口类,服务端要有接口的实现类。

有一个要远程调用的接口 服务端要实现该接口及方法,客户端要调用该url 请求及返回该类。

关键步骤 客户端去请求 接口的,返回该接口的类。

代码语言:javascript
复制
String url = "http://localhost/testHessian";
                              // hessian 工程来实现 
HessianProxyFactory factory = new HessianProxyFactory();
UserApi userApi = (UserApi) factory.create(UserApi.class, url);

HttpClient

通过是线程池的角度 ,来解决大量的请求

http client必备的条件

连接池

超时时间设置(连接超时、读取超时等)

是否支持异步

请求和响应的编解码

可扩展性

客户端代码实现。

代码语言:javascript
复制
 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 来发送服务)

代码语言:javascript
复制
@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;
}

提供者(服务端一个简单的 提供)

代码语言:javascript
复制
@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 代码 都能跑通 代码还是能说,原博客也在代码里面。

[rmi.zip]

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hssian
相关产品与服务
云点播
面向音视频、图片等媒体,提供制作上传、存储、转码、媒体处理、媒体 AI、加速分发播放、版权保护等一体化的高品质媒体服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档