что такое РПЦ
Удаленный вызов процедур (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 сопряжена с трудностями, поэтому я не буду продолжать. здесь.Представлено, и те, кому интересно, могут узнать об этом сами.