Backend
October 11, 2023

gRPC для новичков: принципы работы и создание первого сервиса

Сегодня я расскажу тебе про одну крутую технологию, которая называется gRPC. Эта штука сильно облегчает жизнь программистам и позволяет создавать сложные приложения гораздо проще.

Давай разберемся, что это такое и почему gRPC такая полезная вещь для разработки.

Что такое gRPC?

Начнем с самого простого - gRPC это сокращение от Google Remote Procedure Call. По сути, это инструмент для вызова процедур на удаленных серверах. То есть с помощью gRPC ты можешь вызывать функции, которые находятся не на твоем компьютере, а где-то в сети.

Например, представь, что у тебя есть приложение на телефоне, которое показывает погоду. Чтобы узнать погоду в определенном городе, приложение должно обратиться к серверу и получить от него эти данные. Вот для таких задач и нужен gRPC - он позволяет приложениям легко общаться друг с другом через сеть.

Почему gRPC так полезен для разработки? Во-первых, он очень быстрый, потому что использует протокол HTTP/2. Во-вторых, он позволяет создавать службы один раз, а потом использовать их из любого языка программирования - Python, Java, C++, Go, JavaScript и т.д. В-третьих, с gRPC легко создавать сложные распределенные системы, когда разные части приложения работают на разных серверах.

Короче говоря, если тебе когда-нибудь нужно будет сделать приложение, которое использует удаленные сервисы или состоит из нескольких частей на разных компьютерах - обязательно используй gRPC!

Принципы работы gRPC

Хорошо, теперь давай разберемся, как именно работает эта штука. gRPC использует две основные технологии:

  1. Protocol Buffers Это специальный язык для описания структуры данных, которые будут передаваться между сервисами. Например, ты описываешь, что сервис погоды должен возвращать температуру (число), название города (строка) и так далее. Это нужно, чтобы клиент и сервер одинаково понимали формат данных.
  2. HTTP/2 Это современная версия протокола HTTP, которая позволяет передавать данные очень быстро за счет мультиплексирования (одновременной передачи нескольких потоков данных). gRPC использует HTTP/2 для связи между клиентом и сервером.

Кроме того, в gRPC есть такие возможности как:

  • Аутентификация и шифрование (чтобы никто посторонний не подключился к твоему сервису)
  • Балансировка нагрузки (распределение запросов между несколькими серверами)
  • Отказоустойчивость (если один сервер упадет, запросы будут отправляться на другие)
  • Мониторинг и логирование (чтобы отслеживать работу сервисов и решать проблемы)

В общем, gRPC учитывает многие аспекты, важные для современных приложений.

Создание первого сервиса

Ладно, теории хватит - давай на практике создадим простой сервис с использованием gRPC! Напишет его на языке Python, но ты можешь выбрать любой другой язык - главные принципы будут те же.

Итак, нам нужно:

  • Описать структуру данных в файле .proto

Это как раз описание формата Protocol Buffers, о котором я говорил.

Например:

message SearchRequest {
  string query = 1; 
}

message SearchResponse {
  repeated string results = 1;
}

Здесь мы описали запрос поиска (он содержит запрос - query) и ответ поиска (он содержит список результатов - results).

  • Сгенерировать код для разных языков из этого описания.

Делается это специальными библиотеками, есть готовые инструменты для всех популярных языков. Они создадут классы SearchRequest и SearchResponse.

  • Написать сервис поиска на сервере:
import grpc
from search_pb2 import SearchRequest, SearchResponse 
class SearchService(grpc.Servicer):
  def Search(self, request, context):
    # поиск в базе данных 
    results = ['result1', 'result2']
    
    response = SearchResponse()
    response.results.extend(results)
    return response
      
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
grpc.add_insecure_port('[::]:50051')
grpc.add_servicer_to_server(SearchService(), server)
server.start()

Здесь мы реализовали метод Search, который принимает запрос, ищет в базе данных, возвращает результаты.

  • Написать клиент, который вызывает этот сервис:
import grpc
from search_pb2 import SearchRequest
channel = grpc.insecure_channel('localhost:50051')
stub = SearchServiceStub(channel)
request = SearchRequest(query='gRPC tutorial') 
response = stub.Search(request)
print(response.results)

Вуаля, мы создали простой поисковый сервис с помощью gRPC! Конечно, на практике все немного сложнее, но общий принцип работы такой.

Заключение

Надеюсь, тебе теперь понятно, что такое gRPC и как он упрощает создание распределенных приложений. Эта технология активно используется во многих современных системах - от мобильных приложений до облачных сервисов.

Поэтому если ты мечтаешь стать крутым программистом и создавать масштабные проекты - изучи gRPC. Это полезный инструмент, который упростит тебе жизнь.