Spring Cloud RPC远程调用核心原理:代理模式与RPC客户端实现类

{

e.printStackTrace();

}

/**

*解析REST接口的响应结果,解析成JSON对象并且返回给调用者

*/

RestOut result = JsonUtil.jsonToPojo(responseData,

new TypeReference() {});

return result;

}

//完成对REST接口api/demo/echo/{0}/v1的调用

public RestOut echo(String word)

{

/**

*远程调用接口的方法,完成demo-provider的REST API远程调用

*REST API功能:回显输入的信息

*/

String uri = “api/demo/echo/{0}/v1”;

/**

*组装REST接口URL

*/

String restUrl = contextPath + MessageFormat.format(uri, word);

log.info(“restUrl={}”, restUrl);

/**

*通过HttpClient组件调用REST接口

*/

String responseData = null;

try

{

responseData = HttpRequestUtil.simpleGet(restUrl);

} catch (IOException e)

{

e.printStackTrace();

}

/**

解析

的响应结果

解析成

对象

并且返回给调用者 *解析REST接口的响应结果,解析成JSON对象,并且返回给调用者

*/

RestOut result = JsonUtil.jsonToPojo(responseData,

new TypeReference() { });

return result;

}

}

以上简单的RPC实现类RealRpcDemoClientImpl的测试用例如下:

package com.crazymaker.demo.proxy.basic;

/**

*测试用例

*/

@Slf4j

public class ProxyTester

{

/**

*不用代理,进行简单的远程调用

*/

@Test

public void simpleRPCTest()

{

/**

*简单的RPC调用类

*/

MockDemoClient realObject = new RealRpcDemoClientImpl();

/**

*调用demo-provider的REST接口api/demo/hello/v1

*/

RestOut result1 = realObject.hello();

log.info(“result1={}”, result1.toString());

/**

*调用demo-provider的REST接口api/demo/echo/{0}/v1

*/

RestOut result2 = realObject.echo(“回显内容”);

log.info(“result2={}”, result2.toString());

}

}

运行测试用例之前,需要提前启动demo-provider微服务实例,然后将主机名称crazydemo.com通过hosts文件绑定到demo-provider实例所在机器的IP地址(这里为127.0.0.1),并且需要确保两个REST接口/api/demo/hello/v1、/api/demo/echo/{word}/v1可以正常访问。

运行测试用例,部分输出结果如下:

[main] INFO c.c.d.p.b.RealRpcDemoClientImpl - restUrl=http://crazydemo.com:7700/demo-provider/ api/demo/hello/v1

[main] INFO c.c.d.proxy.basic.ProxyTester - result1=RestOut{datas={“hello”:“world”}, respCode=0, respMsg='操作成功}

[main] INFO c.c.d.p.b.RealRpcDemoClientImpl - restUrl=http://crazydemo.com:7700/demo-provider/ api/demo/echo/回显内容/v1

[main] INFO c.c.d.proxy.basic.ProxyTester - result2=RestOut{datas={“echo”:“回显内容”}, respCode=0, respMsg='操作成功}

以上的RPC客户端实现类很简单,但是实际开发中不可能为每一个远程调用Java接口都编写一个RPC客户端实现类。如何自动生成RPC客户端实现类呢?这就需要用到代理模式。接下来为大家介绍简单一点的代理模式实现类——静态代理模式的RPC客户端实现类。

从基础原理讲起:代理模式与RPC客户端实现类

======================

首先来看一下代理模式的基本概念。代理模式的定义:为委托对象提供一种代理,以控制对委托对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个目标对象,而代理对象可以作为目标对象的委托,在客户端和目标对象之间起到中介的作用。

代理模式包含3个角色:抽象角色、委托角色和代理角色,如图3-3所示。

你可能感兴趣的:(spring,cloud,rpc,代理模式)