热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gogrpc设置返回头信息_demo4grpc

在进行round4之前呢,说一下go的modules,之前的3个demo中,其实我就直接用到了,没做说明,个人
70d2f7bfd3611f19cb5da9db1d3c6c3b.png

在进行round 4之前呢,说一下go的modules,之前的3个demo中,其实我就直接用到了,没做说明,个人觉得modules的引进算是一个大改进了,让我们可以脱离gopath的束缚,具体说明与配置,可以看我的这一篇文章:

go modules


务必设置GOPROXY,会大大提高go get的速度。


gRPC 是可以在任何环境中运行的现代开源高性能 RPC 框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。

安装protocol buffer 编译器

mac:

brew install protobuf

其他系统可以尝试编译安装

  • protocolbuffers/protobuf

安装gprc

go get -u google.golang.org/grpc

安装protoc-gen-go插件

go get -u github.com/golang/protobuf/protoc-gen-go

使用

新建hello目录,进入后执行:

protoc --proto_path hello/ --go_out=plugins=grpc:hello hello.proto

会看到hello目录下生成了hello.pb.go文件。

当然,其中的 hello.proto 是预先自定义在hello文件夹下的,如:

syntax = "proto3"; //语法声明package hello; //包名// 定义服务
service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}
}// 请求数据格式
message HelloRequest {string name = 1;
}// 响应数据格式
message HelloReply {string message = 1;
}

server

新建server目录,
golang例子代码来自:https://github.com/grpc/grpc-go/tree/master/examples/helloworld

// main.go
package mainimport ("context""log""net""google.golang.org/grpc"pb "local.com/sai/game/grpc/hello"
)const (port = ":50051"
)// server is used to implement helloworld.GreeterServer.
type server struct {pb.UnimplementedGreeterServer
}// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {log.Printf("Received: %v", in.GetName())return &pb.HelloReply{Message: "Hello " + in.GetName()}, 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{})if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}

client

go client

// client.go
package mainimport ("context""log""os""time""google.golang.org/grpc"pb "local.com/sai/game/grpc/hello"
)const (address = "127.0.0.1:50051"defaultName = "13sai"
)func main() {// Set up a connection to the server.conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())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 := defaultNameif len(os.Args) > 1 {name = os.Args[1]}ctx, cancel := context.WithTimeout(context.Background(), time.Second)defer cancel()r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})if err != nil {log.Fatalf("could not greet: %v", err)}log.Printf("Greeting: %s", r.GetMessage())
}`

php client

扩展安装

  • grpc扩展下载
  • profo

下载安装合适版本的扩展即可,记得别忘记在php.ini中加入:

extension=grpc.so
extension=protobuf.so

自动生成代码

protoc --php_out=client hello/hello.proto

会看到client目录下生成了GPBMetadata和Hello两个目录。

如果你对grpc相对叫熟练,可以直接进行代码编写:

require __DIR__ . '/vendor/autoload.php';class Client extends GrpcBaseStub{public function __construct($hostname, $opts, $channel = null) {parent::__construct($hostname, $opts, $channel);}/*** rpc SayHello(HelloRequest) returns (HelloReply) {}* 方法名尽量和 (gprc 定义 Greeter 服务)的方法一样* 用于请求和响应该服务*/public function SayHello(HelloHelloRequest $argument){// (/hello.Greeter/SayHello) 是请求服务端那个服务和方法,基本和 proto 文件定义一样return $this->_simpleRequest('/hello.Greeter/SayHello',$argument,['HelloHelloReply', 'decode']);}}//用于连接 服务端
$client = new Client('127.0.0.1:50051', ['credentials' => GrpcChannelCredentials::createInsecure()
]);//实例化 TestRequest 请求类
$request = new HelloHelloRequest();
$request->setName("fairy");//调用远程服务
$get = $client->SayHello($request)->wait();//返回数组
//$reply 是 TestReply 对象
//$status 是数组
list($reply, $status) = $get;echo $reply->getMessage().PHP_EOL;
// print_r($client->SayHello($request));

当然,也可以使用grpc_php_plugin插件生成。

  • grpc-php

grpc_php_plugin插件

clone太慢可以使用码云

git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
cd grpc
#这一步很慢,暂未找到什么好方法
git submodule update --init
make grpc_php_plugin

新建php-client,再来自动生成:

protoc -I=./hello hello.proto --php_out=./php-client/ --grpc_out=php-client/ --plugin=protoc-gen-grpc=/Users/wangzetao/www/grpc1/bins/opt/grpc_php_plugin

会发现比上面自动生成多了一个GreeterClient.php

// client.php
require __DIR__ . '/vendor/autoload.php';//用于连接 服务端
$client = new HelloGreeterClient('127.0.0.1:50051', ['credentials' => GrpcChannelCredentials::createInsecure()
]);//实例化 TestRequest 请求类
$request = new HelloHelloRequest();
$request->setName("world");//调用远程服务
$get = $client->SayHello($request)->wait();//返回数组
//$status 是数组
list($reply, $status) = $get;echo $reply->getMessage().PHP_EOL;
// print_r($client->SayHello($request));

运行测试

go run grpc/server/main.go
e4041d730092147f78c937de9f46045a.png
go run grpc/client/main.go
go run grpc/client/client.php
go run grpc/client/php-client.php
e8a5f0004d6bc99665e2af6985717cea.png

grpc初体验完成了,本次只是小小的使用了一下子,后续感兴趣的话可以深入学习一下。文中如有错误,欢迎指出交流。

这篇是之前的文章,代码简单,就不再写一遍了。



推荐阅读
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • protobuf在序列化和反序列化中的优势:1):序列化后体积相比Json和XML很小,适合网络传输2):支持跨平台多语言3):消息格式升级和兼容性还不错4):序列化反序列化速度很 ... [详细]
  • 0.编写.proto文件:syntaxproto3;optionjava_multiple_filestrue;optionjava_packageio.grp ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • Sublime Text 3 + LiveReload + Chrome
    安装LiveReload在SublimeText3中安装LiveReload。macOS快捷键⌘+⇧+P,输入InstallPackage,搜索LiveReload并回车安装。(W ... [详细]
  • 参照www.Micro_Studios.com的视频,在Ubuntu中成功安装了opencv,并且测试成功。现把具体的安装及测试过程整理出来࿰ ... [详细]
  • 如果说以比特币为代表的货币区块链技术为1.0,以以太坊为代表的合同区块链技术为2.0,那么实现了完备的权限控制和安全保障的Hyperledger项目毫无疑问代表着区块链技术3.0 ... [详细]
  • 基于.NET Core框架nacos的简单应用
    什么是Nacos?服务(Service)是Nacos世界的一等公民。Nacos支持 ... [详细]
  • k8s入坑之路(14)scheduler调度 kubelet管理及健康检查
    kubelet主要功能Pod管理在kubernetes的设计中,最基本的管理单位是pod,而不是container。pod是kubernetes在容器上的一层封装,由一组运行在同一 ... [详细]
  • 分布式服务框架和原理简章
    应用架构演进这里的架构演进应该是从服务化的角度来说,应该说随着业务发展,应用规模扩大,系统的一些公共服务就会抽取出来,独立开发,部署,维护,用来解决并发,扩展,维护的问题。传统垂直 ... [详细]
author-avatar
时刻要有危机感01
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有