rpc 的使用

rpc是什么?php中流行的rpc框架有哪些。 RPC(Remote Procedure Call Protocol)——远程过程调用协议 阅读详情
rpc 的使用
rpc就是将本地的方法放到了服务器端,使得网络通信如同调用方法般简单。
import RemoteCallMethod_pb2
import functools
import ProtobufHelper
from socket import AF_INET,SOCK_STREAM,socket

class RemoteCallClient:    
    buffsize=1024
    def __init__(self,host,port):
        self.host = host
        self.port = port
        ADDR=(HOST , PORT)
        self.client = socket(AF_INET,SOCK_STREAM)
        self.client.connect(ADDR)
    
    def __getattr__(self,method_name):
        return functools.partial(self.execute,method_name)
    
    def execute(self,method_name,*args,**kwargs):
        helper = ProtobufHelper.ProtobufHelper()
        remoteMethodCall = RemoteCallMethod_pb2.RemoteCallMethod()
        remoteMethodCall.methodName = method_name         
        
        remoteMethodCall.methodArgs = helper.parseToProtobuf(args)
        remoteMethodCall.methodKwargs = helper.parseToProtobuf(kwargs)
        strData = remoteMethodCall.SerializeToString()
        self.client.send(strData)   
        
         
        data = self.client.recv(self.buffsize)
        remoteCallRespon = RemoteCallMethod_pb2.RemoteCallRespon()
        remoteCallRespon.ParseFromString(data)                
        return remoteCallRespon.methodRespon
        



HOST='127.0.0.1'
PORT=5000

remoteCallClient = RemoteCallClient(HOST,PORT)
print remoteCallClient.add(3,4)
#print remoteCallClient.sub(3,4)
服务端代码
'''
Created on 2015-1-12

@author: Administrator
'''
from gevent.server import StreamServer
from tool import RemoteCallMethod_pb2
from tool import ProtobufHelper

class RemoteCallSever:
    buffsize=1024
    def __init__(self,host,port):
        self.server = StreamServer((host,port),self.handle)
        self.server.serve_forever()

    
    def handle(self,socket,address):        
        data = socket.recv(self.buffsize)        
        remoteMethodCall = RemoteCallMethod_pb2.RemoteCallMethod()
        remoteMethodCall.ParseFromString(data)
        
        helper = ProtobufHelper.ProtobufHelper()
        methodName = remoteMethodCall.methodName
        args = helper.parseFromProtobuf(remoteMethodCall.methodArgs)
        kwargs = helper.parseFromProtobuf(remoteMethodCall.methodKwargs)
        
        method = getattr(self,methodName,None)
        
        remoteCallRespon = RemoteCallMethod_pb2.RemoteCallRespon()
        if not callable(method):
            remoteCallRespon.methodRespon = 'no this method'
        else :
            remoteCallRespon.methodRespon = str(method(*args,**kwargs))
        
        strData = remoteCallRespon.SerializeToString()
        socket.send(strData)    

    def add(self,a,b):
        return a+b
    
        
    
HOST='127.0.0.1'
PORT=5000
print "\r" 
remoteCallServer = RemoteCallSever(HOST,PORT)
protobuf帮助类
'''
Created on 2015-1-13

@author: Administrator
'''
class ProtobufHelper:  
    def __init__(self):
        pass 
   
    def parseFromDict(self,values,type):
        typestr = type + ':'
        dictStr = ''
        for value in values:
            if len(dictStr) % 2 == 1:
                dictStr += ':'
            elif len(dictStr) > 0 and len(dictStr) % 2 == 0:
                dictStr += ';'
            dictStr += str(value) 
        return typestr+dictStr
    
    
    def parseFromTuple(self,values,type):
        typestr = type + ':'
        tupleStr = ''        
        for value in values:
            if len(tupleStr) > 0:
                tupleStr += ','
            tupleStr += str(value)
        return typestr+tupleStr
    
   
    def parseToProtobuf(self,values):
        if isinstance(values,dict):
            return self.parseFromDict(values,'dict')
        elif isinstance(values,tuple):
            return self.parseFromTuple(values,'tuple')
        elif isinstance(values,list):
            return self.parseFromTuple(values,'list')
    
    def parseToDict(self,values):
        value = '{' + values + '}' 
        return eval(value)
    
    
    def parseToTuple(self,values):
        value = '(' + values + ')'        
        return eval(value)
    
    def parseToList(self,values):
        value = '[' + values + ']' 
        return eval(value)
        
    def parseFromProtobuf(self,values):
        npos = values.find(':')
        type = values[:npos]
        substr = values[npos+1:]        
        if type == 'tuple' :
            return self.parseToTuple(substr)
        elif type == 'dict' :
            return self.parseToDict(substr)
        elif type == 'list' :
            return self.parseToList(substr)
            
        
协议
package rpcMessage;

message RemoteCallMethod {
	required string methodName = 1;
	required string methodArgs = 2;
	required string methodKwargs = 3;
}

message RemoteCallRespon
{
	required string methodRespon = 1;
}

要注意的几点:
1、当类中无此方法时会进入到__getattr__
2、此时构建数据包进行通信,等待应答
3、远程收到消息后通过method = getattr(self,methodName,None),判断类中有无方法
4、进行应答响应
5、原等待return.



什么样的RPC才是好用的RPC 什么样的RPC才是好用的RPC现在RPC框架很多,但是真正好用的RPC却是少之又少。那么什么是好用的RPC,什么是不好用的RPC呢,有一个评判标准吗?下面是我列举出来的衡量RPC好用与否的几条标准: 真的像本地函数一样调用 使用简单,用户只需要关注业务即可 灵活,RPC调用的序列化方式可以自由定制,比如支持json,支持msgpack等方式 下面来分别解释这几条标准。 标准1:真的像本地函数一样调用 阅读详情

相关推荐

RPCRPC和Http的理解

文章目录一、概述二、RPC2.1、RPC定义2.2、RPC主要组成部分三、影响RPC框架性能的因素四、问题1.面试官:公司使用什么 RPC 框架?,可以介绍一下 RPC 的工作原理吗?2.面试官:服务启动的时候服务基本信息被注册到注册中心,如果服务提供者挂了,注册中心如何知道服务不可用了呢?3.面试官:如果注册中心挂了,比如你用的是 Zookeeper,如果 Zookeeper 挂了,那服务之间还能相互调用吗?4.面试官:你对 RPC 了解的很透彻,那你能否自己写一个 RPC 框架?可以简答描述下思路也行。

AloneYueCSDN 3117

C# Remote通信的

关于C#Remote通信的,中级教程之一。

RPC(Remote Procedure Call)及其应用(java版)

RPC(Remote Procedure Call,远程过程调用) 是一种远程调用程序的技术,它允许程序在不同的地址空间中相互通信,像调用本地函数一样调用远程函数,从而实现分布式应用程序的构建。在 RPC 中,客户端应用程序发送请求消息到远程服务器,服务器接收请求并执行相应的操作,然后将结果返回给客户端。RPC 可以使用多种通信协议,例如 HTTP/RPC、JSON-RPC、XML-RPC 等,这些协议定义了客户端和服务器之间的通信格式。

静坐听雨 2286

RPC介绍与使用

1. 基本的RPC模型 主要介绍RPC是什么,基本的RPC代码,RPC与REST的区别,gRPC使用 1.1 基本概念 RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务 本地过程调用:如果需要将本地student对象的age+1,可以实现一个addAge()方法,将student对象传入,对年龄进行更新之后返回即可,本地方法调用的函数体通过函数指针来指定。 远程过程调用:上述操作的过程中,如果addAge()这个方法在服务端,执行函数的函数体

鳄鱼儿 2977

RPC的详解和使用

一、基础介绍 1.1 为什么需要RPC? 主要就是因为在几个进程内(应用分布在不同的机器上),无法共用内存空间,或者在一台机器内通过本地调用无法完成相关的需求,比如不同的系统之间的通讯,甚至不同组织之间的通讯。此外由于机器的横向扩展,需要在多台机器组成的集群上部署应用等等。 1.2 RPC介绍 1、RPC是实现跨服务之间的远程调用的过程,通过客户端发出请求访问服务端。服务端接收到请求后给客户端的整个过程实现成为RPC,这一整个过程是通过RPC协议来实现的。 2、RPC是基于socket协议来进行数

创作不易,请多支持,将为本站提供更多「有价值的文章」。 1万+

微服务之RPC使用

RPC使用 一、微服务简介 1、小型的服务器; 2、实现分布式的一种解决方案,解耦; 3、举例:王者荣耀技能攻击,如果是分布式需要服务器转,微服务可以看成一个服务控制另外一个服务; 二、微服务和单体式架构的区别 1、单体式架构服务 特性:(1)复杂性随着开发越来越高,遇到问题解决困难; (2)技术债务上升; (3)耦合度高,出现bug不容易排查,解决旧bug,会出现新bug; (4)持续的交付时间长; (5)扩展性差 注:水平扩展:通过增加更多的系统成员来实现扩展(增加车辆运输) 垂直扩展:通过增加单个系

yyq1102394156的博客 853

RPC 的详细使用

关于 Go 语言中 RPC使用

qq_46457076的博客 3938

手写RPC框架(六)

更新事项 暂定目标对启动类进行修改 直接集合

zzzzzzzzzzzyt的博客 461

RPC框架(一)RPC简介

一、概述 二、RPC 2.1、RPC定义 2.2、RPC主要组成部分 三、影响RPC框架性能的因素 四、工业界的 RPC 框架一览 4.1、国内 4.2、国外 五、如何选择RPC框架 一、概述 随着公司规模的扩大,以及业务量的激增,单体应用逐步演化为服务/微服务的架构模式, 服务之间的调用大多采用rpc的方式调用,或者消息队列的方式进行解耦。几乎每个大厂都会创建自己的rp...

keep_trying的专栏 7万+

什么是RPCRPC框架dubbo的核心流程

RPC 是一种进程间通信方式,允许像调用本地服务一样调用远程服务,通信协议大多采用二进制方式。RPC 框架的目标就是让远程服务调用更简单、透明,由 RPC 框架负责屏蔽底层的序列化、传输方式和通信的细节,开发者在使用时只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程。而 Dubbo 是阿里巴巴开源的基于 Java 的 RPC 分布式服务框架,提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。...

张维鹏的博客 3万+

rpc详解rpc框架

在互联网应用开发中,随着业务的复杂度增加,一般都会采用分布式架构。分布式架构的核心,就是利用多台普通的计算机组成一个庞大的复杂计算网络,提供高并发、高性能、高可用的系统能力支撑。在分布式架构中,原本的单体应用服务被拆分成多个独立部署的服务,分布式在计算机网络上,这些服务必然,需要通过网络进行数据通信和交互。而RPC框架,就是解决在分布式架构中,各个服务之间的网络通信问题的框架。在Java应用中,JDK 1.1版本的时候就提供了对RPC的支持框架,叫做RMI。由于RMI不能实现跨域语言的远程调用。

刘皇叔说Java的博客 7042

RPCRPC基本介绍

0. RPC是什么 1. RPC的核心组成部分 1.1 服务调用方(Consumer) 1.2 服务提供方(Provider) 1.3 本地存根(stub) 1.4 RPC通信者(RPCRuntime) 2. RPC调用过程 2.1 服务暴露的过程 2.2 服务发现的过程 2.3 服务引用的过程 2.4 方法调用的过程......

一定要站在自己热爱的生活里闪闪发光 3万+

什么是RPC

一个阳光明媚的早晨,老婆又在翻看我订阅的技术杂志。 “老公,什么是RPC呀,为什么你们程序员那么多黑话!”,老婆还是一如既往的好奇。 “RPC,就是Remote Procedure Call的简称呀,翻译成中文就是远程过程调用嘛”,我一边看着书,一边漫不经心的回答着。 “啥?你在说啥?谁不知道翻译成中文是什么意思?你个废柴,快给我滚去洗碗!” “我去。。。”,我如梦初醒,我对面坐着的可不是一个程序...

github_37882837的博客 8316

什么是RPC?有哪些RPC框架?

RPC(Remote Procedure Call,远程过程调用)是一种允许运行在一台计算机上的程序调用另一台计算机上子程序的技术。这种技术屏蔽了底层的网络通信细节,使得程序间的远程通信如同本地调用一样简单。RPC机制使得开发者能够构建分布式计算系统,其中不同的组件可以分布在不同的计算机上,但它们之间可以像在同一台机器上一样相互调用。

yuiezt的专栏 1万+

什么是 RPC?RPC原理是什么?

什么是 RPC?RPC原理是什么? 什么是 RPCRPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务 A、B 部署在两台不同的机器上,那么服务 A 如果想要调用服务 B 中的某个方法该怎么办呢?使用 HTTP请求 当然可以,但是可能会比较慢而且一些优化做的并不好。 RPC 的出现...

javaDB_EAD的专栏 7190

RPC入门教学(一) ———— RPC介绍与protobuf的介绍与使用

RPC(Remote Procedure Call,远程过程调用)是一种允许程序调用另一台计算机上的子程序或函数的协议,而无需程序员显式地进行底层网络编程。RPC的目标是让开发者在编写分布式应用时,可以像调用本地函数一样简单地调用远程服务,隐藏了网络通信的复杂性。gRPC(Google Remote Procedure Call)是Google开发的一个高性能、开源和通用的远程过程调用(RPC)框架。它旨在使客户端能够像调用本地对象一样轻松地调用不同服务器上的远程服务,从而简化分布式应用和服务的构建。

qq_73924465的博客 1674

RPC的入门应用

RPC的入门应用 一、什么是RPC RPC 的全称是 Remote Procedure Call ,是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即无论是调用本地接口/服务的还是远程的接口/服务,本质上编写的调用代码基本相同。 说起RPC,就不能不提到分布式,这个促使RPC诞生的领域。 假设你有一个计算器接口,Calculator模块,以及它的实现类CalculatorImpl,那么在系统还是单体应用时,你要调

蜗牛在奔跑的博客 376

【Go语言】RPC 使用指南(初学者版)

import ("errors""log""net""net/rpc"// 定义服务结构体// 定义服务方法// 注意:方法必须满足以下条件:// 1. 方法是导出的(首字母大写)// 2. 有两个参数,都是导出类型或内建类型// 3. 第二个参数是指针// 4. 返回 error 类型return nilreturn nil// 定义参数结构体A, B int// 定义返回结构体创建。

言之。 1万+
上一篇: protobuf 的使用
下一篇: 软件开发的规范
缥缈的云
博客等级 码龄15年 94粉丝 179原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值