Вход в яму gRPC

gRPC

резюме

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

Основная яма:

  • Если вы используете PHP или Python для разработки клиентов gRPC, вам необходимо скомпилировать инструмент командной строки gRPC для создания подключаемых модулей генерации кода proto, в противном случае службы, определенные в proto, не могут быть скомпилированы. При компиляции необходимо использовать GCC4.8 или выше, иначе C++11 не будет поддерживаться. Тогда вам нужно ускорить исходный код grpc на следующей неделе и загрузить множество сторонних зависимостей. Этот процесс очень болезненный. Те, кто использует golang и java, могут быть проигнорированы.
  • PHP также должен следовать расширению c grpc. Для компиляции требуется использование GCC 4.8 или выше.
  • Если вы используете службы разработки Golang, в основном загружаются зависимые сторонние службы, вам необходимо использоватьgo modДобавьте правила сопоставления в репозиторий github, и загрузка с github также будет быстрой.

В этой статье объясняется, как решить эти ямы, а также объясняется демонстрация gRPC. Адрес Github, соответствующий этой статье:GitHub.com/52Non-Members/Персональный ПК-…. В этом репозитории хранятся демо-примеры и бинарные пакеты, скомпилированные некоторыми системами.Все считают, что некоторые шаги занимают слишком много времени.Можно напрямую клонировать репозиторий и копировать бинарные пакеты в соответствующую директорию (только для тестовой разработки, производственная среда еще старая Честно говоря собери сам).

Обновление GCC

Для компиляции инструментов командной строки gRPC требуется GCC4.8 и выше. Встроенная версия серии CentOS6 — GCC4.7.

использоватьgcc --versionверсию можно посмотреть.

Если версия GCC вашей системы >= 4.8, вы можете игнорировать этот раздел. Если вы используете только golang, java, игнорируйте этот раздел.

Примечание: Не рекомендуется загружать исходный пакет GCC или использовать yum для загрузки GCC 4.8 и выше по следующим причинам: 1) Установка исходного пакета действительно очень медленная 2) Скорость загрузки исходного кода yum такая же медленный как улитка. Всем рекомендуется использовать следующий метод установки SCL, а исходную версию можно использовать после установки.

Если вам нужно обновить gcc до версии 4.8 или выше, рекомендуется установить его напрямуюSCLУстановить после источникаdevtoolset-6(devtoolset-6 в настоящее время является gcc версии 6.3), потому чтоdevtoolset-4а предыдущие версии не поддерживаются и могут быть установлены только другими способами.

Обновление до gcc 6.3:

Copyyum -y install centos-release-scl
yum -y install devtoolset-6-gcc devtoolset-6-gcc-c++ devtoolset-6-binutils
scl enable devtoolset-6 bashскопировать код

Обратите внимание, что команда scl включает тольковременныйДа, выход из оболочки или перезапуск восстановит исходную версию системы gcc. Если вы хотите использовать gcc 6.3 в течение длительного времени:

Copyecho "source /opt/rh/devtoolset-6/enable" >>/etc/profileскопировать код

Таким образом, выход из оболочки и ее повторное открытие — это новая версия gcc. Остальные версии такие же.

Обновление до gcc 7.3:

Copyyum -y install centos-release-scl
yum -y install devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils
scl enable devtoolset-7 bashскопировать код

Метод установки devtoolset4 (gcc 5.2) и предыдущих версий, поддержка которых прекращена, может быть медленным, если интересно, можете попробовать.

Обновление до gcc 4.8:

Copywget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtoolset-2.repo
yum -y install devtoolset-2-gcc devtoolset-2-gcc-c++ devtoolset-2-binutils
scl enable devtoolset-2 bashскопировать код

Обновление до gcc4.9:

Copywget https://copr.fedoraproject.org/coprs/rhscl/devtoolset-3/repo/epel-6/rhscl-devtoolset-3-epel-6.repo -O /etc/yum.repos.d/devtoolset-3.repo
yum -y install devtoolset-3-gcc devtoolset-3-gcc-c++ devtoolset-3-binutils
scl enable devtoolset-3 bashскопировать код

Обновление до gcc 5.2:

Copywget https://copr.fedoraproject.org/coprs/hhorak/devtoolset-4-rebuild-bootstrap/repo/epel-6/hhorak-devtoolset-4-rebuild-bootstrap-epel-6.repo -O /etc/yum.repos.d/devtoolset-4.repo
yum install devtoolset-4-gcc devtoolset-4-gcc-c++ devtoolset-4-binutils -y
scl enable devtoolset-4 bashскопировать код

Скомпилируйте инструмент командной строки gRPC

Если вы используете только golang, java, игнорируйте этот раздел.

gRPC делится на версии C, JAVA, GO и NodeJS. Версия C включает C++, Python, Ruby, Objective-C, PHP и C#. Эти языки разработаны на основе версии C и имеют общую кодовую базу.

Если вы используете версию gRPC C, вы в конечном итоге скомпилируете следующие инструменты из исходного кода:

Copygrpc_cpp_plugin  
grpc_csharp_plugin  
grpc_node_plugin  
grpc_objective_c_plugin  
grpc_php_plugin  
grpc_python_plugin  
grpc_ruby_pluginскопировать код

Эти инструменты доступны в виде плагинов к прото-компилятору. нужно сначала скачатьgrpc/grpcИсходный код на гитхабе.

Copygit clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
cd grpc
git submodule update --init
make && sudo make install

# 生成的插件路径
ll ./bins/opt/

# 复制到bin目录
cp -r ./bins/opt/* /usr/local/bin/скопировать код

Здесь есть 2 ямы:
1,grpc/grpcСклад относительно большой.Ввиду скорости внутреннего доступа рекомендуется использовать отечественное зеркалирование. Облако кода (gitee.com) предоставляет зеркальный адрес для синхронных обновлений.:

Copygit clone https://gitee.com/mirrors/grpc-framework grpcскопировать код

Это значительно увеличивает скорость загрузки.
2,git submodule updateЭта команда фактически загружает.gitmodulesСторонние зависимости, определенные в файле, находятся в каталоге Third_Party.Зависимостей много.Вы можете открыть их..gitmodulesПодробности смотрите в файле. Все зависимые репозитории находятся на github. Вы не сможете скачать их через несколько часов загрузки. Просто подождите и загружайте их медленно.

Оглядываясь назад, мы потратили много времени только на то, чтобы получить плагин компиляции прототипа для grpc.

Преимущества: Под Mac собраны бинарные пакеты:Блог files.cn на.com/files/52Non-members…. Загрузите вышеуказанный файл и разархивируйте его,bins/opt/Скопируйте все файлы в/usr/local/bin/.

Поддержка, связанная с PHP

Если вы используете только golang, java, игнорируйте этот раздел.

В настоящее время PHP не поддерживается в качестве сервера grpc. Как клиент в порядке, требует установки машины:

  • инструмент для компиляции протоколов
  • protobuf c расширение
  • Инструмент командной строки gRPC (grpc_php_plugin)
  • расширение grpc c
  • php-библиотека grpc

вprotocа такжеprotobuf c扩展Уже тутМаленький тестовый нож ProtobufОн был введен и не будет повторяться здесь. Если установка прошла успешно в предыдущем разделе, тоgrpc_php_pluginСуществует также. Ниже описано, как установить PHP-версию библиотеки gRPC.

Установите расширение grpc c: Требования: для компилятора GCC требуется версия 4.8 и выше. Его можно установить с помощью pecl:

Copypecl install grpcскопировать код

Также можно указать версию:

Copypecl install grpc-1.12.0скопировать код

Или скачать исходный код (Полиэтиленовый материал.PHP.net/package/GRP…:

Copywget http://pecl.php.net/get/grpc-1.21.3.tgz
tar zxvf grpc-1.21.3.tgz && cd grpc-1.21.3
phpize
./configure
make
make installскопировать код

grpc/grpcВ кодовой базе также есть исходный код C для расширения PHP, вgrpc/src/php/ext/grpcкаталог, вы также можете скомпилировать прямо в нем.

После компиляции добавьте его в php.ini и используйтеphp --ri grpcИнформацию можно просмотреть.

После установки расширения C вам также необходимо использовать composer для установки библиотеки grpc:

Copycomposer require grpc/grpcскопировать код

пример gRPC

Написать прототип gRPC

Всего определено три файла:

Copy└── proto
    ├── GreeterService.proto
    ├── Response.proto
    └── User.protoскопировать код

вUserКак определение модели,ResponseДля определения унифицированного возврата RPCGreeterServiceЭто определение интерфейса службы.

Из-за нехватки места, пожалуйста, обратитесь к файлу proto для получения подробной информации.GitHub.com/52Non-Members/Персональный ПК-…складprotoсодержание.

GreeterService.protoСодержимое файла следующее:

Copysyntax = "proto3";
package Sample.Model; //namesapce

import "User.proto";
import "Response.proto";

service Greeter {
  // Sends a greeting
  rpc SayHello (User) returns (Response) {}
}скопировать код

Он определяетservice, что эквивалентно определению интерфейса службы. Мы определили имя и параметры метода, и нам нужно реализовать его позже. Поскольку gRPC не поддерживает PHP в качестве сервера, здесь мы используем Golang в качестве сервера.

Во-первых, вам нужно использовать инструмент proto для компиляции кода golang:

Copymkdir -p Pb_Go

#编译
cd proto
protoc --go_out=plugins=grpc:../Pb_Go/ *.proto
cd - скопировать код

Если будет предложеноprotoc-gen-goНе могу найти, пожалуйста, введите его в соответствии со статьей (Блог Woohoo.cn на.com/52non-members/afraid/111….

В случае успешного выполнения будетPb_GoСгенерируйте код Go в каталоге:

CopyPb_Go
├── GreeterService.pb.go
├── Response.pb.go
└── User.pb.goскопировать код

Если вам нужно сгенерировать код для клиента PHP, вам нужно использовать инструмент командной строки grpc phpgrpc_php_plugin, предыдущая сводка. Если выполнение выполнено успешно, этот инструмент уже существует. Потом:

Copyout=output/php
mkdir -p $out

#编译
cd proto
protoc --php_out=../$out --grpc_out=../$out --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin   *.proto
cd - 

# 修改命名空间
cd $out
mv GPBMetadata Sample/Model/
find . -name '*.php' ! -name example.php -exec sed -i "" -e 's#GPBMetadata#Sample\\Model\\GPBMetadata#g' -e 's#\\Sample\\Model\\GPBMetadata\\Google#\\GPBMetadata\\Google#g' {} \;скопировать код

Вышеупомянутое работает под Mac, и команды несколько отличаются от Linux. Инструмент компиляции gRPC под CentOS не компилируется.

Окончательный сгенерированный файл:

Copy├── output
│   └── php
│       └── Sample
│           └── Model
│               ├── GPBMetadata
│               │   ├── GreeterService.php
│               │   ├── Response.php
│               │   └── User.php
│               ├── GreeterClient.php
│               ├── Response.php
│               ├── User.php
│               └── UserList.phpскопировать код

Примечание: скомпилируйте там, если мы не добавим--grpc_out=../$out --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin, сгенерированный класс PHP неGreeterClientиз. Этот файл автоматически создается инструментом компиляции gRPC и используется для подключения к серверу gRPC.

иди пиши сервис

Пишем сервер на Golang. Хотя часть кода на Golang сгенерирована выше, настоящий сервис еще не написан.

main.go

Сначала создаем новый main.go, кода не много, вставлю сразу:

Copypackage main

import (
    "fmt"
    "log"
    "net"
    "time"

    pb "grpc-sample/Pb_Go"
    "golang.org/x/net/context"
    "google.golang.org/grpc"
)

const (
    addr = ":50051"
)

// server is used to implement helloworld.GreeterServer.
type server struct{}

// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, u *pb.User) (*pb.Response, error) {
    return &pb.Response{ErrCode: 0, ErrMsg: "success", Data: map[string]string{"name": "Hello " + u.Name}}, nil
}

func main() {
    lis, err := net.Listen("tcp", addr)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }

    fmt.Printf("%s server start at %s\n", time.Now(), addr)

    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    s.Serve(lis)
}
скопировать код

Затем вы можете скомпилировать.

Есть большая дыра:go build main.goсначала скачаетgo.modЗависимости, определенные в (есть много зависимостей, см. подробности:GitHub.com/52Non-Members/Персональный ПК-…), из которых очень медленно работает следующее, репозиторий слишком большой, хотя и перенаправляется на github:

Copyreplace google.golang.org/api => github.com/googleapis/google-api-go-client v0.6.1-0.20190616000641-99157d28da34скопировать код

Для быстрой загрузки я сделал зеркало на облаке кода, адрес: gitee.com/52fhy/google-api-go-client. После изменения загрузка идет намного быстрее.

После успешной компиляции создается бинарный файлmain. Мы можем просто запустить:

Copy$ ./main

2019-06-30 17:16:07.752508 +0800 CST m=+0.028838467 server start at :50051скопировать код

go test

Чтобы проверить, является ли написанный нами сервис нормальным, мы можем написать тестовые примеры:
test_client.go

Copypackage main

import (
    "context"
    "google.golang.org/grpc"
    pb "grpc-sample/Pb_Go"
    "testing"
)

func TestExec(t *testing.T)  {
    conn, err := grpc.Dial(":50051", grpc.WithInsecure())
    if err != nil {
        t.Errorf("dial error: %v\n", err)
    }
    defer conn.Close()

    // 实例化客户端
    client := pb.NewGreeterClient(conn)

    // 调用服务

    user := pb.User{}
    user.Id = 1
    user.Name = "test"
    result, err := client.SayHello(context.Background(), &user)
    if err != nil {
        t.Errorf("grpc error: %v\n", err)
    }
    t.Logf("Recevied: %v\n", result)
}скопировать код

бегать:

Copy$ go test -v client_test.go

=== RUN   TestExec
--- PASS: TestExec (0.01s)
    client_test.go:29: Recevied: errMsg:"success" data:<key:"name" value:"Hello test" > 
PASS
ok      command-line-arguments  0.021sскопировать код

Работает немного медленно, я чувствую, что слишком много зависимых библиотек.

php-клиент

Чтобы использовать PHP-клиент gRPC, убедитесь, что у вас установлены:

  • protobuf c расширение
  • расширение grpc c
  • php-библиотека grpc

Пример:
client_test.php

Copy<?php

use Grpc\ChannelCredentials;
use Sample\Model\User;
use Sample\Model\UserList;
use Sample\Model\GreeterClient;

ini_set("display_errors", true);
error_reporting(E_ALL);
require_once "autoload.php";
$user = new User();
$user->setId(1)->setName("test");

$client = new GreeterClient("192.168.99.1:50051", [
    'credentials' => ChannelCredentials::createInsecure(), //不加密
//    'timeout' => 3000000,
]);

//分别是响应、状态对象
list($reply, $status) = $client->SayHello($user)->wait();

if (!$reply) {
    echo json_encode($status);
    return;
}

//序列化为string
echo $reply->serializeToJsonString(true) . PHP_EOL;
echo $reply->getErrCode() . PHP_EOL; //errCode
echo $reply->getErrMsg() . PHP_EOL; //errMsg

//data
foreach ($reply->getData() as $key => $value) {
    echo $key . "-" . $value . PHP_EOL;
}
скопировать код

Вывод после запуска:

Copy$ php tests/client_test.php

{"errMsg":"success","data":{"name":"Hello test"}}
0
success
name-Hello testскопировать код

Общая проблема

1. CentOS6 использует мод go для получения ошибки неизвестной версии xxx сторонних зависимостей.
Решение: на самом деле некоторые команды git используются в цепочке вызовов мода go.Когда версия git устарела, вызов завершается сбоем, возникает ошибка и выдается неоднозначное подсказка. Метод заключается в обновлении версии git.Git, поставляемый с CentOS6, имеет версию 1.7. После того, как обновление будет завершено, попробуйте снова запустить мод.

Способ быстрого обновления: centos6:

Copy# 安装yum源
wget http://opensource.wandisco.com/centos/6/git/x86_64/wandisco-git-release-6-1.noarch.rpm && rpm -ivh wandisco-git-release-6-1.noarch.rpm

## 安装git 2.x
yum install git -y

## 验证
git --version
git version 2.14.1скопировать код

2. Ошибка PHP: Неустранимая ошибка: класс «Google\Protobuf\Internal\Message» не найден
Решение: Пожалуйста, установите расширение PHP protobuf c.

3. Ошибка PHP: Неустранимая ошибка: класс '\Grpc\BaseStub' не найден
Решение: использоватьcomposer require grpc/grpcУстановите grpc. Кроме того, должно быть установлено соответствующее расширение grpc C.

4. Что делать, если загрузка пакета выпуска github очень медленная?
Решение: Загрузите версию для MacFree Download Managerскачать инструментМожет исправить медленные или неудачные загрузки Github. Скорость зашкаливает.

Ссылаться на

1. Обновите gcc до 4.8, 4.9, 5.2, 6.3, 7.3 и других более поздних версий для CentOS 6 и 7.
Woohoo .VPS и .net/manage/cent…
2. Centos 6.x/7.x использует yum для обновления версии git — требуется программист
блог.Да журнал RA.com/post-721.Контракты…
3. Маленький испытательный нож Protobuf - Feihongying
Блог Woohoo.cn на.com/52non-members/afraid/111…

автор:undefined

Источник:Блог Woohoo.cn на.com/52non-members/afraid/111…

Этот сайт используется "CC BY 4.0"Соглашение Creative Commons, пожалуйста, указывайте автора и источник на видном месте статьи при перепечатке.