作為 一款 面向?qū)ο蠛瘮?shù)式編程的語言 娇妓,scala 如此優(yōu)秀,可是在RPC框架中,竟然被Thrift && protobuf &&GRPC所遺忘乍构,也有可能是scala的門檻實在是太高周崭,導(dǎo)致這些rpc框架選擇放棄柳譬。
不過作為越來越火的scala,自然 官方不養(yǎng)续镇,就自己生嘛美澳。 作為 scala使用GRPC 銜接的子框架:ScalaPB 無疑在眾多框架中獨樹一幟。
https://scalapb.github.io
登錄 scalaPB的官網(wǎng)摸航,就可以看到相應(yīng)的使用tutorial,內(nèi)容非常詳實制跟,不過需要你最好有使用scala 建構(gòu)工具sbt的使用經(jīng)驗。
預(yù)準(zhǔn)備:
1.mac ?【windows 下請大家自行嘗試酱虎,估計不會太難】
2.安裝 jdk 8 ?雨膨,scala 2.12 ,sbt读串,Protobuf聊记,grpc撒妈,IDEA IDE
3.IDEA 安裝plugin:Protobuf ?Support 插件
開始:
在IDEA 創(chuàng)建 scala ?sbt 項目 ,創(chuàng)建及編譯過程中假如出現(xiàn)問題排监,莫慌狰右,可以查看 ?此文
另外在我創(chuàng)建時 還出現(xiàn)了 因為sbt -version的問題,后來也不了了之舆床。
等待項目編譯好后棋蚌,在 src/main目錄下會有 ?scala ?resources ? java ?三個文件夾,在src/main 文件夾中新建 ?名稱為:protobuf 的文件夾挨队,因為 scalaPB插件默認(rèn)會在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 目錄下創(chuàng)建 scalapb.sbt 文件,然后 粘貼其上的內(nèi)容 ?
addSbtPlugin("com.thesamet"%"sbt-protoc"%"0.99.8")libraryDependencies+="com.trueaccord.scalapb"%%"compilerplugin"%"0.6.0-pre4"
然后在 項目的 build.sbt 中插入 其上的內(nèi)容 盛垦,注意 坷备,一定要回車與原來的代碼隔一行,否則會報錯情臭,
PB.targetsinCompile:=Seq(scalapb.gen()->(sourceManagedinCompile).value)
然后 ?在Terminal ?進(jìn)入sbt repl 環(huán)境下省撑,輸入 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 目錄下創(chuàng)建 ?竟秫。proto文件 ,例如創(chuàng)建person.proto
scalapb 默認(rèn)是使用protobuf 2的跷乐,假如你想使用protobuf 3 肥败,則需要在proto文件中指定
另外 scalapb在生成的scala文件中存在一個bug ,就是假如在proto文件中沒有指定 package 愕提,則生成的scala文件的 package 是多一個 點.,導(dǎo)致文件報錯馒稍,無法編譯,所以需要 在proto指定包名浅侨,而且需要在 src/main/scala 下最好存在相應(yīng)的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; }
創(chuàng)建好的person.proto 文件如下
之后點擊 IDEA 的SBT viewer 然后項目則開始根據(jù)person.proto ?文件生成 scala和java文件在 ?項目的 /target/scala-2.12/src_managed/main中生成文件鼓黔。
然后大家把生成的scala或者java 代碼 粘貼到src/main /scala 相應(yīng)的包中即可 ,然后可以使用
至此 scalaPB 的入門基本可以告于段落不见,另外 ScalaPB 還支持 ?單獨的cli方式使用澳化,還支持生成scala.js,還支持生成spark sql,還有json文件稳吮,默認(rèn)情況下 ?GRPC是打開的缎谷,假如需要關(guān)閉則可以在build.sbt中指定
PB.targets ?in ?Compile:=Seq ( scalapb.gen(grpc=false) - >(sourceManaged in Compile).value)