我是靠谱客的博主 淡定小丸子,最近开发中收集的这篇文章主要介绍为什么grpc不支持php,grpc简易教程 go server+php client,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

GRPC是google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,支持多种开发语言。

对于开发者而言:

1)需要使用protobuf定义接口,即.proto文件

2)然后使用compile工具生成特定语言的执行代码,比如JAVA、C/C++、Python等。类似于thrift,为了解决跨语言问题。

3)启动一个Server端,server端通过侦听指定的port,来等待Client链接请求。

本文以golang和php为例展开教程,使用golang做rpc server,php做rpc client,实现跨语言调用。

前期准备

golang的grpc包

golang的rpc包,作为golang rpc server需要这个包

go get google.golang.org/grpc

php的grpc扩展

phpize

./configure --with-php-config=/usr/local/php/bin/php-config

make

make install

# 添加grpc.so到php.ini配置

vim /usr/local/php/etc/php.ini

extension = "grpc.so"

php -m | grep "grpc"

grpc

protoc

命令行下将proto协议文件转换为多种语言对应格式的工具

./configure

make

make install

protoc --help

Usage: protoc [OPTION] PROTO_FILES

Parse PROTO_FILES and generate output based on the options given:

...

尝试运行

golang的 rpcserver

(1). 可直接用go get 的例子

go get google.golang.org/grpc/examples/helloworld

#将会编译好greeter_server和greeter_client

greeter_server

#greeter_server启动后挂起...

在另一个命令行运行:

greeter_client "this is my message"

2017/08/30 21:55:25 Greeting: Hello this is my message

(2). 手动生成go文件运行

假如我们有一个proto文件helloworld.proto:

syntax = "proto3";

option java_multiple_files = true;

option java_package = "io.grpc.examples.helloworld";

option java_outer_classname = "HelloWorldProto";

package helloworld;

// The greeting service definition.

service Greeter {

// Sends a greeting

rpc SayHello (HelloRequest) returns (HelloReply) {}

}

// The request message containing the user's name.

message HelloRequest {

string name = 1;

}

// The response message containing the greetings

message HelloReply {

string message = 1;

}

通过protoc将helloworld.proto转换生成对应的go文件:

protoc --go_out=./ helloworld.proto

得到helloworld.pb.go,不用编辑这个文件

这个文件属于package helloworld,你要适当放好他所在目录。

手动编辑greeter_server.go:

package main

import (

"log"

"net"

"golang.org/x/net/context"

"google.golang.org/grpc"

pb "/helloworld"

"google.golang.org/grpc/reflection"

)

const (

port = ":50051"

)

// server is used to implement helloworld.GreeterServer.

type server struct{}

// SayHello implements helloworld.GreeterServer

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {

return &pb.HelloReply{Message: "Hello " + in.Name}, nil

}

func main() {

lis, err := net.Listen("tcp", port)

if err != nil {

log.Fatalf("failed to listen: %v", err)

}

s := grpc.NewServer()

pb.RegisterGreeterServer(s, &server{})

// Register reflection service on gRPC server.

reflection.Register(s)

if err := s.Serve(lis); err != nil {

log.Fatalf("failed to serve: %v", err)

}

}

手动编辑greeter_client.go:

package main

import (

"log"

"os"

"golang.org/x/net/context"

"google.golang.org/grpc"

pb "google.golang.org/grpc/examples/helloworld/helloworld"

)

const (

address = "localhost:50051"

defaultName = "world"

)

func main() {

// Set up a connection to the server.

conn, err := grpc.Dial(address, grpc.WithInsecure())

if err != nil {

log.Fatalf("did not connect: %v", err)

}

defer conn.Close()

c := pb.NewGreeterClient(conn)

// Contact the server and print out its response.

name := defaultName

if len(os.Args) > 1 {

name = os.Args[1]

}

r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})

if err != nil {

log.Fatalf("could not greet: %v", err)

}

log.Printf("Greeting: %s", r.Message)

}

编译运行:

go build greeter_server.go && ./greeter_server &

go build greeter_client.go && ./greeter_client "Message from My Build"2017/08/3022:04:56 Greeting: Hello Message from My Build

php运行grpc client

参考 github.com/grpc/grpc/example/php

将此目录clone下来

git clone github.com/grpc/grpc

cd grpc/example/php

curl -sS https://getcomposer.org/installer | php

php composer.phar install

composer安装后会生成vendor和autoload.php文件,可自行选择添加到自己的项目中。

helloword.pb.php文件可以由protoc自定义生成:

protoc --php_out=./ helloworld.proto

php greeter_client.php编辑内容:

require dirname(__FILE__).'/vendor/autoload.php';

// The following includes are needed when using protobuf 3.1.0

// and will suppress warnings when using protobuf 3.2.0+

include_once dirname(__FILE__).'/helloworld.pb.php';

include_once dirname(__FILE__).'/helloworld_grpc_pb.php';

function greet($name) {

$client = new HelloworldGreeterClient('127.0.0.1:50051', [

'credentials' => GrpcChannelCredentials::createInsecure(),

]);

$request = new HelloworldHelloRequest();

$request->setName($name);

list($reply, $status) = $client->SayHello($request)->wait();

$message = $reply->getMessage();

return $message;

}

$name = !empty($argv[1]) ? $argv[1] : 'world';

echo "the greet: ".greet($name)."n";

运行:

php ./greeter_client.php the greet: Hello world

祝大家学习grpc顺利~

最后

以上就是淡定小丸子为你收集整理的为什么grpc不支持php,grpc简易教程 go server+php client的全部内容,希望文章能够帮你解决为什么grpc不支持php,grpc简易教程 go server+php client所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部