Ответ
Remote Procedure Call (RPC) — это протокол, который позволяет программе вызывать процедуру (функцию или метод) на другом компьютере в сети так, как будто она является локальной. RPC скрывает сложность сетевого взаимодействия, позволяя разработчикам сосредоточиться на бизнес-логике.
Как это работает (упрощенно):
- Клиент вызывает локальную функцию-заглушку (client stub).
- Заглушка упаковывает (сериализует) параметры вызова в сообщение и отправляет его по сети на сервер.
- Сервер получает сообщение, распаковывает его и передаёт параметры реальной процедуре.
- Процедура на сервере выполняется и возвращает результат.
- Сервер упаковывает результат и отправляет его обратно клиенту.
- Клиентская заглушка получает ответ, распаковывает его и возвращает результат вызывающей программе.
Пример с xmlrpc в Python:
Это простая реализация RPC, использующая XML для передачи данных.
Сервер:
from xmlrpc.server import SimpleXMLRPCServer
# Функция, которая будет вызываться удаленно
def add(x, y):
return x + y
# Создаем сервер на localhost, порт 8000
server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
# Регистрируем функцию под именем 'add'
server.register_function(add, "add")
# Запускаем сервер
server.serve_forever()
Клиент:
import xmlrpc.client
# Подключаемся к удаленному серверу
with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
# Вызываем удаленную функцию 'add' как локальную
result = proxy.add(5, 7)
print(f"5 + 7 = {result}") # Вывод: 5 + 7 = 12
Современные и более производительные реализации RPC включают gRPC (от Google) и Apache Thrift, которые часто используются в микросервисных архитектурах.
Ответ 18+ 🔞
А, слушай, смотри, это ж про RPC! Ну, типа, такая штука, чтобы твоя программа могла позвать функцию, которая сидит на другом компе за тридевять земель, как будто она тут, под боком, в соседнем файле. Всю эту сетевую ебучую магию — сериализацию, сокеты, протоколы — она от тебя прячет, как мамаша прячет от ребёнка бутылку. Ты просто вызываешь функцию и получаешь результат, а под капотом там, блядь, целый ёперный театр разворачивается.
Как оно, сука, крутится (если по-простому):
- Ты, как клиент, вызываешь какую-нибудь заглушку — функцию-пустышку, которая выглядит как настоящая.
- Эта заглушка берёт твои аргументы, пакует их в какой-нибудь формат (XML, JSON, бинарный — да похуй) и шлёт по сети на сервер, будто почтового голубя.
- Сервер получает эту посылку, распаковывает, смотрит: «А, бля, надо функцию
addзапустить!» — и запускает уже настоящую, рабочую процедуру. - Та процедура на сервере отрабатывает, получает результат и отдаёт его обратно в сетевое нутро.
- Сервер снова пакует результат и отправляет обратно клиенту, мол, держи, мудила, что просил.
- Твоя клиентская заглушка ловит ответ, распаковывает и подсовывает результат тебе прямо в переменную. И ты сидишь довольный, как будто всё локально и произошло. Хитрая жопа, да?
Вот, смотри, пример на xmlrpc в Python:
Старая, добрая, немного тормознутая штука, которая XML использует. Но для понимания — в самый раз, пиздопроебибна.
Сервер (тот, кто услуги оказывает):
from xmlrpc.server import SimpleXMLRPCServer
# Функция, которую будем вызывать удалённо. Обычное сложение, ничего особенного.
def add(x, y):
return x + y
# Поднимаем сервак на localhost, порт 8000. Сидит, ждёт.
server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
# Регистрируем нашу функцию под именем 'add'. Теперь её можно вызывать по имени.
server.register_function(add, "add")
# И понеслась! Сервер в бесконечном цикле.
server.serve_forever()
Клиент (тот, кто просит):
import xmlrpc.client
# Цепляемся к серверу по адресу.
with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
# И вот тут магия! Вызываем 'add' так, будто она тут. А она там, блядь!
result = proxy.add(5, 7)
print(f"5 + 7 = {result}") # Вывод: 5 + 7 = 12
Ну а в серьёзных, боевых проектах сейчас используют gRPC (от Гугла, быстрый, бинарный) или Apache Thrift. Это уже для больших, распределённых систем, где микросервисы друг другу мозги выносят. Но принцип, ёпта, один — обманка для программиста, чтобы ему жизнь мёдом не казалась, а казалась простой.