关键词:
什么是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实现
接口类(定义了一个非常简单的方法):
package com.hqs.rpc; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; /** * 接口 * @author hqs * */ @WebService @SOAPBinding(style = Style.RPC) public interface IRPCService @WebMethod public String RPCMethod(String str);
实现类:
package com.hqs.rpc; import javax.jws.WebService; /** * 实现类 * @author hqs * */ @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;
服务发布类:
package com.hqs.rpc; import javax.xml.ws.Endpoint; /** * 发布类 * @author hqs * */ public class RPCPublisher public static void main(String[] args) //自己定义地址 Endpoint.publish("http://localhost:9966/rpc", new RPCServiceImpl());
这个时候启动服务类,然后就可以通过地址http://localhost:9966/rpc?wsdl访问WSDL文件了了:
<?xml version="1.0" encoding="UTF-8"?> <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI‘s version is JAX-WS RI 2.2.4-b01. --> <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI‘s version is JAX-WS RI 2.2.4-b01. --> -<definitions name="RPCServiceImplService" targetNamespace="http://rpc.hqs.com/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://rpc.hqs.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <types/> -<message name="RPCMethod"> <part type="xsd:string" name="arg0"/> </message> -<message name="RPCMethodResponse"> <part type="xsd:string" name="return"/> </message> -<portType name="IRPCService"> -<operation name="RPCMethod"> <input message="tns:RPCMethod" wsam:Action="http://rpc.hqs.com/IRPCService/RPCMethodRequest"/> <output message="tns:RPCMethodResponse" wsam:Action="http://rpc.hqs.com/IRPCService/RPCMethodResponse"/> </operation> </portType> -<binding type="tns:IRPCService" name="RPCServiceImplPortBinding"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> -<operation name="RPCMethod"> <soap:operation soapAction=""/> -<input> <soap:body namespace="http://rpc.hqs.com/" use="literal"/> </input> -<output> <soap:body namespace="http://rpc.hqs.com/" use="literal"/> </output> </operation> </binding> -<service name="RPCServiceImplService"> -<port name="RPCServiceImplPort" binding="tns:RPCServiceImplPortBinding"> <soap:address location="http://localhost:9966/rpc"/> </port> </service> </definitions>
接下来我们就可以写客户端类:
package com.hqs.rpc; import java.net.MalformedURLException; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; /** * 客户端类 * @author hqs * */ 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
简单的RPC就这么实现了。其实目前实现上一些公司实现的比较复杂,分为服务分为provider和consumer,以及负责监控管理的provider,provider一般采用zookeeper单数集群,用于管理和监控provider的服务注册,因为provider可能部署在同一台机器上的不同端口或者不同机器上,consumer通过zookeeper就可以拿到provider的IP/接口/版本号/端口等信息,然后进行调用。
好了,如果有不对的地方,请大家指正。
rpc(代码片段)
什么是RPC?RPC是RemoteProcedureCall的缩写,想Client-Servier一样的远程过程调用,也就是调用远程服务就跟调用本地服务一样方便,一般用于将程序部署在不同的机器上,供客户端进行调用。就像一个request-response调用系统一样简单。在... 查看详情
rpc----rpc入门了解&最简单的rpc的实现(代码片段)
...列化1.1序列化的原因1.2概念1.3解决方案(RPC序列化框架)1.4代码实现2、网络通讯协议2.1基于TCP协议实现的RPC2.1.1版本一2.1.1.1原理2.1.1.2场景2.1.1.3实现代码2.1.1.4缺陷2.1 查看详情
rpc和消息队列(代码片段)
目录RPC和消息队列1消息队列2Rabbitmq2.1安装2.2基本使用2.3消息确认机制2.4持久化2.5闲置消费2.6发布订阅2.7关键字2.8模糊匹配2.9rabbitmq实现rpc3python中的rpc框架3.1SimpleXMLRPCServer3.2ZeroRPC实现rpcRPC和消息队列1消息队列1两个服务调用:restf... 查看详情
简易rpc(代码片段)
暴露服务:packagecom.saiarea;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.lang.reflect.Method;importjava.net.ServerSocket;importjava.net.Socket;publicclassRpcServicepublicst 查看详情
rpc是什么(代码片段)
前言本篇文章主要介绍RPC理论,以及RPC常见得协议,工作原理,功能要点,以及我们常见得RPC框架,我们在公司开发开发rpc框架都是按照这样得思路设计出来得。因此了解这些,有助于我们快速上手框架... 查看详情
rpc----基于bio实现的rpc(代码片段)
基于BIO实现的RPC代码实现1、rpc-api1.1服务接口1.2实体类2、rpc-common2.1通用消息2.2枚举类2.3异常类3、rpc-core3.1服务注册类3.1.1服务注册表通用接口3.1.2默认服务注册表3.2服务端(提供者)3.3客户端(消费者)4、test-server4.1服务实现类4.2测试... 查看详情
rpc----基于netty实现的rpc(代码片段)
基于Netty实现的RPC一、Netty服务端和客户端1、服务端server1.1NettyServer1.2NettyServerHandler2、客户端client2.1NettyClient2.2NettyClientHandler二、自定义协议和编解码器1、协议2、编码器3、解码器4、拆包器5、补充知识5.1TCP粘包拆包问题三、序列... 查看详情
goweb---rpc(代码片段)
GoWeb---RPC用rpc实现远程过程调用实例演示用rpc实现远程过程调用Go程序之间可以使用net/rpc包实现相互通信,这是另一种客户端-服务器应用场景。它提供了一种方便的途径,通过网络连接调用远程函数。当然,仅当程序... 查看详情
自定义rpc的完整实现---深入理解rpc内部原理(代码片段)
倘若不使用RPC远端调用的情况下,代码如下:local.py#coding:utf-8#本地调用除法运算的形式classInvalidOperation(Exception):def__init__(self,message=None):self.message=messageor‘involidoperation‘defdivide(num1,num2=1):ifnum2==0:raiseInv 查看详情
rpc一般指远程过程调用协议(代码片段)
RPC一般指远程过程调用协议 RPC(RemoteProcedureCall)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间... 查看详情
phpzendxml-rpc客户端(代码片段)
sh使用一些资助帐户启动rpc(代码片段)
rpc----基于zookeeper为注册中心实现的rpc(代码片段)
...理二、统一配置管理1、服务的注册2、服务的发现3、测试代码服务的注册测试服务的发现测试测试截图三、负载均衡1、接口2、随机、轮询代码3、客户端服务发现代码三、动态感知服务器状态1、文字描述2、代码部分实现3、测试... 查看详情
json_rpc_2implementation(代码片段)
https://stackoverflow.com/questions/52670255/flutter-json-rpc-2-implementationimport‘dart:convert‘;import‘package:flutter/material.dart‘;import‘package:json_rpc_2/json_rpc_2.dart‘asjson_rpc;import‘pac 查看详情
rpc好,还是restful好?(代码片段)
1.JSON-RPC什么是JSON-RPCJSON-RPC2.0规范中定义JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议。本规范主要定义了一些数据结构及其相关的处理规则。它允许运行在基于socket,http等诸多不同消息传输环境的同一进程中。其使用JSON... 查看详情
dubbo指定ip调用rpc(代码片段)
@Reference(url="dubbo://localhost:28172")privateIDCServicedCService; 查看详情