предисловие
В последнее время есть такой спрос.Клиентское приложение для ПК имеет сервис под системным разрешением.Такой сервис имеет преимущество в выполнении высоких разрешений и решает много проблем с разрешениями.Однако у всего есть две стороны.Высокие полномочия также теряют часть функции, требующие полномочий пользователя.Например, когда вы хотите получить отображаемую информацию, поскольку в сеансе системы нет пользовательского интерфейса, ее невозможно получить точно.Вы хотите установить сертификат для текущего пользователя.Это также время от времени некомпетентен и т. д. С появлением все большего числа таких сценариев потребность в процессе под управлением пользователя становится все более и более очевидной. И из-за исторических проблем основная структура связи находится в этом агенте, и все взаимодействия с удаленным сервером выполняются агентом, поэтому нам нужен процесс под управлением пользователя, который должен взаимодействовать с агентом для выполнения агента. Я рассматривал много решений для реализации этого общения.Позже я узнал о grpc по рекомендации друга.Поскольку он произведен Google и имеет версию golang, он может быть бесшовно связан с моим агентом (реализованным golang ), решил попробовать.
Введение в grpc
1. грпс
grpc разработан Google, независимой от языка и платформы системой удаленного вызова процедур (RPC) с открытым исходным кодом.
В gRPC клиентское приложение может напрямую вызывать методы серверного приложения на другом компьютере так же, как вызов локального объекта, что упрощает создание распределенных приложений и служб. Как и многие системы RPC, gRPC основан на идее определения службы, указания методов (включая параметры и типы возвращаемых значений), которые она может вызывать удаленно. Реализуйте этот интерфейс на стороне сервера и запустите сервер gRPC для обработки клиентских вызовов. Наличие заглушки на стороне клиента может действовать как метод на стороне сервера.
Клиенты и серверы 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. Откройте код
Так как это первый опыт, конечно, мы начнем с привет, мир.
Моя структура каталогов примерно такая:
-
Сначала создайте файл 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 и поздоровались с миром.