首页 > 系统相关 >RPC,远程连接Linux开发

RPC,远程连接Linux开发

时间:2023-05-06 17:48:03浏览次数:43  
标签:__ self queue RPC Linux print data 远程 def

RPC

​ 指远程过程调用

eg:

​ 两台服务器,A ,B, A想要调用B服务器上的应用的函数或方法,但是他两不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据,只要调用成功这就称为RPC调用.

主要应用在 分布式系统当中与微服务。

由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用,可以在不同语言中调用。

集群与分布式的区别

集群: 在多台机器上部署一个项目

分布式: 在多台机器上部署多个服务组成一个项目

常见的RPC框架

dubbo Java上用的只支持java与java通信

gRpc 谷歌开源的,支持跨语言。用go写的通过python来调用

python实现RPC

SimpleXMLRPCServer python自带的模块

ZeroRPC 第三方模块

SimpleXMLRPCServer实现

server.py
from xmlrpc.server import SimpleXMLRPCServer

# 通信格式使用xml

class RPCserver(object):
    def __init__(self):
        super(RPCserver,self).__init__()
        print(self)
        self.send_data = 'lxj nb'
        self.recv_data = None

    def getObj(self):
        print('get_obj')
        return self.send_data

    def sendObj(self,data):
        print('send_obj')
        self.recv_data = data
        print(self.recv_data)

server = SimpleXMLRPCServer(('localhost', 8080),allow_none=True)
server.register_introspection_functions()
server.register_instance(RPCserver())
# 启动服务监听函数
server.serve_forever()
client.py
import time
from xmlrpc.client import ServerProxy

def xmlrpc_client():
    print('xmlrpc_client')
    c = ServerProxy('http://localhost:8080')

    res = c.getObj()
    print(res)
    res1 = c.sendObj('lxj sgdsb')
    print(res1)

    # 案例
    # data = 'lxj nb'
    # start=time.time()
    # for i in range(500):
    #     a=c.getObj()
    #     print(a)
    # for i in range(500):
    #     c.sendObj(data)
    # print(time.time()-start)

if __name__ == '__main__':
    xmlrpc_client()

ZeroRPC来实现

比SimpleXMLRPCServer 速度快,本质是用了一个消息队列

server.py
import zerorpc

class RPCServer(object):

    def __init__(self):
        super(RPCServer, self).__init__()
        print(self)
        self.send_data = 'lqz nb'
        self.recv_data = None

    def getObj(self):
        print('get data')
        return self.send_data

    def sendObj(self, data):
        print('send data')
        self.recv_data = data
        print(self.recv_data)
# zerorpc
s = zerorpc.Server(RPCServer())
s.bind('tcp://0.0.0.0:4243')
s.run()
client.py
import zerorpc
import time
# zerorpc
def zerorpc_client():
    print('zerorpc client')
    c = zerorpc.Client()
    c.connect('tcp://127.0.0.1:4243')
    data = 'lqz nb'

    start = time.time()
    for i in range(500):
        a=c.getObj()
        print(a)
    for i in range(500):
        c.sendObj(data)

    print('total time %s' % (time.time() - start))


if __name__ == '__main__':
    zerorpc_client()

rabbitMQ实现RPC

Client.py
import pika
import uuid


class FibonacciRpcClient(object):
    def __init__(self):
        credentials = pika.PlainCredentials("admin", "admin")
        self.connection = pika.BlockingConnection(pika.ConnectionParameters('10.0.0.101', credentials=credentials))
        self.channel = self.connection.channel()

        # 随机生成一个消息队列(用于接收结果)
        result = self.channel.queue_declare(queue='', exclusive=True)
        self.callback_queue = result.method.queue

        # 监听消息队列中是否有值返回,如果有值则执行 on_response 函数(一旦有结果,则执行on_response)
        self.channel.basic_consume(queue=self.callback_queue, on_message_callback=self.on_response, auto_ack=True)

    def on_response(self, ch, method, props, body):
        if self.corr_id == props.correlation_id:
            self.response = body

    def call(self, n):
        self.response = None
        self.corr_id = str(uuid.uuid4())

        # 客户端 给 服务端 发送一个任务:  任务id = corr_id / 任务内容 = '30' / 用于接收结果的队列名称
        self.channel.basic_publish(exchange='',
                                   routing_key='rpc_queue',  # 服务端接收任务的队列名称
                                   properties=pika.BasicProperties(
                                       reply_to=self.callback_queue,  # 用于接收结果的队列
                                       correlation_id=self.corr_id,  # 任务ID
                                   ),
                                   body=str(n))
        while self.response is None:
            self.connection.process_data_events()

        return self.response


fibonacci_rpc = FibonacciRpcClient()

response = fibonacci_rpc.call(9)
print('返回结果:', response)

server.py
import pika
credentials = pika.PlainCredentials("admin","admin")
connection = pika.BlockingConnection(pika.ConnectionParameters('10.0.0.101',credentials=credentials))
channel = connection.channel()

# 声明一个队列rpc_queue
channel.queue_declare(queue='rpc_queue')

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)

def on_request(ch, method, props, body):
    n = int(body)

    print(" [.] fib(%s)" % n)
    response = fib(n)

    ch.basic_publish(exchange='',
                     routing_key=props.reply_to,
                     properties=pika.BasicProperties(correlation_id = \
                                                         props.correlation_id),
                     body=str(response))
    ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_qos(prefetch_count=1)
channel.basic_consume(queue='rpc_queue', on_message_callback=on_request)

print(" [x] Awaiting RPC requests")
channel.start_consuming()

远程连接lunux开发

linux开发 linux部署

  1. 在电脑上直接装ubuntu

    1. 在电脑上转虚拟机 ,虚拟机装ubuntu 在ubuntu开发
      3. 电脑装win 然后装centos虚拟机, 在电脑上的windows系统远程连接centos开发。

pycharm操作步骤

image

image

image

image

进去以后填写Linux的账号密码
然后就可以写代码啦,写好了之后可以更新到Linux里
可以直接用Linux的python环境来开发
image

image
image

标签:__,self,queue,RPC,Linux,print,data,远程,def
From: https://www.cnblogs.com/LiaJi/p/17378095.html

相关文章

  • linux 下安装和使用Elasticsearch8+php的操作
    首先安装Elasticsearch8版本不需要jdk环境,就是JVAV的环境,他本身的压缩文件里就包含了固定的jdk去官网1、下载Elasticsearch的官方地址:https://www.elastic.co/cn/下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch我这里下载的是elasticsearch-8.......
  • Rocky Linux 9 GitLab 部署
    1、环境8核/16G内存/500G硬盘当前gitlab暂不支持RockyLinux9,不过可以使用AlmaLinux8的安装源进行安装2、安装依赖#安装依赖dnfinstall-ycurlpolicycoreutilsopenssh-serverperlpostfix#启动邮件服务systemctlenable--nowpostfix3、安装源配置(......
  • Linux 系统的目录结构
    Linux系统的目录结构如下:•/(根目录):整个文件系统的根目录。•/bin:存放着最重要的命令二进制文件。•/boot:存放启动Linux时使用的一些核心文件,如内核、引导程序等。•/dev:设备文件目录,存放设备节点文件。•/etc:系统配置文件目录。•/home:用户主目录所在地。......
  • Linux 系统进程守护工具 cesi + superviosr
    一、安装Supervisorpipinstallsupervisor使用echo_supervisord_conf命令生成默认配置文件echo_supervisord_conf>/etc/supervisord.conf配置文件说明位置:etc/supervisord.conf内容:#指定了socketfile的位置[unix_http_server]file=/tmp/supervisor.sock;UNIXsock......
  • LINUX系统的快捷键是什么?
    1、终端及标签页快捷键快捷键功能Shift+Ctrl+T新建标签页Shift+Ctrl+W关闭标签页Ctrl+PageUp前一标签页Ctrl+PageDown后一标签页Shift+Ctrl+PageUp标签页左移Shift+Ctrl+PageDown标签页右移Alt+1切换到标签页1Alt+2切换到标签页2Alt+3切......
  • 远程桌面解决方案推荐
    有时候,我们需要通过远程桌面工具远程其他电脑设备。这里给大家推荐一些流行的远程桌面解决方案及其性能、安全性和价格:TeamViewerTeamViewer是一种广泛使用的远程桌面解决方案,可提供安全的远程访问和协作功能。它具有强大的加密和双因素身份验证功能,可增强安全性。此外,它支......
  • [Event] Linux con Japan 2015
    日本每年都举办一次LinuxCon,下面是今年的Event及对应的ppthttp://events.linuxfoundation.jp/events/linuxcon-japan粗粗看了一下,竟然还有这么一个主题。HowChinainvolvedinOpenSourceMovement不过幻灯片让人大跌眼镜,讲演怎么样姑且不论,这内容也太少了。http://eve......
  • 如何在Linux下写汇编
    http://docs.cs.up.ac.za/programming/asm/derick_tut/1.NASM编译器目前Linux下的汇编器主要有:as、as86和gas,但是本文使用的是NASM(TheNetwideAssembler)。它使用Intel形式的汇编格式,和Intel形式相对的是AT&T形式的汇编格式。2.Linux下汇编介绍2.1DOS和Linux下汇编的主要不同(1)DOS......
  • 查看Linux系统版本内核命令大全
    目录命令一:查看当前系统发行版本详细信息命令二:查看当前系统内核信息命令三:查看当前系统版本信息命令四:查看CPU相关信息命令五:查看系统位数Linux系统内核、发行版本有很多,那么如何查看当前Linux系统的内核信息、Linux系统发行版本等信息呢?Linux百科网分享查询Linux系统详细信息的方......
  • Portainer连接远程Docker
    介绍Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。而且完全免费,基于容器化的安装方式,方便高效部署。官方站点:https://www.portainer.io/连接远程Docker1、配置远程Docker端口vim/usr/lib/systemd/system/docker.service......