grpc部署初体验
grpc是google开源的RPC框架,基于http2协议和ProtoBuf序列化机制,关于它的使用实例在官方文档已经有比较详细的介绍,在此仅对安装部署过程作一番总结。
要使用grpc进行正常的开发运行,必须集齐三样法宝,分别是:
Protocol Compiler,使.proto生成序列化代码,如helloworld.proto,通过protoc命令生成如下java文件:
Protobuf Runtime,针对特定语言的运行时库,如java中即是protobuf-java前缀的jar包。
protoc-gen-grpc-java插件,生成通讯代码,如:
这三样法宝都可以在github找到相应的安装包,当然,也可以自己编译生成,但在部署过程中千万要注意它们之间的版本一定要匹配,如Protocol Compiler用了v3.0.0,相应的Protobuf Runtime也是v3.0.0,但是protoc-gen-grpc-java用的却是v0.8.0,相应的grpc-all jar包也是0.8.0,这肯定是不行的,而且就算你找到了相应的版本,在linux环境编译安装过程中会遇到一些缺少文件的错误,涉及一些编译,C语言库的知识,这是一个很不错的探索机会,但是生产使用过程中我们需要的是安全,简洁,高效,把一部分过程封装起来,使用一些工具来统一管理这一过程,使用maven插件就是一个不错的方法,不需要很多步骤,只需要在pom.xml中加入一个配置即可,如你使用grpc v0.14.0:
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.4.1.Final</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<protocArtifact>
com.google.protobuf:protoc:3.0.0-beta-2:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>
io.grpc:protoc-gen-grpc-java:0.14.0:exe:${os.detected.classifier}
</pluginArtifact>
<outputDirectory>${basedir}/src/main/java</outputDirectory>
<clearOutputDirectory>false</clearOutputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
(参考来源:github官网)
此com.google.protobuf:protoc:3.0.0-beta-2:exe:${os.detected.classifier}中的版本号3.0.0-beta-2要和protobuf-java jar包的版本号一致,而io.grpc:protoc-gen-grpc-java:0.14.0中的版本号和你使用的grpc-all jar包中的版本号一致,outputDirectory代表生成的java文件的存放路径,而设置clearOutputDirectory为false,是为了执行compile和compile-custom过程中不覆盖前一步骤生成的文件。
一切就绪,maven install下,它会自动帮你安装缺少的插件并生成java文件。
中文官方文档:http://doc.oschina.net/grpc?t=57966
- Elasticsearch大文件检索性能提升20倍实践(干货)
- Elasticsearch聚合优化 | 聚合速度提升5倍!
- Elasticsearch聚合后分页深入详解
- 可扩展机器学习——线性回归(linear Regression)
- 简单易学的机器学习算法——Label Propagation
- 利用Theano理解深度学习——Convolutional Neural Networks
- 持续精进——我的2017年终总结
- 实战 | Elasticsearch打造知识库检索系统
- Elasticsearch实战 | 必要的时候,还得空间换时间!
- 转--以io.Writer为例看go中的interface{}
- Go支持https协议的简单例子
- Elasticsearch索引增量统计及定时邮件实现
- 机器学习中的特征空间
- 简单易学的机器学习算法——马尔可夫链蒙特卡罗方法MCMC
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法