作为 一款 面向对象函数式编程的语言 ,scala 如此优秀,可是在RPC框架中,竟然被Thrift && protobuf &&GRPC所遗忘,也有可能是scala的门槛实在是太高,导致这些rpc框架选择放弃。
不过作为越来越火的scala,自然 官方不养,就自己生嘛。 作为 scala使用GRPC 衔接的子框架:ScalaPB 无疑在众多框架中独树一帜。
https://scalapb.github.io
登录 scalaPB的官网,就可以看到相应的使用tutorial,内容非常详实,不过需要你最好有使用scala 建构工具sbt的使用经验。
预准备:
1.mac 【windows 下请大家自行尝试,估计不会太难】
2.安装 jdk 8 ,scala 2.12 ,sbt,Protobuf,grpc,IDEA IDE
3.IDEA 安装plugin:Protobuf Support 插件
开始:
在IDEA 创建 scala sbt 项目 ,创建及编译过程中假如出现问题,莫慌,可以查看 此文
另外在我创建时 还出现了 因为sbt -version的问题,后来也不了了之。
等待项目编译好后,在 src/main目录下会有 scala resources java 三个文件夹,在src/main 文件夹中新建 名称为:protobuf 的文件夹,因为 scalaPB插件默认会在scr/main/protobuf下遍历 后缀为.proto的文件 生成scala文件。
To automatically generate Scala case classes for your messages add ScalaPB’s sbt plugin to your project. Create a file named project/scalapb.sbt containing the following line:
addSbtPlugin("com.thesamet"%"sbt-protoc"%"0.99.8")libraryDependencies+="com.trueaccord.scalapb"%%"compilerplugin"%"0.6.0-pre4"
在 项目的project 目录下创建 scalapb.sbt 文件,然后 粘贴其上的内容
addSbtPlugin("com.thesamet"%"sbt-protoc"%"0.99.8")libraryDependencies+="com.trueaccord.scalapb"%%"compilerplugin"%"0.6.0-pre4"
然后在 项目的 build.sbt 中插入 其上的内容 ,注意 ,一定要回车与原来的代码隔一行,否则会报错,
PB.targetsinCompile:=Seq(scalapb.gen()->(sourceManagedinCompile).value)
然后 在Terminal 进入sbt repl 环境下,输入 compile命令 ,则sbt 开始加载 scalapb 插件。
假如你需要在 sbt compile 编译时就从protobuf文件生成scala文件则 需要在build.sbt中 插入
libraryDependencies+="com.trueaccord.scalapb"%%"scalapb-runtime"%com.trueaccord.scalapb.compiler.Version.scalapbVersion%"protobuf"
之后在 src/main/protobuf 目录下创建 。proto文件 ,例如创建person.proto
scalapb 默认是使用protobuf 2的,假如你想使用protobuf 3 ,则需要在proto文件中指定
另外 scalapb在生成的scala文件中存在一个bug ,就是假如在proto文件中没有指定 package ,则生成的scala文件的 package 是多一个 点.,导致文件报错,无法编译,所以需要 在proto指定包名,而且需要在 src/main/scala 下最好存在相应的package 。
还有也可以同时一起生成java 文件,需要在 build.sbt指定其命令
注意插入的时候记着隔一行回车。
在proto文件中 指定 protobuf版本 命令
syntax ="proto3";
在proto文件中指定 package名 命令
package 包名; 例如 package custom_options;
在proto文件中 引入 proto 描述文件
import “google/protobuf/descriptor.proto";
在proto文件中 继承 重写某些方法
extend google.protobuf.FileOptions { optional string my_file_option =50000; }
创建好的person.proto 文件如下
之后点击 IDEA 的SBT viewer 然后项目则开始根据person.proto 文件生成 scala和java文件在 项目的 /target/scala-2.12/src_managed/main中生成文件。
然后大家把生成的scala或者java 代码 粘贴到src/main /scala 相应的包中即可 ,然后可以使用
至此 scalaPB 的入门基本可以告于段落,另外 ScalaPB 还支持 单独的cli方式使用,还支持生成scala.js,还支持生成spark sql,还有json文件,默认情况下 GRPC是打开的,假如需要关闭则可以在build.sbt中指定
PB.targets in Compile:=Seq ( scalapb.gen(grpc=false) - >(sourceManaged in Compile).value)