что такое РПЦ
Удаленный вызов процедур (RPC) — это компьютерный протокол связи. Протокол позволяет программе, работающей на одном компьютере, вызывать подпрограмму на другом компьютере без необходимости дополнительного программирования этого взаимодействия программистом. Если задействованное программное обеспечение использует объектно-ориентированное программирование, то удаленный вызов процедуры также можно назвать удаленным вызовом или удаленным вызовом метода.Википедия: Удаленный вызов процедур
Описано простым языком: RPC позволяет вызывать методы компьютерных программ на разных машинах и языках. Например, я написал метод getUserInfo для получения информации о пользователе на языке go и развернул программу go на сервере Alibaba Cloud Теперь у меня есть проект php, развернутый в облаке Tencent, и мне нужно вызвать метод getUserInfo для golang, чтобы получить Информация о том, что процесс php, вызывающий метод go на разных машинах, является вызовом RPC.
Как реализовать RPC в голанге
Реализация RPC в Голан очень прост, поддерживается упакованными официальными библиотеками и некоторыми сторонними библиотеками. Go RPC можно использовать TCP или HTTP для передачи данных и может использовать несколько типов кодеков для передачи данных. Голанг официальныйnet/rpcиспользование библиотекиencoding/gobкодек, поддержкаtcpилиhttpСпособ передачи данных, так как другие языки не поддерживаютсяgobкодек, поэтому используйтеnet/rpcМетоды RPC, реализованные библиотекой, нельзя назвать межъязыковыми.
Чиновник также предоставил golangnet/rpc/jsonrpcБиблиотека реализует методы RPC, а JSON RPC использует JSON для кодирования и декодирования данных, поддерживая, таким образом, межъязыковые вызовы. Однако текущая библиотека jsonrpc реализована на основе протокола tcp и временно не поддерживает использование http для передачи данных.
В дополнение к библиотеке rpc, официально предоставляемой golang, существует множество сторонних библиотек, обеспечивающих поддержку реализации RPC в golang.Большинство сторонних библиотек rpc реализованы с использованиемprotobufКодирование и декодирование данных, согласноprotobufФайл объявления автоматически генерирует определение метода rpc и код регистрации службы, и очень удобно вызывать службу rpc в golang.
библиотека net/rpc
В следующем примере показано, как использовать официальный сайт golang.net/rpcБиблиотека реализует методы RPC, используяhttpКак носитель РПК, черезnet/httpПакет прослушивает запросы на подключение клиента.
$GOPATH/src/test/rpc/rpc_server.go
package main |
После запуска вышеуказанной серверной программы она будет прослушивать локальный порт 8095. Мы можем реализовать клиентскую программу, которая подключается к серверу и реализует вызовы методов RPC.
$GOPATH/src/test/rpc/rpc_client.go
package main |
библиотека net/rpc/jsonrpc
В приведенном выше примере мы демонстрируем использованиеnet/rpcПроцесс реализации RPC, но нет возможности вызвать метод RPC, реализованный в приведенном выше примере, на других языках. Итак, в следующем примере мы демонстрируем использованиеnet/rpc/jsonrpcБиблиотека реализует методы RPC, а методы RPC, реализованные на этом способе поддерживают перекрестные вызовы.
$GOPATH/src/test/rpc/jsonrpc_server.go
package main |
После запуска приведенной выше серверной программы он будет контролировать локальный порт 8096 и обработал запрос на соединение TCP от клиента. Мы можем использовать Golang Allurage клиентскую программу, которая соединяет сервер и RPC вызовы.
$GOPATH/src/test/rpc/jsonrpc_client.go
package main |
библиотека protorpc
Чтобы реализовать межъязыковые вызовы, при реализации метода RPC в golang мы должны выбрать метод кодирования и декодирования данных на разных языках, такой как JSON, указанный выше.jsonrpcЭто требование может быть выполнено, но есть и некоторые недостатки, такие как отсутствие поддержки http-передачи и невысокая производительность кодирования и декодирования данных. Итак, некоторые сторонние библиотеки rpc предпочитают использоватьprotobufВыполнение кодирования и декодирования данных, а также предоставление некоторых функций автоматической генерации регистрационного кода службы. В следующем примере мы используемprotobufопределять методы RPC и их параметры запроса-ответа, а также использовать сторонниеprotorpcбиблиотека для создания регистрационного кода службы RPC.
Во-первых, вам нужно установитьprotobufиprotocИсполняемая команда, вы можете обратиться к этой статье:краткое руководство по protobuf
Затем мы пишем прото-файл, определяющий реализуемый метод RPC и связанные с ним параметры.
$GOPATH/src/test/rpc/pb/arith.proto
syntax = "proto3"; |
Далее нам нужно определитьarith.protoфайл для создания кода службы RPC.
Первая установкаprotorpcБиблиотеки:go get github.com/chai2010/protorpc
затем используйтеprotocИнструмент генерирует код:protoc --go_out=plugin=protorpc=. arith.proto
воплощать в жизньprotocПосле команды сarith.protoФайл создается в том же каталоге, что и файлarith.pb.goфайл, который содержит код для определения методов RPC и регистрации службы.
На основе сгенерированногоarith.pb.goКод Давайте реализуем сервер rpc
$GOPATH/src/test/rpc/protorpc_server.go
package main |
Запуск вышеуказанной программы будет прослушивать локальный порт 8097 и получать TCP-соединения от клиентов.
на основеariti.pb.goЗатем реализуйте клиентскую программу.
$GOPATH/src/test/protorpc_client.go
package main |
Как вызывать методы Golang RPC на разных языках
Для трех приведенных выше примеров мы используемnet/rpc,net/rpc/jsonrpc,protorpcРеализовал сервер RPC в golang и дал соответствующий пример вызова RPC клиента golang, поскольку JSON и protobuf поддерживают несколько языков, поэтому используйтеjsonrpcиprotorpcМы можем вызвать реализованный метод RPC на других языках. Ниже приведена клиентская программа php, которая вызывает метод RPC на стороне сервера, реализованный jsonrpc, через соединение через сокет.
$PHPROOT/jsonrpc.php
<?php |
Другие библиотеки RPC
В дополнение к трем способам реализации RPC в golang, упомянутым выше, есть и другие библиотеки rpc, предоставляющие аналогичные функции.Более известная из них — grpc с открытым исходным кодом от Google, но первоначальная установка grpc сопряжена с трудностями, поэтому я не буду продолжать. здесь.Представлено, и те, кому интересно, могут узнать об этом сами.