文档章节

VS2015编译grpc

moki_oschina
 moki_oschina
发布于 2017/02/14 16:54
字数 1262
阅读 109
收藏 1

一、grpc概述

 GRPC是google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x +。GRPC与thrift、avro-rpc等其实在总体原理上并没有太大的区别,简而言之GRPC并没有太多突破性的创新。

对于开发者而言:

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

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

    3)启动一个Server端,server端通过侦听指定的port,来等待Client链接请求,通常使用Netty来构建,GRPC内置了Netty的支持。

    4)启动一个或者多个Client端,Client也是基于Netty,Client通过与Server建立TCP长链接,并发送请求;Request与Response均被封装成HTTP2的stream Frame,通过Netty Channel进行交互。

二、编译

      1、所需工具:操作系统:Win7 64位 、Visual Studio 2015 、CMake

      2、编译步骤:

      

1、下载

1.1 在 https://github.com/grpc/grpc/tree/v1.0.1 上下载 grpc-1.0.1.zip 文件(下载路径:https://github.com/grpc/grpc/archive/v1.0.1.zip)文件,将文件解压到 grpc-1.0.1。 
1.2 切换到 third_party 目录,分别下载依赖的其它项目,下达完成之后将依赖项分别解压到 third_party 下的对应目录下。 
如 在2017.01.17日,tag v1.0.1 对应的依赖项链接如下: 
https://codeload.github.com/grpc/grpc/zip/v1.0.1 
https://codeload.github.com/google/boringssl/zip/c880e42ba1c8032d4cdde2aba0541d8a9d9fa2e9 
https://codeload.github.com/gflags/gflags/zip/05b155ff59114735ec8cd089f669c4c3d8f59029 
https://codeload.github.com/google/googletest/zip/c99458533a9b4c743ed51537e25989ea55944908 
https://codeload.github.com/google/protobuf/zip/1a586735085e817b1f52e53feec92ce418049f69 
https://codeload.github.com/madler/zlib/zip/50893291621658f355bc5b4d450a8d06a563053d

2、编译protobuf

参考readme用CMAKE生成工程文件,编译即可。

2.1、下载protobuf依赖项gmock和gtest 
下载gmock(https://github.com/google/googlemock/archive/release-1.7.0.zip)和gtest(https://github.com/google/googletest/archive/release-1.7.0.zip),分别解压到grpc-1.0.1\third_party\protobuf\gmock 和 grpc-1.0.1\third_party\protobuf\gmock\gtest\ 目录下。 
2.2、使用CMake编译protobuf 
首先打开vs2015开发人员命令提示符窗口(使用 "VS2015 x86 本机工具命令提示符" 工具),切换到对应的protobuf目录。

  1. cd grpc-1.0.1\third_party\protobuf\cmake
  2. mkdir build & cd build & mkdir install
  3. mkdir debug & cd debug
  4. cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install ../..
  5. nmake && nmake install

生成完成,在grpc-1.0.1\third_party\protobuf\cmake\build\install\lib 目录下面有对应的Lib文件。在cmake目录下面mkdir debug,然后把install/lib目录下的所有库文件拷贝的debug路径,并把后缀d去掉。例如protobuf生成的库名称为libprotocd.lib,应该改名成libprotoc.lib。其他的依次类推。后面编译grpc会用到这些库。

3、编译grpc,grpc_protoc_plugin

在vsprojects里有建好的工程文件,下载nuget.exe,用于依赖包的网络下载。主要是依赖于openssl和zlib库。在编译grpc时,出现编译boringssl,出现很多错误,可以把工程移除可以直接在 grpc.sln 文件中删除 boringssl 工程。

3.1、下载nuget 
下载nuget.exe (路径:https://nuget.org/nuget.exe ),并将期复制到 grpc-1.0.1\vsprojects\ 目录下。 
3.2、使用nuget下载依赖包

  1. cd grpc-1.0.1\vsprojects
  2. nuget restore grpc.sln

3.3、编译grpc 
打开 grpc-1.0.1\vsprojects\grpc.sln 文件,删除boringssl工程,否则后面编译grpc时会报错。若不使用ssl,boringssl可以不编译。

  1. msbuild grpc.sln /p:Configuration=Debug

grpc-1.0.1\vsprojects\Debug\ 目录下会生成grpc相关文件。

3.3、编译grpc_cpp_plugin

  1. msbuild grpc_protoc_plugins.sln /p:Configuration=Debug

grpc-1.0.1\vsprojects\Debug\ 目录下会生成grpc_cpp_plugin相关文件。

4、编译zlib

参考readme,使用cmake编译。

  1. cd grpc-1.0.1\third_party\zlib\
  2. cmake CMakeLists.txt

再用 vs2015 打开 zlib.sln编译即可,文件生成在 Debug 目录。

三、编写测试例子   

1、根据helloworld.proto生成.h和.cc文件

将proto.exe、helloworld.proto、grpc_cpp_plugin.exe拷贝到一个文件夹中,grpc_cpp_plugin.exe是gRPC的protoc插件,生成方法参考我的《编译gRPC》一文。

创建一个bat文件,包含以下命令:

protoc.exe -I=. --grpc_out=. --plugin=protoc-gen-grpc=.\grpc_cpp_plugin.exe helloworld.proto
protoc.exe -I=. --cpp_out=. helloworld.proto

生成了两套文件

hellowworld.pb.h
hellowworld.pb.cc
hellowworld.grpc.pb.h
hellowworld.grpc.pb.cc

其中前两个是protoc生成的,后两个是插件生成的。

2、创建grpc_helloworld工程

在vsprojects目录创建空的WIN32 C++工程grpc_helloworld.sln,在目录grpc_helloworld下面有两个文件夹。目录结构如下图:

grpc-1.0.1\vsprojects\grpc_helloworld.sln 
grpc-1.0.1\vsprojects\grpc_helloworld\grpc_helloworld.vcxproj 
grpc-1.0.1\vsprojects\grpc_helloworld\grpc_helloworld.vcxproj.filters 
grpc-1.0.1\vsprojects\grpc_helloworld\protobuf\helloworld.pb.h 
grpc-1.0.1\vsprojects\grpc_helloworld\protobuf\helloworld.pb.cc 
grpc-1.0.1\vsprojects\grpc_helloworld\protobuf\helloworld.grpc.pb.h 
grpc-1.0.1\vsprojects\grpc_helloworld\protobuf\helloworld.grpc.pb.cc 
grpc-1.0.1\vsprojects\grpc_helloworld\client\greeter_client.cc3

3、设置头文件

D:\XXXX\grpc\include;
D:\XXXX\grpc\third_party\protobuf\src;
$(ProjectDir)..\proto

三个头文件目录,一个是gRPC的头文件,一个是protobuf的头文件,一个是刚生成的的访问类路径。

4、设置库

路径

D:\XXXX\grpc\third_party\protobuf\cmake\Release;
D:\XXXX\grpc\vsprojects\Release;
D:\XXXX\grpc\third_party\zlib\solution\Release;
D:\XXXX\grpc\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\lib\v120\Win32\Release\static

四个库文件路径:protobuf库路径、grpc库路径、zlib库路径、openssl库路径。
没有使用boringssl,openssl的库是从NuGet下载的package中找到的。

库文件

libprotobuf.lib;
grpc.lib;
gpr.lib;
grpc++.lib;
Ws2_32.lib;
libeay32.lib;
ssleay32.lib;
zlibstatic.lib;
%(AdditionalDependencies)

5、编译

      如果出错,则在工程里做如下设置:

预处理器设定: 
_DEBUG;_WIN32_WINNT=0x600;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)

代码生成–>运行库 设置为 "多线程调试 (/MTd)"。顺利的话就可以生成对应的exe了。

 

 

 

 

 

 

 

© 著作权归作者所有

moki_oschina
粉丝 26
博文 202
码字总数 44864
作品 0
成都
程序员
私信 提问
mac下grpc(golang server + php client)实践

目前微服务这么流行,RPC框架也是百花齐放,本文讲述一下mac下grpc的开发环境搭建,其中server端使用golang,客户端使用php。 服务端 golang grpc安装 这里列出了一个参考,由于grpc在githu...

陈晓风
2018/07/01
0
0
前端 Web gRPC 实践和优化

Web gRPC 是 gRPC 在 Web 上的一个适配实现。关于他的介绍以及为什么要用 gRPC 就不在这解释了,如果你决定使用 Web gRPC,并且正在寻找前端的库和解决方案,看一看这篇文章,应该会有所帮助...

徐健本尊
2018/10/25
0
0
gRPC Windows编译应用

gRPC Windows编译 从github上clone出来后进行cmake的编译,参考上面的文档,需要注意的点: 必须安装所有的依赖,包括Perl,Go,YASM,Git,CMake 不要使用--recursive来递归clone,因为墙的...

水海云
2018/06/20
0
0
Grpc介绍 — Go-Service To PHP-Client

笔者现在公司项目大部分是PHP进行开发,要完成整体微服务化必须要考虑PHP使用上的可行性,Grpc也是支持PHP作为client端发起Grpc请求,但是依赖的扩展等都相对复杂(毕竟不是亲儿子),那么本...

喵了_个咪
03/06
0
0
grpc| python 实战 grpc

date: 2018-5-15 22:12:32 title: grpc| python 实战 grpc description: 只要代码可以跑起来, 很多难题都会迎刃而解. so, keep coding and stay hungry. 之前用 swoole 写 server 时就接触过...

daydaygo
2018/05/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java编程学习-Java虚拟机(JVM)以及跨平台原理

相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的。 那么,跨平台是怎样实现的呢?这...

Java领航员
29分钟前
0
0
学JFinal不迷路,JFinal优质资源列表(欢迎反馈更新)

学JFinal不迷路,记录一下JFinal相关的资源、产品、讲师等信息(所有信息排名不分先后)。 一、相关站点: 1、JFinal官网-问答、分享、文档、交流、俱乐部 http://www.jfinal.com 2 、JFina...

山东-小木
33分钟前
1
0
项目学习(2)-order-job

在当前的系统中,因为并发量并不高,服务之间发起异步请求或者异步调用时,没有使用到消息中间件。 而是在各个服务(子系统)的数据库中,创建了event_queue事件对列表和event_handler事件处...

太猪-YJ
41分钟前
1
0
gradle grovvy中的闭包

1. 无参数的闭包 //这b1就是一个闭包def b1={ println "hello b1"}//定义方法,包含闭包类型的参数def method1(Closure closure){closure()}//执行method1method1(b1) 执行结果 ...

edison_kwok
今天
3
0
基于Spring Boot + Dubbo的全链路日志追踪(一)

一、 概要 当前公司后端整体架构为:Spring Boot + Dubbo。由于早期项目进度等原因,对日志这块没有统一的规范,基本上是每个项目自己管自己的日志。这也对后面的问题排查带来了很大的困难,...

明天以后
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部