PHP (cliente) y Golang (servidor) usan grpc + protobuf para comunicarse

  Para explicar desde cero, PHP (cliente) y Golang (servidor) usan grpc + protobuf para comunicarse. Debido a que mi entorno local está configurado para evitar que me caiga, desarrollé en el entorno acoplable y saqué Alpine的镜像。una Linux distribución de luz orientada a la seguridad basada en el sistema operativo Alpine  .

Entorno de construcción

1. En el proyecto, usaré extensiones relacionadas con el compositor y PHP, por lo que extraigo una imagen acoplada basada en PHP7.2. Para los parámetros en el comando, vea mi otro artículo, Docker Notes-Comandos básicos comunes .

docker container run -it --name grpc-ubuntu -v / Users / wuerzhilv-lq / examples: / home / examples lorisleiva / laravel-docker: 7.2 / bin / bash

2. Instalar paquetes relacionados

apk agregar autoconf automake libtool linux-headers  

3. Este acoplador no tiene un entorno de lenguaje Golang, lo instalamos aquí. Aquí por medio de compilado e instalado, por qué no instalar el apk del gestor de paquetes, ya que hay hoyo 详情链接.

Go工具链是用Go编写的,要构建它,需要安装Go编译器;由于我们没有GO编译器,同时1.4以后的GO语言版本没有直接支持GCC,支持GO编译器GCCGO,因此我们需要先现在1.4版本的GO,利用GCC编译好GO编译器后,再利用1.4版本的GO编译器编译最新版本的GO(比如以下的1.14)。

  

①Descargue la versión go1.4, el código fuente se descarga desde el oficial
wget https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz
tar -zxf go1.4-bootstrap-20171003.tar.gz
mv go /usr/local/go1.4

② Descargue la versión go1.14 wget https://dl.google.com/go/go1.14.2.src.tar.gz tar -zxf go1.14.2.src.tar.gz mv go / usr / local / go
③ Configuración de la variable de entorno (se requiere GOROOT_BOOTSTRAP para la configuración del entorno del compilador) echo 'export GOROOT_BOOTSTRAP = / usr / local / go1.4' >> ~ / .bash_profile echo 'export GOROOT = / usr / local / go' >> ~ / .bash_profile echo 'export PATH = $ {GOROOT} / bin: $ {PATH}' >> ~ / .bash_profile // Sobrecarga las variables de configuración del entorno (principalmente sobrecarga GOROOT_BOOTSTRAP)
fuente ~ / .bash_profile
④ Compile la versión de go1.4 cd /usr/local/go1.4/src && ./make.bash
⑤Compile go1.14 con el compilador go1.4 go cd / usr / local / go / src && ./make.bash
⑥ Ver la versión de golang ir versión

4. El php recién descargado no tiene un archivo php.ini listo para usar. Acabo de dar dos sugerencias para php.ini-development (para el entorno de desarrollo) y php.ini-production (para el entorno de producción). Aquí copiamos un archivo php.ini basado en el entorno de producción.

cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini

5.系统层面的,我们环境就安装好了。Grpc 是使用protobuf来传输数据,protobuf是一个文件,那怎么让php和golang语言识别它,这里就需要一个编译工具了。

apk agregar protobuf

6. PHP instala Grpc, extensión Protobuf.

pecl install grpc-1.25.0 
pecl install protobuf -3.11.4

打开我们新建的php.ini文件,将扩展加进去。可以使用php -m 查看配置是否生效。

extension=grpc.so    extension=protobuf.so

7. Instalar el complemento de protocolo PHP

$ git clone -b v1.28.1 https: // github.com/grpc/grpc 
$ cd grpc
Actualización de submódulo $ git - init
$ make grpc_php_plugin
make编译后,输出目录为bins/opt,输出文件grpc_php_plugin,将文件复制到/home/examples
cp bins / opt / grpc_php_plugin / home / examples /

8.安装Golang Protoc Plugin

vaya a obtener -u github.com/golang/protobuf/protoc-gen-go
export PATH=$PATH:$GOPATH/bin

9. Instalar grpc

ir a -u google.golang.org/grpc

10. El entorno está listo, escribamos el código del proyecto. Cuando creé el contenedor Docker, monté el directorio contenedor localmente y puedo usar la herramienta ide para desarrollarlo.

  El directorio local que configuré aquí es / Users / wuerzhilv-lq / examples. Los ejemplos son equivalentes al directorio del proyecto: en este proyecto, se usa un nuevo directorio protos para almacenar archivos protobuf, se usa un nuevo directorio php para almacenar el código del cliente y se usa un nuevo directorio go para almacenar el código del servidor.

 

      Creamos un nuevo archivo protobuf (helloworld.proto ) para definir métodos de servicio, parámetros de solicitud y valores de retorno de solicitud. El contenido es el siguiente

// Define la gramática. Hay dos tipos de proto2 y proto3. Yo uso proto3 aquí.
sintaxis = "proto3";

// Definir el servicio (me siento como una clase)
servicio Greeter {
  // Defina el método de servicio como SayHello, puede haber varios métodos
  rpc SayHello (HelloRequest) devuelve (HelloReply) {}
}

// Definir parámetros de solicitud
mensaje HelloRequest {
  nombre de cadena = 1;
}

// Definir los parámetros de retorno
mensaje HelloReply {
   mensaje de cadena = 1;
}

11. El código del servidor, ingrese el directorio del proyecto en el contenedor y use la herramienta de protocolo para generar el código del servidor (golang) en el directorio de acuerdo con el archivo protobuf. Después de ejecutar el comando, aparecerá una carpeta proto en la carpeta go, que contiene un archivo helloworld.pb.go.

protocol protos / helloworld.proto --go_out = plugins = grpc: ir

    En la carpeta ejemplos / go, cree un nuevo archivo main.go y registre el servicio helloworld.

paquete principal

importar (
    "contexto"
    "Iniciar sesión"
    "red"

    "google.golang.org/grpc" 
    pb "./protos"
)

const (
    puerto = ": 50051"
)

// servidor se usa para implementar helloworld.GreeterServer. 
escriba server struct {
    pb . UnimplementedGreeterServer
}

// SayHello implementa la 
función helloworld.GreeterServer (s * server) SayHello (ctx context.Context, en * pb.HelloRequest) (* pb.HelloReply, error) {
     log . Printf ("Recibido:% v", en. GetName ())
     return & pb.HelloReply {Mensaje: "Hola" + en.GetName ()}, nil
}

func main () {
    lis , err: = net.Listen ("tcp", port)
     if err! = nil {
         log .Fatalf ("error al escuchar:% v", err)
    }
    s : = grpc. NewServer ()
    pb .RegisterGreeterServer (s, & server {})
     log . Printf ("服务 启动" + puerto)
     si err: = s.Serve (lis); err! = nil {
         log .Fatalf ("error al servir:% v", err)
    }
}

   Ejecute go run main.go para iniciar el servicio y ver si el servicio se puede iniciar.

12. Código del cliente, ingrese el directorio del proyecto en el contenedor, use la herramienta de protocolo para generar el código del cliente (PHP) en el directorio php de acuerdo con el archivo protobuf. Después de ejecutar el comando, aparecerán algunos archivos en la carpeta php.

protocol --proto_path = protos --php_out = php --grpc_out = php --plugin = protocol-gen-grpc = / home / examples / grpc_php_plugin protos / helloworld.proto

  Reemplazar fuente de compositor

compositor config -g repo.packagist compositor https: // mirrors.aliyun.com/composer/

  A través de la herramienta compositor, inicializamos un archivo composer.json.

 composer.json内容如下:

{

  "name": "grpc / grpc-demo",
  "description": "ejemplo de gRPC para PHP",
  "require": {
    "grpc / grpc": "^ 1.27",
    "google / protobuf": "^ 3.11"
  } ,
  "autores": [

    {

      "nombre": "Li",
      "correo electrónico": "[email protected]"
    }
  ]
}

 La instalación del compositor instala el paquete de extensión.  

 En el directorio php, cree un nuevo archivo de cliente, greeter_client.php

<? php 
requiere dirname ( __FILE__ ). '/ vendor / autoload.php' ; @ include_once dirname ( __FILE__ ). '/ helloworld / GreeterClient.php' ; @ include_once dirname ( __FILE__ ). '/ helloworld / HelloReply.php' ; @ include_once dirname ( __FILE__ ). '/ helloworld / HelloRequest.php' ; @ include_once dirname ( __FILE__ ). '/ GPBMetadata / Helloworld.php' ; función saludar ( $ nombre ) { $ client = new Helloworld \ GreeterClient ('localhost: 50051', [ 'credentials' => Grpc \ ChannelCredentials :: createInsecure (), ]); $ request = new Helloworld \ HelloRequest (); $ solicitud -> setName ( $ nombre ); lista ( $ respuesta , $ estado ) = $ cliente -> SayHello ( $ solicitud ) -> espera (); $ mensaje = $ respuesta -> getMessage (); devolver $ mensaje ; } $ nombre =! vacío ( $ argv [1])? $ argv [1]: 'mundo' ; echo saludar ( $ nombre ). "\ n";

13. Ingrese el directorio del proyecto de ejemplos,

Inicie el servidor 
vaya ejecute vaya / main.go
ejecute el cliente
php php / greeter_client.php

  Si se emite helloworld, es exitoso.

 

总结:
  这篇文章,只是简单粗略说了下,Grpc+protobuf的使用,比如针对protobuf文件,具体的内容没有说。以后,我会在写一篇针对protobuf文件详细讲解的文章。我懂得也不是太多,就是当自己做了一次总结。如有不对的地方,大家多提意见。我本机挂了代理,所以没有遇到墙的问题,如果被墙了,自行百度吧。
参考了如下资料:
https://developers.google.com/protocol-buffers
https://grpc.io/docs/quickstart
https://golang.org/doc/install/source
https://tkstorm.com/posts-list/programming/go/build-golang-from-source-on-alpine/



Supongo que te gusta

Origin www.cnblogs.com/jingying/p/12708670.html
Recomendado
Clasificación