PHP + GO +GRPC详细使用方法

如需安装相关扩展等可以看我的其他博客查看顺序为:
1、https://blog.csdn.net/qq_33079999/article/details/125272337?spm=1001.2014.3001.5501
2、https://blog.csdn.net/qq_33079999/article/details/125277383?spm=1001.2014.3001.5501(如需升级cmake可以看此博客不升级可以略过)
3、https://blog.csdn.net/qq_33079999/article/details/125273165?spm=1001.2014.3001.5501
如上是全部的安装过程

下面开始编写代码
一、生成proto文件和grpc代码
创建文件:hello.proto,内容如下:

syntax = "proto3";
package services;
option go_package = "./;proto";
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
  string name = 1;
}
message HelloReply {
  string message = 1;
  int64 len = 2;
}

生成go语言文件:

#在hello.proto文件目录下执行
protoc -I. --go_out=plugins=grpc:./ ./*.proto

执行成功后会生成一个hello.pb.go文件
在这里插入图片描述
hello.pb.go的包名为proto,后续写服务端和客户端代码需要引入此文件
在这里插入图片描述
编写go服务端代码,server.go:

package main

import (
	"context"
	"fmt"
	"proto" #引入生成的go文件,路径改成实际的引入路径
	"google.golang.org/grpc"
	"net"
)

// 服务端
var Server = new(server)

type server struct{}

// 业务逻辑
func (s *server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply, error) {
	res := &proto.HelloReply{
		Message: "hello " + request.Name,
		Len:     101,
	}

	fmt.Print("SayHello成功调用..\r\n")
	return res, nil
}

// 启动rpc的server服务
func (s *server) Start() {
	// 1.实例化server
	g := grpc.NewServer()
	// 2.注册逻辑到server中
	proto.RegisterGreeterServer(g, &server{})
	// 3.启动server
	lis, err := net.Listen("tcp", ":8399")
	if err != nil {
		panic("监听错误:" + err.Error())
	}

	fmt.Print("grpc启动服务成功..\r\n")

	err = g.Serve(lis)
	fmt.Print("err:", err)
	if err != nil {
		panic("grpc服务端运行错误:" + err.Error())
	}

}

func main() {
	Server.Start()
}

编写go客户端代码,client.go:

package main

import (
	"context"
	"fmt"
	"proto" #引入生成的go文件,路径改成你实际的引入路径
	"google.golang.org/grpc"
)

// rpc调用
func clientRpc(body map[string]string) (res *proto.HelloReply, err error) {
	name := body["name"]
	conn, err := grpc.Dial("localhost:8399", grpc.WithInsecure())
	if err != nil {
		return nil, err
	}
	defer conn.Close()
	rpc := proto.NewGreeterClient(conn)
	response, err := rpc.SayHello(context.Background(), &proto.HelloRequest{Name: name})
	if err != nil {
		return nil, err
	}
	return response, nil
}

// 业务代码
func start() {
	body := make(map[string]string)
	body["name"] = "niubi!"
	response, err := clientRpc(body)
	if err != nil {
		fmt.Println("rpc调用失败:", err)
		return
	}
	fmt.Println(response.Message)
}
func main() {
	start()
}

生成php语言文件:

#在hello.proto文件目录下执行
protoc --proto_path=./ --php_out=./ --grpc_out=./ --plugin=protoc-gen-grpc=(这里改成你实际生成grpc_php_plugin的路径) ./*.proto

执行成功后会生成以下几个文件:
在这里插入图片描述
编写php客户端代码,client.php:

<?php

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

$hostname = 'localhost:8399';

$client       = new \Services\GreeterClient(
    $hostname, [
    'credentials' => Grpc\ChannelCredentials::createInsecure(),
]
);
$indexRequest = new \Services\HelloRequest();
$indexRequest->setName($name = '测试');
/**
 * @var \Services\HelloReply $response
 */
[$response, $status] = $client->SayHello($indexRequest)->wait();

if ($status->code !== Grpc\STATUS_OK) {
    echo "ERROR: " . $status->code . ", " . $status->details . PHP_EOL;
}

var_export($response->serializeToJsonString());

如果你是第一次使用,还需要配置composer:

#安装grpc扩展包
composer require google/protobuf
composer require grpc/grpc

#将生成的php类文件加载到composer ,注意路径改成你实际的路径
    "autoload":{
        "psr-4":{
            "GPBMetadata\\":"common/grpc/GPBMetadata/",
            "Services\\":"common/grpc/Services/"
        }
    }

# 更新composer配置    
composer update    

go服务端测试:go run server.go
在这里插入图片描述
go客户端测试:go run client.go
在这里插入图片描述
php客户端测试:php client.php
在这里插入图片描述
到这里,php+golang grpc客户端和服务端详细案例就结束了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeson是只程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值