Первое знакомство с grpc(1) — первый опыт под mac

Go

предисловие

В последнее время есть такой спрос.Клиентское приложение для ПК имеет сервис под системным разрешением.Такой сервис имеет преимущество в выполнении высоких разрешений и решает много проблем с разрешениями.Однако у всего есть две стороны.Высокие полномочия также теряют часть функции, требующие полномочий пользователя.Например, когда вы хотите получить отображаемую информацию, поскольку в сеансе системы нет пользовательского интерфейса, ее невозможно получить точно.Вы хотите установить сертификат для текущего пользователя.Это также время от времени некомпетентен и т. д. С появлением все большего числа таких сценариев потребность в процессе под управлением пользователя становится все более и более очевидной. И из-за исторических проблем основная структура связи находится в этом агенте, и все взаимодействия с удаленным сервером выполняются агентом, поэтому нам нужен процесс под управлением пользователя, который должен взаимодействовать с агентом для выполнения агента. Я рассматривал много решений для реализации этого общения.Позже я узнал о grpc по рекомендации друга.Поскольку он произведен Google и имеет версию golang, он может быть бесшовно связан с моим агентом (реализованным golang ), решил попробовать.

Введение в grpc

1. грпс

grpc разработан Google, независимой от языка и платформы системой удаленного вызова процедур (RPC) с открытым исходным кодом.

В gRPC клиентское приложение может напрямую вызывать методы серверного приложения на другом компьютере так же, как вызов локального объекта, что упрощает создание распределенных приложений и служб. Как и многие системы RPC, gRPC основан на идее определения службы, указания методов (включая параметры и типы возвращаемых значений), которые она может вызывать удаленно. Реализуйте этот интерфейс на стороне сервера и запустите сервер gRPC для обработки клиентских вызовов. Наличие заглушки на стороне клиента может действовать как метод на стороне сервера.

图1

Клиенты и серверы gRPC могут работать и взаимодействовать в различных средах — от серверов внутри Google до вашего собственного ноутбука и могут использовать любой gRPC.Поддерживаемые языкинаписать. Таким образом, вы можете легко создать сервер gRPC на Java и клиентов на Go, Python, Ruby. Кроме того, последний API Google будет иметь версию интерфейса gRPC, что позволит легко интегрировать функции Google в ваши приложения.

2. Буферы протоколов

gRPC по умолчанию использует протокольные буферы, которые представляют собой зрелый механизм сериализации данных структуры с открытым исходным кодом Google (конечно, другие форматы данных, такие как JSON, также могут использоваться). Как вы увидите в приведенных ниже примерах, вы создаете службу gRPC с прото-файлами и используете типы сообщений протокольных буферов для определения параметров метода и типов возвращаемых значений. ты сможешьДокументация по буферам протоколовУзнайте больше о буферах протоколов.

Без лишних слов, давайте начнем. Покажи мне код!

Следующее содержимое основано на среде, созданной на платформе Mac, и запускает демоверсию. язык голанг

1. Создайте окружение

1.1 Установите grpc-go

grpc под golang — grpc-go.Во-первых, нам нужно загрузить пакет grpc-go и использовать команду

go get -u google.golang.org/grpc

Примечание. Я пробую эту команду, потому что мне нужно исследовать Интернет с научной точки зрения, и мне нужно, чтобы мои друзья решили ее самостоятельно.

Если нет способа решить эту проблему, также возможна следующая команда

git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc

1.2 Устанавливаем протобуф

protobufЕсть много способов установить его.Студенты с гиковским духом должны загрузить исходный код, скомпилировать его самостоятельно, а затем установить его в переменной среды или переместить в каталог, например bin/sbin. Здесь ради скорости я использую метод прямой загрузки релизной версии.Адрес загрузки версии для mac:скачать релиз protobuf, последняя версия выпуска — 3.7.1. Как показано ниже:


Затем добавьте каталог в переменную среды или переместите его в каталог, например bin/sbin.

Затем установите golang protobuf и используйте golang напрямую.

go get -u github.com/golang/protobuf/proto // golang protobuf 库  
go get -u github.com/golang/protobuf/protoc-gen-go //protoc --go_out 工具


На этом установка protoc завершена.Введите команду в командной строке, и вы должны увидеть интерфейс как показано ниже:

2. Откройте код

Так как это первый опыт, конечно, мы начнем с привет, мир.

Моя структура каталогов примерно такая:

  1. Сначала создайте файл hello.proto в каталоге proto со следующим содержимым:

    syntax = "proto3";
    
    package hello;
    
    service Hello {
        rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    
    message HelloRequest {
        string Name = 1;
    }
    
    message HelloReply {
        string Message = 1;
    }
здесьsyntaxУказывает версию proto,package: имя пакета указанного вывода.serviceКлючевое слово - создать услугу,messageопределить структуру сообщения

2. Перейдите в каталог proto и выполните следующую команду:

protoc --go_out=plugins:. hello.proto

Формат: protoc --go_out=plugins:{путь к выходному файлу} {путь к протофайлу}

В это время вы увидите дополнительный файл hello.pb.go в каталоге proto.

3. Далее мы создаем сервер.

Код:

const (
   address = ":8848"
)

type Server struct {

}

func (s *Server)SayHello(ctx context.Context,in *hello.HelloRequest)(*hello.HelloReply,error){
   return &hello.HelloReply{
      Message:"hello," + in.Name,
   }, nil
}
func main() {
   conn, err := net.Listen("tcp", address)
   if err != nil {
      log.Fatal(err)
   }
   fmt.Println("grpc server listening at: 8848 port")
   server := grpc.NewServer()
   hello.RegisterHelloServer(server, &Server{})
   server.Serve(conn)
}

В этом коде мы сначала реализуем интерфейс службы Hello и добавляем hello перед именем, переданным клиентом.

hello.RegisterHelloServer(server, &Server{})

Этот код зарегистрирован в службе grpc.

3. Создать клиента

const (
    address = "localhost:8848"
    defaultName = "world"
)
func main() {
    conn, err := grpc.Dial(address, grpc.WithInsecure())
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()
    client := hello.NewHelloClient(conn)

    name := defaultName
    if len(os.Args) > 1 {
        name = os.Args[1]
    }
    request, err := client.SayHello(context.Background(), &hello.HelloRequest{Name:name})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(request.Message)
}

4. Захватывающие моменты, бегите смотреть эффект

Перейдите в каталог сервера,go run server.go

Бинго, сервер успешно работает на порту 8848.

Перейдите в каталог клиента,go run client.go


Привет, мир — такое замечательное предложение, пока что мы установили среду grpc под Mac и поздоровались с миром.