疯狂创客圈 死磕Netty 亿级流量架构系列之20

博客园 总入口

本文说明

本篇是 netty+Protobuf 整合实战的 第一篇,完成一个 基于Netty + Protobuf 实战案例。

要实现高并发、大流量,首先需要高传输效率的协议,Protobuf 是迄今为止最高性能之一的传输格式,我们首先将 Protobuf 和Netty整合起来。

顺便说明下:

本文的内容只是一个初稿、初稿,本文的知识,在《Netty Zookeeper Redis 高并发实战》一书时,进行大篇幅的完善和更新,并且进行的源码的升级。 博客和书不一样,书的内容更加系统化、全面化,更加层层升入、层次分明、更多次的错误排查,请大家以书的内容为准。

本文的最终内容, 具体请参考疯狂创客圈 倾力编著,机械工业出版社出版的 《Netty Zookeeper Redis 高并发实战》一书 。

本案例源代码

源代码下载链接: netty+protobuf (整合源代码)

1.1. protobuf 代码生成

在创建好.proto协议**文件之后,就需要按照好了对应版本的 protoc.exe工具protoc.exe工具是生成Java文件的工具软件。 安装的方法,前面已经讲了。

这里需要提示一下版本。Java 的maven 配置文件中 proto 包的版本,和 .proto文件的版本, 以及生成java 代码的protoc.exe的版本,三者需要一致。

1.1.1. 使用命令生成

下面开始生成 消息的 Java代码。 需要用到下面的指令:

protoc.exe --java_out=输出的Java文件路径名称 .proto文件路径名称

例如:

protoc.exe --java_out=./src/main/java/ ./proto/ProtoMsg.proto

输入完之后,回车即可在目标目录看到已经生成好的Java文件,然后将该文件放到项目中该文件指定的路径下即可。

本案例的工程中,以及给大家准备好了.bat windows 的命令文件,在 .bat 目录 下执行.bat 文件即可。 .bat 文件如下:

d:

cd D:\crazymakercircleJava\nettydemo\chatcommon

protoc.exe --java_out=./src/main/java/ ./proto/ProtoMsg.proto

使用的时候,注意调整为实际的目录。

1.1.2. 命令生成代码的两个大坑

1.1.2.1. 大坑一:可劲儿提示没有协议版本

使用protoc.exe指令生成java代码时,提示没有设置协议版本。错误如下:

D:\crazymakercircleJava\nettydemo\chatcommon>protoc.exe --java_out=./src/main/java/ ./proto/ProtoMsg.proto

[libprotobuf WARNING T:\src\github\protobuf\src\google\protobuf\compiler\parser.cc:562] No syntax specified for the proto file: proto/ProtoMsg.proto. Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)

实际上,协议版本是已经设置好了的。

1.1.2.2. 大坑二: 没有生成Java代码

通过切换到老的protobuf代码生成器版本,比方说2.6.1 ,这时候,会没有错误提示了。

但是,新的问题来了,在代码生成的目标目录下,就是看不到生成Java代码。说明代码还是没有生成成功。

爬出这两个大坑,会浪费大量的时间。

1.1.3. 使用Maven插件生成Java代码

其实,天无绝人之路。

一条更好的路等着你来。这就是maven插件。

使用protobuf-maven-plugin,可以非常方便的生成Java代码。

插件的配置如下:

<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<extensions>true</extensions>
<configuration>
<!--默认值-->
<protoSourceRoot>${project.basedir}/proto/protoConfig</protoSourceRoot>
<!--默认值-->
<!--<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>-->
<outputDirectory>${project.build.sourceDirectory}</outputDirectory>
<!--设置是否在生成java文件之前清空outputDirectory的文件,默认值为true,设置为false时也会覆盖同名文件-->
<clearOutputDirectory>false</clearOutputDirectory>
<!--默认值-->
<temporaryProtoFileDirectory>${project.build.directory}/protoc-temp</temporaryProtoFileDirectory>
<protocExecutable>${project.basedir}/proto/protobin/protoc3.6.1.exe</protocExecutable>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>

插件的配置项中,需要配置的内容如下:

(1)protoSourceRoot : protobuf 协议文件的路径

(2)outputDirectory :java 文件的目标路径

(3)protocExecutable : protobuf 代码生成工具的路径

配置好之后,执行插件的compile命令, Java代码就利索的生成了。


疯狂创客圈 分布式实战社群
  • 亿级流量 高并发 IM后台 开源项目实战

  • Netty 源码、原理、JAVA NIO 原理

  • Java 面试题 一网打尽

  • 疯狂创客圈 【 博客园 总入口 】


protobuf + maven 爬坑记的更多相关文章

  1. .NET Core爬坑记 1.0 项目文件

    前言: 之所以要写这个系列是因为在移植项目到ASP.NET Core平台的过程中,遇到了一些“新变化”,这些变化有编译方面的.有API方面的,今天要讲的是编译方面的一些问题.我把它们整理后分享出来,以 ...

  2. mint-ui之picker爬坑记

    picker的数据来源为动态获取时,数据无法正常渲染!因为方法不对,所以坑大了!深刻地体会到'业不精,我之过',谨以此文,深刻地记录一下踩坑及爬坑的整个过程,以便日后不再入坑,也给后来者提供一下参考 ...

  3. mac开发环境爬坑记(搭建php+nginx+mysql+redis+laravel+git+phpstorm)

    题外话:前几天,终于以原价一半的价格,将我那台15版mbp在bbs上卖了出去.之所以用了“终于”这个词儿,是我一直迟迟没有下定决心卖掉它,可眼瞅着再不卖掉,又要掉价,况且我的新电脑,也终于下来了. 话 ...

  4. maven项目新检出后不编译爬坑记 及 mvn clean package报错 WagonTransporterFactory: java.util.NoSuchElementException 异常【我】

    从SVN新检出一个maven项目,配置好后,发现项目无法编译(只有一个test包中的代码显示编译报错,其他所有包中的代码都不编译,也不报错), 先注释掉报错的test包中的所有内容, 用Eclipse ...

  5. python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

    简介 有些 post 的请求参数是 json 格式的,这个前面发送post 请求里面提到过,需要导入 json模块处理.现在企业公司一般常见的接口因为json数据容易处理,所以绝大多数返回数据也是 j ...

  6. swagger 爬坑记

    Swagger 的好处不用我多说,但是一不小心可能就被坑……今天下午就被上了一课,废话不多说,直接上代码(图) 实体类: 好像没啥问题,对吧? 但是,在http://localhost:8080/sw ...

  7. 【MyBatis】MyBatis自动生成代码查询之爬坑记

    前言 项目使用SSM框架搭建Web后台服务,前台后使用restful api,后台使用MyBatisGenerator自动生成代码,在前台使用关键字进行查询时,遇到了一些很宝贵的坑,现记录如下.为展示 ...

  8. centos部署yapi爬坑记

    前言 这几天终于完成了为期三个月的公司某个demo版的项目,在这期间和公司的后台因为API的事怼过无数次了,'我的接口没问题,是你请求的方式不对吧!'.'一定是你请求的参数不对'......诸如此类问 ...

  9. SQL Server 事务复制爬坑记

    SQL Server 复制功能折腾了好几天了,现特将其配置过程以及其间遇到的问题记录下来,以备日后查阅.同时,也让“同道”同学们少走不必要的弯路.如果有不对之处,欢迎大家指正,欢迎沟通交流. 一.复制 ...

随机推荐

  1. BZOJ 3083 遥远的国度 (换根讨论 + 树链剖分)

    题目链接  BZOJ3083 换根不能真正地换. 令当前的根为$cnt$,要查找的子树根为$x$ $1$.$x = cnt$,那么要查找的区域就是整棵树. $2$.$x$在以$cnt$为根的子树内,那 ...

  2. CS Academy Round #65 Count Arrays (DP)

    题目链接  Count Arrays 题意  给定$n$和$m$个区间.若一个长度为$n$的$01$序列满足对于每一个给定的区间中至少有一个位置是$0$, 那么这个$01$序列满足条件.求有多少满足条 ...

  3. BZOJ1801 [Ahoi2009]chess 中国象棋(DP, 计数)

    题目链接 [Ahoi2009]chess 中国象棋 设$f[i][j][k]$为前i行,$j$列放了1个棋子,$k$列放了2个棋子的方案数 分6种情况讨论,依次状态转移. #include <b ...

  4. codevs——1154 能量项链(区间DP)

    2006年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解    题目描述 Description 在Mars星球上,每个Mars人 ...

  5. java文件下载导出

    前台代码: $("#btnExport").click(function(){ top.$.jBox.confirm("确认要导出房屋信息吗?","系 ...

  6. Mac OS X上使用Wireshark抓包

    Wireshark针对UNIX Like系统的GUI发行版界面采用的是X Window(1987年更改X版本到X11).Mac OS X在Mountain Lion之后放弃X11,取而代之的是开源的X ...

  7. How to Log Users Login and Logout Details Through Oracle Forms

    Log user's login and logout details in to table through Oracle Forms using POST-LOGON and PRE-LOGOUT ...

  8. django中引入json

    try: from django.utils import simplejson as jsonexcept: import simplejson as json

  9. 转: 学习Javascript闭包(Closure) (阮一峰)

    from: http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

  10. 性能测试脚本开发(LR.NET控件)

    性能测试过程中,最耗费经历的就是编写性能测试脚本的过程,在大部分的测试工具中都是采用录制的方式,通过录制产生脚本,然后根据需要进行修改,以及参数化.有些时候为了能够完成某一个功能的脚本,需要将录制下来 ...