首页 » 网站推广 » phpmicrogrpc技巧_gRPC若何节省您的开拓时间

phpmicrogrpc技巧_gRPC若何节省您的开拓时间

访客 2024-10-23 0

扫一扫用手机浏览

文章目录 [+]

此时,您该当已经听说过" gRPC"(标题中至少一次)。
在本文中,我将着重先容采取gRPC作为微做事之间的通信介质的好处。

首先,我将考试测验简要先容一下架构演化的历史。
其次,我将重点先容利用REST(作为媒介)和可能涌现的问题。
第三,gRPC启动。
末了,我将以我的开拓事情流程为例。

phpmicrogrpc技巧_gRPC若何节省您的开拓时间 phpmicrogrpc技巧_gRPC若何节省您的开拓时间 网站推广

架组成长简史

本节将列出并谈论每种体系构造的优缺陷(着重于基于Web的运用程序)

phpmicrogrpc技巧_gRPC若何节省您的开拓时间 phpmicrogrpc技巧_gRPC若何节省您的开拓时间 网站推广
(图片来自网络侵删)
整体式

统统都在一个包中。

优点:

· 随意马虎上手

· 单一代码库可知足所有需求

缺陷:

· 难以扩展(部分)

· 加载做事器(做事器端渲染)

· 不良的用户体验(加载韶光长)

· 难以扩展的开拓团队

Monolith architecture

Inside monolith architecture

Monolith v2(前端-后端)

前端逻辑和后端逻辑之间的清晰分隔。
后端仍旧弘大。

优点:

· 可以将团队分为前端和后端

· 更好的用户体验(客户真个前端逻辑(运用程序))

缺陷:

· [仍旧]难以扩展(部分)

· [仍旧]难以扩展的开拓团队

Frontend-Backend architecture

微做事

每一件事物一项做事(包)。
利用网络在每个软件包之间进行通信。

优点:

· 可扩展的组件

· 可扩展团队

· 灵巧的措辞选择(如果利用标准通讯办法)

· 独立支配/修复每个软件包

缺陷:

· 先容网络问题(通信之间的等待韶光)

· 做事之间进行通信所需的文档,协议

· 如果利用共享数据库,则难以识别缺点

Micro-service architecture with shared database

Micro-service architecture with standalone database per service

REST(作为媒介)和可能涌现的问题

REST(基于HTTP的JSON)由于易于利用,是当前做事之间通信的最盛行办法。
利用REST使您可以灵巧地为每种做事利用任何措辞。

Typical REST call

但是,灵巧性会带来一些陷阱。
开拓职员之间须要非常严格的协议。
下面的草图展示了一个非常常见的场景,常日在开拓过程中发生。

Developer A want Developer B to make a service

Bad request

Expectation vs Actual

问题:

· 依赖人类的赞许

· 依赖文档(须要掩护/更新)

· 从协议到协议(这两种做事)都须要大量的"格式化,解析"

· 大多数开拓韶光都花在了协议和格式化上,而不是业务逻辑上

gRPC启动

gRPC是可以在任何环境中运行的当代开源高性能RPC框架。

什么是RPC? RPC代表远程过程调用。
它是一种协议,一个程序可用于从网络上另一台打算机上的程序要求做事,而无需理解网络的详细信息。

Remote Procedure Call

以REST为媒介的RPC

利用做事创建者供应的RPC客户端/库将确保调用做事时的精确性。
如果我们要利用RPC和REST作为媒介,则开拓职员B必须编写客户端代码供开拓职员A利用。
如果两个开拓职员都利用不同的选择措辞,那么这对开拓职员B来说是一个紧张问题,由于他须要用他不习气的另一种措辞来编写PRC客户。
而且,如果不同的做事也须要利用做事B,则开拓职员B将不得不用费大量韶光来利用不同的措辞来制作RPC客户端,并且必须对其进行掩护。

原虫?

协议缓冲区是Google的措辞无关,平台无关的可扩展机制,用于序列化构造化数据。
gRPC利用protobuf作为定义数据构造和做事的措辞。
您可以将其与REST做事的严格文档进行比较。
Protobuf语法非常严格,因此机器可以进行编译。

下面的代码块是一个大略的原始文件,描述了一个大略的待办事项做事以及用于通信的数据构造。

用于定义数据构造的" message"关键字

用于定义做事的" service"关键字

" rpc"关键字,用于定义做事功能

syntax = "proto3";package gogrpcspec;message Employee { string name = 1;}message Task { Employee employee = 1; string name = 2; string status = 3;}message Summary { int32 todoTasks = 1; int32 doingTasks = 2; int32 doneTasks = 3;}message SpecificSummary { Employee employee = 1; Summary summary = 2;}service TaskManager { rpc GetSummary(Employee) returns (SpecificSummary) {} rpc AddTask(Task) returns (SpecificSummary) {} rpc AddTasks(stream Task) returns(Summary) {} rpc GetTasks(Employee) returns (stream Task) {} rpc ChangeToDone(stream Task) returns (stream Task) {}}

将原始代码编译为做事器代码

由于protobuf非常严格,因此我们可以利用" protoc"将proto文件编译为做事器代码。
编译后,您须要对实在行真实的逻辑。

protoc --go_out=plugins=grpc:. ${pwd}/proto/.proto

\--proto_path=${pwd}

编译原始代码到客户端代码

有了proto文件,我们可以利用" protoc"将其客户端代码编译为许多盛行的措辞:C#,C ++,Dart,Go,Java,javascript,Objective-C,PHP,Python,Ruby等。

gRPC rpc类型

gRPC支持多种rpc类型(不过,在本文中我不会强调)

· 一元RPC(要求-相应)

· 客户端流式RPC

· 做事器流式RPC

· 双向流式RPC

开拓流程

为了在各个团队之间采取gRPC,我们须要一些东西。

· 集中式代码库(用于做事之间通信的gRPC规范)

· 自动天生代码

· 做事用户(客户)可以通过软件包管理器利用天生的代码(用于他们选择的措辞),例如。
去获取/点安装

此示例的代码可以在此仓库中找到:

- https://github.com/redcranetech/grpcspec-example

- https://github.com/redcranetech/grpc-go-example

- https://github.com/redcranetech/grpc-python-example

代码库的构造

.├── HISTORY.md├── Makefile├── README.md├── genpyinit.sh├── gogrpcspec //go generated code here│ └── ...├── proto│ └── todo.proto├── pygrpcspec //python generated code here│ ├── ...└── setup.py

git钩子

我将设置githook,以便在提交之前自动天生内容。
如果得当,您可以利用CI(drone / gitlab / jenkins /…)。
(利用githook的缺陷是每个开拓职员都须要先配置githook)

您须要一个目录(文件夹)来保留预提交脚本。
我称之为" .githooks"

$ mkdir .githooks$ cd .githooks/$ cat <<EOF > pre-commit#!/bin/shset -emake generategit add gogrpcspec pygrpcspecEOF$ chomd +x pre-commit

预提交脚本将触发Makefile并git添加2个目录(gogrpcsepc,pygrpcspec)

为了使githooks正常事情,开拓职员必须运行以下git config命令:

$ git config core.hooksPath .githooks

我们将此命令添加到Makefile中,以使开拓职员可以轻松地运行此命令(称为" make init")。
Makefile的内容应如下所示。

# content of: Makefileinit: git config core.hooksPath .githooksgenerate: # TO BE CONTINUE

产生程式码

我们已经设置了githooks来运行Makefile(" make generate")。
让我们深入理解将自动天生代码的命令。
本文将重点先容两种措辞-go,python

天生go代码

我们可以利用protoc将.proto文件编译成go代码。

protoc --go_out=plugins=grpc:. ${pwd}/proto/.proto \--proto_path=${pwd}

我们将改为通过docker利用protoc(为了便于开拓职员利用)

docker run --rm -v ${CURDIR}:${CURDIR} -w ${CURDIR} \

znly/protoc \

--go_out=plugins=grpc:. \

${CURDIR}/proto/.proto \

--proto_path=${CURDIR}

看一下下面的generate命令(我们将删除,天生并将代码移动到适当的文件夹中)

# content of: Makefileinit: git config core.hooksPath .githooksgenerate: # remove previously generated code rm -rf gogrpcspec/ # generate go code docker run --rm -v ${CURDIR}:${CURDIR} -w ${CURDIR} \ znly/protoc \ --go_out=plugins=grpc:. \ ${CURDIR}/proto/.proto \ --proto_path=${CURDIR} # move generated code into gogrpcspec folder mv proto/.go gogrpcspec

天生代码后,希望将代码用于做事器或客户真个存根以调用做事的用户(开拓职员)可以利用go get命令下载

go get -u github.com/redcranetech/grpcspec-example

然后用

import pb "github.com/redcranetech/grpcspec-example/gogrpcspec"

天生python代码

我们可以利用protoc将.proto文件编译成python代码。

protoc --plugin=protoc-gen-grpc=/usr/bin/grpc_python_plugin \

--python_out=./pygrpcspec \

--grpc_out=./pygrpcspec \

${pwd}/proto/.proto \

--proto_path=${pwd}

我们将改为通过docker利用protoc(为了便于开拓职员利用)

docker run --rm -v ${CURDIR}:${CURDIR} -w ${CURDIR} \

znly/protoc \ --plugin=protoc-gen-grpc=/usr/bin/grpc_python_plugin \

--python_out=./pygrpcspec \

--grpc_out=./pygrpcspec \

${CURDIR}/proto/.proto \

--proto_path=${CURDIR}

为了使天生的代码进入python包以通过pip安装,我们须要实行额外的步骤:

· 创建setup.py

· 修正天生的代码(天生的代码利用文件夹名称导入,但我们将其变动为相对名称)

· 文件夹须要包含" init.py",以暴露天生的代码

利用以下模板创建setup.py文件:

# content of: setup.pyfrom setuptools import setup, find_packageswith open('README.md') as readme_file: README = readme_file.read()with open('HISTORY.md') as history_file: HISTORY = history_file.read()setup_args = dict( name='pygrpcspec', version='0.0.1', description='grpc spec', long_description_content_type="text/markdown", long_description=README + '\n\n' + HISTORY, license='MIT', packages=['pygrpcspec','pygrpcspec.proto'], author='Napon Mekavuthikul', author_email='napon@redcranetech.com', keywords=['grpc'], url='https://github.com/redcranetech/grpcspec-example', download_url='')install_requires = [ 'grpcio>=1.21.0', 'grpcio-tools>=1.21.0', 'protobuf>=3.8.0']if __name__ == '__main__': setup(setup_args, install_requires=install_requires)

产生__init__.py

pygrpcspec文件夹的__init__.py必须是

# content of: pygrpspec/__init__.pyfrom . import proto__all__ = [ 'proto']

并且pygrpcspec / proto文件夹的__init__.py必须是

# content of: pygrpspec/proto/__init__.pyfrom . import todo_pb2from . import todo_pb2_grpc__all__ = [ 'todo_pb2', 'todo_pb2_grpc',]

为了使开拓职员能够添加更多.proto文件并自动天生__init__.py,一个大略的shell脚本可以办理此问题

# content of: genpyinit.shcat <<EOF >pygrpcspec/__init__.pyfrom . import proto__all__ = [ 'proto']EOFpyfiles=($(ls pygrpcspec/proto | sed -e 's/\..$//'| grep -v __init__))rm -f pygrpcspec/proto/__init__.pyfor i in "${pyfiles[@]}"do echo "from . import $i" >> pygrpcspec/proto/__init__.pydoneecho "__all__ = [" >> pygrpcspec/proto/__init__.pyfor i in "${pyfiles[@]}"do echo " '$i'," >> pygrpcspec/proto/__init__.pydoneecho "]" >> pygrpcspec/proto/__init__.py

修正天生的代码

(如果您不太熟习python模块,则可以跳过此阅读)

我们希望将每个"从原始导入"变动为"从"。
入口"。
这背后的缘故原由是由于我们将数据类型,做事存根都放在同一目录中,并且为了在模块外部调用模块,每个内部引用都该当是相对的。

sed -i -E 's/^from proto import/from . import/g' .py

此时,您的Makefile该当如下所示:

# content of: Makefileinit: git config core.hooksPath .githooksgenerate: # remove previously generated code rm -rf gogrpcspec/ # generate go code docker run --rm -v ${CURDIR}:${CURDIR} -w ${CURDIR} \ znly/protoc \ --go_out=plugins=grpc:. \ ${CURDIR}/proto/.proto \ --proto_path=${CURDIR} # move generated code into gogrpcspec folder mv proto/.go gogrpcspec # remove previously generated code rm -rf pygrpcspec/ # generate python code docker run --rm -v ${CURDIR}:${CURDIR} -w ${CURDIR} \ znly/protoc \ --plugin=protoc-gen-grpc=/usr/bin/grpc_python_plugin \ --python_out=./pygrpcspec \ --grpc_out=./pygrpcspec \ ${CURDIR}/proto/.proto \ --proto_path=${CURDIR} # generate __init__.py sh genpyinit.sh # modify import using sed docker run --rm -v ${CURDIR}:${CURDIR} -w ${CURDIR}/pygrpcspec/proto \ frolvlad/alpine-bash \ bash -c "sed -i -E 's/^from proto import/from . import/g' .py"

天生代码后,希望将代码用于做事器或客户真个存根以调用做事的用户(开拓职员)可以利用pip命令下载

pip install -e git+https://github.com/redcranetech/grpcspec-example.git#egg=pygrpcspec

然后用

from pygrpcspec.proto import todo_pb2_grpcfrom pygrpcspec.proto import todo_pb2

综上所述,由于protobuf的语法严格性可以将gRPC编译成多种不同措辞的客户端代码,因此gRPC是在微做事之间进行通信的一种绝佳办法。

All codes in this article:

- https://github.com/redcranetech/grpcspec-example

- https://github.com/redcranetech/grpc-go-example

- https://github.com/redcranetech/grpc-python-example

(本文翻译自Napon Mekavuthikul的文章《gRPC and why it can save you development time》,参考:https://medium.com/red-crane/grpc-and-why-it-can-save-you-development-time-436168fd0cbc)

标签:

相关文章

介绍网站打开速度慢之谜,原因与解决之路

在信息化时代,网站已经成为人们获取信息、交流互动的重要平台。许多用户在浏览网站时常常遇到打开速度慢的问题,这不仅影响了用户的体验,...

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

介绍网络文章不显示的真相与应对步骤

随着互联网的快速发展,网络文章已经成为人们获取信息、了解世界的重要途径。在享受便捷阅读的我们也常常遇到文章不显示的困扰。本文将揭秘...

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

介绍被网站删除网页背后的真相与反思

在信息爆炸的时代,网络成为了人们获取知识、交流思想的重要平台。近年来,不少网站删除了原本存在的网页,引发了广泛关注。这些被删除的网...

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

介绍网页开发成本,影响因素与合理预算

随着互联网的飞速发展,网页开发已成为企业提升品牌形象、拓展市场份额的重要途径。不少企业在进行网页开发时,对开发成本心存疑虑。本文将...

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