首页 » 网站推广 » 国美php面试题技巧_小白入门微做事1RPC 初体验pythonnodejs互调

国美php面试题技巧_小白入门微做事1RPC 初体验pythonnodejs互调

访客 2024-10-29 0

扫一扫用手机浏览

文章目录 [+]

概述

序言什么是 RPCRPC 事理常用 RPC 框架比拟thrift 根本python、nodejs 互调后记

序言

国美php面试题技巧_小白入门微做事1RPC 初体验pythonnodejs互调

上一篇文章中,我们初步理解了什么是微做事,那么我们这次来体验一下微做事中是怎么通信的。

国美php面试题技巧_小白入门微做事1RPC 初体验pythonnodejs互调
(图片来自网络侵删)

什么是 RPC

Remote Procedure Call,即为 -- 远程过程调用。
普通地阐明一下:你有 A、B 两台电脑,A 电脑用 python 实现了一个加法运算,此时此刻 B 电脑有一个用 Java 实现的程序,想调用 A 电脑的加法运算程序。
然而,内存空间不在同一台电脑,且编程措辞也不相同,如何调用呢?此时此刻就用网络来表达调用的语义与调用参数。
当然,现在我们不用自己去实现这些东西,当下有很多成熟的 RPC 框架供我们选择。

RPC 事理

什么都别说,先上图。

RPC 事理

在往下看之前,我们先来理解一下:stub

stub 规定了 server 能够供应什么做事,这在 server 和 client 上是同等的。

RPC 调用链笔墨描述:

(1)client 以本地调用办法调用做事;

(2)client stub 吸收到调用后卖力将方法、参数等组装成能够进行网络传输的体;

(3)client stub 找到做事地址,并将发送到做事端;

(4)server stub 收到后进行解码;

(5)server stub 根据解码结果调用本地的做事;

(6)server 实行方法并将结果返回给 server stub;

(7)server stub 将返回结果打包成并发送至 client;

(8)client stub 吸收到,并进行解码;

(9)client 得到终极结果。

RPC 调用链:

(1)client 发起要求:rpc call --> send --> network

(2)server 接管要求:network --> receive --> local call

(3)server 返回结果:local return --> send --> network

(4)client 吸收结果:network --> receive --> rpc return

以上便是 RPC 的事理,须要解释的是,它是同步调用的。

常用 RPC 框架比拟

以下笔墨为引用自(https://colobu.com/2016/09/05/benchmarks-of-popular-rpc-frameworks/)文章的描述:

Dubbo 是阿里巴巴公司开源的一个 Java 高性能精良的做事框架,使得运用可通过高性能的 RPC 实现做事的输出和输入功能,可以和 Spring框架无缝集成。
不过,略有遗憾的是,听说在淘宝内部,dubbo 由于跟淘宝另一个类似的框架 HSF(非开源)有竞争关系,导致 dubbo 团队已经终结(拜会http://www.oschina.net/news/55059/druid-1-0-9 中的评论),反到是当当网的扩展版本仍在持续发展,墙内着花墙外喷鼻香。
其它的一些有名电商如当当、京东、国美掩护了自己的分支或者在 dubbo 的根本开拓,但是官方的库缺少掩护,干系的依赖类比如 Spring,Netty 还是很老的版本(Spring 3.2.16.RELEASE, netty 3.2.5.Final),倒是有些网友写了升级 Spring 和 Netty 的插件。

rpcx 是Go措辞生态圈的 Dubbo, 比 Dubbo 更轻量,实现了 Dubbo 的许多特性,借助于Go措辞精良的并发特性和简洁语法,可以利用较少的代码实现分布式的 RPC 做事。

gRPC 是 Google 开拓的高性能、通用的开源 RPC 框架,其由 Google 紧张面向移动运用开拓并基于 HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开拓,且支持浩瀚开拓措辞。
本身它不是分布式的,以是要实现上面的框架的功能须要进一步的开拓。

thrift 是 Apache 的一个跨措辞的高性能的做事框架,基于 thrift 进行序列化。
也得到了广泛的运用。

个中比较受关注的是:grpc 与 thrift 。

grpc 支持的措辞:

C++C#DartGoJavaNode.jsObjective-CPHPPythonRuby

thrift 支持的措辞:

C++JavaPythonPHPRubyErlangPerlHaskellC#CocoaJavaScripNode.jsSmalltalkOCamlDelphi

thrift 根本

实现两门措辞的相互调用,这里选用 thrift 框架,接下来会大略先容一下 thrift 的用法,并编码实现一个 python 与 nodejs 相互调用的程序。
下面大略先容下 thrift 语法。

基本数据类型:

bool: 布尔类型(true / false)byte: 8位带符号整数i16: 16位带符号整数i32: 32位带符号整数i64: 64位带符号整数double: 64位浮点数string: 采取UTF-8编码的字符串map<t1,t2> 键值对list<t1> 列表set<t1> 凑集

构造:

struct User {1: i32 uid,2: string name,3: string age,4: string sex}

service,对外扩展的接口:

service UserStorage {void addUser(1: User user),User getUser(1: i32 uid)}

末了,利用 thrift 命令天生相应的接口文件:

thrift -out ../python --gen py test.thriftthrift -out 存储路径 --gen 接口语言 thrift 文件名

python、nodejs 互调

OK,语法差不多都熟习了,那么我们来实践一下:

项目构造图

个中绿色框框为我们自己新建的代码,赤色框框为 thrift 天生的代码,我们调用就行。

我们先来看相互调用的结果:

先看看 python 为做事端,nodejs 为客户真个调用情形:

python 做事端

nodejs 客户端

在看看,nodejs 为做事端,python 为客户真个情形:

nodejs 做事端

python 客户端

createThrift.sh

#!/bin/bashcd thriftthrift -out ../nodejs --gen js:node test.thriftthrift -out ../python --gen py test.thrift

test.thrift

天生赤色框框的 thrift 接口代码文件。

struct Student{1: string name,2: string age}service UserService{ void addStu(1: Student stu), Student getStu(1: string name)}

python server

from python.test import UserServicefrom thrift.transport import TSocketfrom thrift.transport import TTransportfrom thrift.protocol import TBinaryProtocolfrom thrift.server import TServerstus = {}class TestHandler: def addStu(self, stu): print(\"大众我是 python 做事器,我的 addStu() 方法被调用了.\公众) stus[stu.name] = stu # print(\"大众add new student : \公众 + stu.name) def getStu(self, name): print(\"大众我是 python 做事器,我的 getStu() 方法被调用了.\"大众) print(\"大众get student : \"大众 + name) return stus[name]# 创建做事端handler = TestHandler()processor = UserService.Processor(handler)# 监听端口transport = TSocket.TServerSocket(\"大众127.0.0.1\"大众, 3000)# 选择传输层tfactory = TTransport.TBufferedTransportFactory()# 选择传输协议pfactory = TBinaryProtocol.TBinaryProtocolFactory()# 创建做事端server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)print(\"大众Starting thrift server in python...\公众)server.serve()

python client

from python.test import UserServicefrom thrift.transport import TSocketfrom thrift.transport import TTransportfrom thrift.protocol import TBinaryProtocol__HOST = '127.0.0.1'__PORT = 3000tsocket = TSocket.TSocket(__HOST, __PORT)transport = TTransport.TBufferedTransport(tsocket)protocol = TBinaryProtocol.TBinaryProtocol(transport)# 穿件客户端client = UserService.Client(protocol)# thrift 天生的的 Student 构造stu = UserService.Student(\"大众zone\公众, \"大众18\"大众)transport.open()# 调用做事端 addStu() 方法print(\"大众我是 python 客户端,我调用了 addStu() 方法.\"大众)client.addStu(stu)# 调用做事端 getStu() 方法print(\公众我是 python 客户端,我调用了 getStu() 方法.\"大众)print(\"大众返回的结果为:\"大众 + client.getStu(\公众zone\"大众))transport.close()

nodejs server

var thrift = require(\公众thrift\"大众);var UserService = require('../UserService.js');var ttypes = require('../test_types');var stus = {}var server = thrift.createServer(UserService, { addStu: function (stu, callback) { console.log(\"大众我是 nodejs 做事器,我的 addStu() 方法被调用了.\"大众); stus[stu.name] = stu console.log(stu); callback(); }, getStu: function (name, callback) { console.log(\"大众我是 nodejs 做事器,我的 getStu() 方法被调用了.\公众); callback(null, stus[name]) } });// 启动做事server.listen(3000);console.log(\"大众nodejs server start\"大众);server.on(\"大众error\"大众, function (e) { console.log(e);});

nodejs client

var thrift = require('thrift');var UserService = require('../UserService.js');var ttypes = require('../test_types');var connection = thrift.createConnection('127.0.0.1', 3000);var client = thrift.createClient(UserService, connection);connection.on(\公众error\"大众, function (e) { console.log(e);});var stu = new ttypes.Student({name: \公众zone-nodejs\"大众, age: \"大众23\"大众});// 调用做事端 addStu() 方法client.addStu(stu, function (err, res) { if (err) { console.log(err); return } console.log(\公众我是 nodejs 客户端,我调用了 addStu() 方法.\公众)})// 调用做事端 getStu() 方法client.getStu(\公众zone-nodejs\"大众, function (err, res) { if (err) { console.log(err); return } console.log(\"大众我是 nodejs 客户端,我调用了 getStu() 方法.\"大众) console.log(\公众返回的结果为:\"大众 + res)})

后记

微做事中,RPC 框架的性能是很主要的,由于一旦要做微做事,便是成百上千个微做事的,这涉及到各个微做事之间的通信问题。
通信慢了,那么整体的相应速率也就相对慢很多了。
下一篇文章讲一讲行列步队,敬请期待!

个人的知识储备总是有限的,如有缺点的地方,还请大佬斧正。
点击阅读原文,链接到我的知乎,我会在知乎上对文章缺点的地方进行修正。

往期推举:

小白入门微做事(0) - 什么是微做事

秋招季,用Python剖析深圳程序员人为有多高?

用Python见告你深圳房租有多高

标签:

相关文章

php本年雇用技巧_进编239名招聘通知书记

海南热带海洋学院、三亚市直属学校海南省各级疾病预防掌握中央育才生态区管理委员会正在招聘快来看看有没有你心仪的岗位👇01海南热带海洋...

网站推广 2024-12-08 阅读0 评论0