RPC及其原理

什么是RPC? RPC是Remote Procedure Call的缩写,像Client-Servier一样的远程过程调用,也就是调用远程服务就跟调用本地服务一样方便,一般用于将程序部署在不同的机器上,供客户端进行调用。就像一个request-response调用系统一样简单。在面向对象编程的程序中,RPC也可以用Remote method invocation(RMI)来展现。为什么用它呢,因为随着分布式结构的普遍,越来越多的应用需要解耦,将不同的独立功能部署发布成不同的服务供调用。

  它的主要流程是Client -> Client Stub -> Network -> Server Stub -> Server 执行完成之后再进行返回。

  这里边比较重要的就是Clint Stub和Server Stub,他们主要的作用就是将调用的方法和参数进行编码(Marshalling)序列化,将序列化后的数据通过网络发送给Server Stub,然后等待Server回执。Server Stub将受到的序列化字节进行解码(Unmarshaling)反序列化,然后再将参数传入到对应到的方法中执行,将得出的结果计算出来之后再进行返回,返回的过程和正向的过程类似。

  那么这个结构里边的内容这么复杂,而且还需要保证数据的完整,网络等因素,所以这块有一个通讯的标准就是IDL(Interface Description Language)接口定义语言,因为很多程序采用了不同的编程语言(Java,C, C++ etc.)和不同的操作系统(Windows, CentOs, RHEL etc.),要保证数据能够正常通讯,并且不受语言和操作系统等限制,就有了它。比如Apache的Thrift 、Avro和Google的 Protocol Buffers、阿里的Dubbo等。

  其实很多人早已经应用了它了,但是可能不知道,比如web service的WSDL。下面我就用一个小程序来创建一个简单基于的WSDL的RPC。使用JDK的JAX-WS实现。

前面发布操作还是一样的,首先是一个接口:


/**
 * 接口
 *
 */
@WebService
@SOAPBinding(style = Style.RPC)
public interface IRPCService {

    @WebMethod
    public String RPCMethod(String str);
}

然后是实现类:


/**
 * 实现类
 *
 */
@WebService (endpointInterface = "com.hqs.rpc.IRPCService")
public class RPCServiceImpl implements IRPCService {

    @Override
    public String RPCMethod(String str) {
        System.out.println("service received:" + str);
        return "RPC Method invoked: " + str;
    }

}

服务发布类:

/**
 * 发布类
 *
 */
public class RPCPublisher {
    public static void main(String[] args) {
  
        Endpoint.publish("http://localhost:9966/rpc", new RPCServiceImpl());

        System.out.println("Publish success!");
    }
}

这个时候启动服务类,然后就可以通过地址http://localhost:9966/rpc?wsdl访问WSDL文件了,接下来我们就可以写客户端类:

/**
 * 客户端类
 *
 */
public class RPCClient {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://localhost:9966/rpc?wsdl");
            QName qname = new QName("http://rpc.hqs.com/","RPCServiceImplService");
            Service service = Service.create(url, qname);
            IRPCService irpc = service.getPort(IRPCService.class);
            System.out.println(irpc.RPCMethod("client"));
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}

输出结果:RPC Method invoked: client

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值