gRPC 客户端和服务端可以在多种环境中运行和交互 - 从 google 内部的服务器到你自己的笔记本,并且可以用任何 gRPC 支持的语言来编写。所以,你可以很容易地用 Java 创建一个 gRPC 服务端,用 Go、Python、Ruby 来创建客户端。此外,Google 最新 API 将有 gRPC 版本的接口,使你很容易地将 Google 的功能集成到你的应用里。先贴出官网,有不详细的地方还需要去官网查看
http://doc.oschina.net/grpc?t=58008
gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
贴出官网图:
gRPC 客户端和服务端可以在多种环境中运行和交互 - 从 google 内部的服务器到你自己的笔记本,并且可以用任何 gRPC 支持的语言来编写。所以,你可以很容易地用 Java 创建一个 gRPC 服务端,用 Go、Python、Ruby 来创建客户端。此外,Google 最新 API 将有 gRPC 版本的接口,使你很容易地将 Google 的功能集成到你的应用里。
使用 protocol buffers
gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON)。正如你将在下方例子里所看到的,你用 proto files 创建 gRPC 服务,用 protocol buffers 消息类型来定义方法参数和返回类型。你可以在 Protocol Buffers 文档找到更多关于 Protocol Buffers 的资料。下面贴出protocol buffers官网网址 需要翻墙~
https://developers.google.com/protocol-buffers/
尽管 protocol buffers 对于开源用户来说已经存在了一段时间,例子内使用的却一种名叫 proto3 的新风格的 protocol buffers,它拥有轻量简化的语法、一些有用的新功能,并且支持更多新语言。当前针对 Java 和 C++ 发布了 beta 版本,针对 JavaNano(即 Android Java)发布 alpha 版本,在protocol buffers Github 源码库里有 Ruby 支持, 在golang/protobuf Github 源码库里还有针对 Go 语言的生成器, 对更多语言的支持正在开发中。 你可以在 proto3 语言指南里找到更多内容, 在与当前默认版本的发布说明比较,看到两者的主要不同点。更多关于 proto3 的文档很快就会出现。虽然你可以使用 proto2 (当前默认的 protocol buffers 版本), 我们通常建议你在 gRPC 里使用 proto3,因为这样你可以使用 gRPC 支持全部范围的的语言,并且能避免 proto2 客户端与 proto3 服务端交互时出现的兼容性问题,反之亦然。
跟所有开始一样 先做个Hello world!!!
git clone https://github.com/grpc/grpc.git
切换当前目录到 examples/php
。 虽然我们大多数例子使用同一个 .proto 文件,但 PHP 的例子有自己的 helloworld.proto
文件,这是因为它依赖 proto2 语法。 PHP暂时没有针对 proto3 的支持
定义服务
创建我们例子的第一步是定义一个服务:一个 RPC 服务通过参数和返回类型来指定可以远程调用的方法。就像你在 概览 里所看到的, gRPC 通过 protocol buffers 来实现。 我们使用 protocol buffers 接口定义语言来定义服务方法,用 protocol buffer 来定义参数和返回类型。客户端和服务端均使用服务定义生成的接口代码。 这里有我们服务定义的例子,在 helloworld.proto 里用 protocol buffers IDL 定义的。Greeter
服务有一个方法 SayHello
,可以让服务端从远程客户端接收一个包含用户名的 HelloRequest
消息后,在一个 HelloReply
里发送回一个 Greeter
。这是你可以在 gRPC 里指定的最简单的 RPC - 你可以在教程里找到针对你选择的语言更多类型的例子。
PHP安装Google protobuf及使用 贴出两篇文章
https://my.oschina.net/3233123/blog/831864
http://blog.51cto.com/mofansheng/1904430
下载资源压缩包 https://github.com/allegro/php-protobuf/
unzip php-protobuf-master.zip
cd php-protobuf-master
由于我用的是docker 所以是进入容器里进行操作
phpize
Configuring for:
PHP Api Version: 2016626
Zend Module Api No: 20160626
Zend Extension Api No: 220090626
3、编译、make安装
[root@test php-protobuf-master]# ./configure --with-php-config=/soft/php/bin/php-config(你自己的php-config)
[root@test php-protobuf-master]# make
[root@test php-protobuf-master]# make install
Installing shared extensions: /soft/php/lib/php/extensions/no-debug-non-zts-20090626/
安装之后在目录生成扩展文件
[root@test php-protobuf-master]# ll /soft/php/lib/php/extensions/no-debug-non-zts-20090626/
-rwxr-xr-x. 1 root root 130247 3?. 8 11:19 protobuf.so
编辑php.ini文件,添加一行
[root@test php-protobuf-master]# vi /soft/php/lib/php.ini
[memcache]
extension_dir = "/soft/php/lib/php/extensions/no-debug-non-zts-20090626/"
extension = "redis.so"
extension = "protobuf.so"
博主在安装时候遇到坑 解决方案:
https://blog.csdn.net/frankiecheng/article/details/40742187
Hadoop目前在各种平台广泛使用,Protobuf作为Hadoop编译的前提条件,在PowerLinux平台上面编译时,会出现报错,无法编译通过。
具体解决方案如下:
1. 下载protobuf源代码包protobuf-2.5.0.tar.bz2并解压
tar -jxf protobuf-2.5.0.tar.bz2
cd protobuf-2.5.0
2. cd src/google/protobuf/stubs/
cp atomicops_internals_x86_gcc.cc atomicops_internals_x86_gcc.cc.old
touch atomicops_internals_x86_gcc.cc
cp atomicops_internals_x86_gcc.h atomicops_internals_x86_gcc.h.old
cp ~/atomicops_internals_x86_gcc.h ./
3. 编辑platform_macros.h
vi platform_macros.h
把
#error Host architecture was not detected as supported by protobuf
注释掉
//#error Host architecture was not detected as supported by protobuf
4. 编辑atomicops.h
vi atomicops.h
在文件顶部加
#define GOOGLE_PROTOBUF_ARCH_64_BIT
把
#elif defined(__GNUC__)
#if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64)
#include <google/protobuf/stubs/atomicops_internals_x86_gcc.h>
#elif defined(GOOGLE_PROTOBUF_ARCH_ARM)
#include <google/protobuf/stubs/atomicops_internals_arm_gcc.h>
#elif defined(GOOGLE_PROTOBUF_ARCH_ARM_QNX)
#include <google/protobuf/stubs/atomicops_internals_arm_qnx.h>
#elif defined(GOOGLE_PROTOBUF_ARCH_MIPS)
#include <google/protobuf/stubs/atomicops_internals_mips_gcc.h>
#elif defined(__pnacl__)
#include <google/protobuf/stubs/atomicops_internals_pnacl.h>
#else
GOOGLE_PROTOBUF_ATOMICOPS_ERROR
#endif
改为
#elif defined(__GNUC__)
#if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64)
#include <google/protobuf/stubs/atomicops_internals_x86_gcc.h>
#elif defined(GOOGLE_PROTOBUF_ARCH_ARM)
#include <google/protobuf/stubs/atomicops_internals_arm_gcc.h>
#elif defined(GOOGLE_PROTOBUF_ARCH_ARM_QNX)
#include <google/protobuf/stubs/atomicops_internals_arm_qnx.h>
#elif defined(GOOGLE_PROTOBUF_ARCH_MIPS)
#include <google/protobuf/stubs/atomicops_internals_mips_gcc.h>
#elif defined(__pnacl__)
#include <google/protobuf/stubs/atomicops_internals_pnacl.h>
#else
//GOOGLE_PROTOBUF_ATOMICOPS_ERROR
#include <google/protobuf/stubs/atomicops_internals_x86_gcc.h>
#endif
4. 编译protobuf
#cd ~/protobuf-2.5.0
#./configure --prefix=/usr/local
#make -j4
#make install
5. 验证ProtoBuf是否编译成功
#protoc --version
libprotoc 2.5.0
如果还不能解决请看位大神的教程:
http://blog.chinaunix.net/uid-29281850-id-5194138.html
(1)问题出现:
安装protobuf-c是,我们需要首先安装protobuf, 此外还需要通过protobuf-c对 之前安装的protobuf的版本认证。 我们当前开发所使用的是
protobuf2.6.0 以及protobuf-c 1.1.1 。
protobuf-c 1.1.1 Package requirements (protobuf >= 2.6.0)
Proctobuf 安装步骤
tar zxvf protobuf-2.3.0.tar.gz |
cd protobuf-2.4.1 |
./configure --prefix=/usr/local |
make |
sudo make install |
/sbin/ldconfig -v |
|
Proctobuf-c 安装步骤,版本要一直,前提:Proctobuf-c 1.1.1版本需要protoc版本再2.6.0+
tar zxvf protobuf-c-0.15.tar.gz |
cd protobuf-c-0.15 |
./configure --prefix=/usr/local(此时就会报上诉问题) |
make |
sudo make install |
在执行./configure --prefix=/usr/local(此时就会报上诉问题) 就会报出 开头的问题。
(2)问题原因:
是在给protobuf-c进行环境配置的时候,查找不到上一步所安装protobuf的库文件,而这些库文件又是通过pkgconfig配置进行查找的。 该配置文件此时是在/usr/local/lib/pkgconfig/下 ,也就是问题中所提示的:Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix. 。所以我们只需要将PKG_CONFIG_PATH 指定到/usr/local/lib/pkgconfig/即可。
(3)解决办法:
在命令行执行命令: export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
然后在configure目录下执行./configure --prefix=/usr/local 即可编译通过,然后make&make install 即可完整使用c语言版本的protobuf-c 环境了!!!
测试protobuf-c
执行下面的命令,无报错,去查看下生成文件即可。
|
cd .. |
protoc-c --c_out=./ protobuf-c-0.15/src/test/test.proto |
最后成功