scalaPB自动产生scala代码中的addManyToOne函数款式如下: def addManyToOne(responseObserver: StreamObserver[SumResponse addSbtPlugin("com.thesamet" % "sbt-protoc" % "0.99.18") libraryDependencies += "com.thesamet.scalapb " %% "compilerplugin" % "0.7.1" build.sbt import scalapb.compiler.Version.scalapbVersion import scalapb.compiler.Version.grpcJavaVersion " %% "scalapb-runtime" % scalapbVersion % "protobuf", "io.grpc" % "grpc-netty" % grpcJavaVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion, "io.monix" %% "monix" % "2.3.0"
" %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf" ), name := "akka-protobuf-demo 注意依赖项中的scalapb.runtime。PB.targets指明了产生源代码的路径。 我们还需要在project/scalapb.sbt中指定scalaPB插件: addSbtPlugin("com.thesamet" % "sbt-protoc" % "0.99.18") libraryDependencies in from scalapb-runtime import "scalapb/scalapb.proto"; import "google/protobuf/wrappers.proto"; package import "scalapb/scalapb.proto"; import "google/protobuf/wrappers.proto"; package learn.proto; message
/scalapb.proto"; package learn.grpc.services; /* * Returns a greeting for the given person optionally += "com.thesamet.scalapb" %% "compilerplugin" % "0.7.1" build.sbt import scalapb.compiler.Version.scalapbVersion import scalapb.compiler.Version.grpcJavaVersion name := "learn-gRPC" version := "0.1" scalaVersion : = "2.12.6" libraryDependencies ++= Seq( "com.thesamet.scalapb" %% "scalapb-runtime" % scalapbVersion % "protobuf", "io.grpc" % "grpc-netty" % grpcJavaVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc
build.sbt定义如下: import scalapb.compiler.Version.scalapbVersion import scalapb.compiler.Version.grpcJavaVersion " %% "scalapb-runtime" % scalapbVersion % "protobuf", "io.grpc" % "grpc-netty" % grpcJavaVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion ) PB.targets in Compile := Seq( 我们再随便建个.proto文件: syntax = "proto3"; // Brought in from scalapb-runtime import "scalapb/scalapb.proto " %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf" ), ) unmanagedBase
resolvers += Resolver.bintrayRepo("beyondthelines", "maven") libraryDependencies ++= Seq( "com.thesamet.scalapb import scalapb.compiler.Version.grpcJavaVersion name := "gRPCAkkaStreamDemo" version := "0.1" scalaVersion " %% "scalapb-runtime" % scalapbVersion % "protobuf", "io.grpc" % "grpc-netty" % grpcJavaVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion, "io.monix" %% "monix" % "2.3.0", "beyondthelines" %% "grpcakkastreamruntime" % "0.0.5" ) PB.targets in Compile := Seq( scalapb.gen
版本,以后再说吧,现在只有scalaPB可选了。 scalaPB是一个比较成熟的gRPC客户端,在前面的博客里我们也进行了介绍和示范。下面我们就用scalaPB来实现上面这个例子的客户端-平台集成。 /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name , "com.thesamet.scalapb" %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf ", "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion ) PB.targets
, "io.netty" % "netty-tcnative-boringssl-static" % "2.0.22.Final", "com.thesamet.scalapb" %% "scalapb-runtime " % scalapb.compiler.Version.scalapbVersion % "protobuf", "com.thesamet.scalapb" %% "scalapb-runtime-grpc " % scalapb.compiler.Version.scalapbVersion ) // (optional) If you need scalapb/scalapb.proto or anything from // google/protobuf/*.proto //libraryDependencies += "com.thesamet.scalapb" %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf" PB.targets in Compile := Seq( scalapb.gen
在scala编程世界里我们可以用scalaPB来实现对gRPC和protobuf的使用。 Language)定义数据类型和服务 2、对.proto文件进行编译后产生相关的java数据类型和抽象服务框架 3、在java编程中可以直接调用编译产生的数据类型及对数据进行操作 4、继承并实现产生的服务类 scalaPB 我将会在下面几篇博文里介绍使用scalaPB进行protobuf数据转换、gRPC微服务实现、gRPC的流式操作以及gRPC流与json之间转换方法等。
, "io.netty" % "netty-tcnative-boringssl-static" % "2.0.22.Final", "com.thesamet.scalapb" %% "scalapb-runtime " % scalapb.compiler.Version.scalapbVersion % "protobuf", "com.thesamet.scalapb" %% "scalapb-runtime-grpc /scalapb.proto or anything from // google/protobuf/*.proto //libraryDependencies += "com.thesamet.scalapb " %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf" PB.targets in Compile /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name
println) scala.io.StdIn.readLine() mat.shutdown() system.terminate() } 下面就是这次讨论的完整源代码: project/scalapb.sbt import scalapb.compiler.Version.grpcJavaVersion name := "gRPCJDBCStreaming" version := "0.11" scalaVersion " %% "scalapb-runtime" % scalapbVersion % "protobuf", "io.grpc" % "grpc-netty" % grpcJavaVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion, "io.monix" %% "monix" % "2.3.0", /scalapb.proto"; package grpc.jdbc.services; option (scalapb.options) = { // use a custom Scala
syntax = "proto3"; import "google/protobuf/wrappers.proto"; import "google/protobuf/any.proto"; import "scalapb /scalapb.proto"; option (scalapb.options) = { // don't append file name to package flat_package } serialization-bindings { "com.datatech.pos.abs.CborSerializable" = jackson-cbor "scalapb.GeneratedMessage
" = proto } } 例子里的protobuf消息是由scalapb从.proto文件中自动产生的。 ++= Seq( "com.thesamet.scalapb" %% "compilerplugin" % "0.7.4" ) build.sbt import scalapb.compiler.Version.scalapbVersion "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion, "io.monix" %% "monix" % "2.3.0 /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name
syntax = "proto3"; import "google/protobuf/wrappers.proto"; import "google/protobuf/any.proto"; import "scalapb /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name
syntax = "proto3"; import "google/protobuf/wrappers.proto"; import "google/protobuf/any.proto"; import "scalapb /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name syntax = "proto3"; import "google/protobuf/wrappers.proto"; import "google/protobuf/any.proto"; import "scalapb /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name
" %% "scalapb-runtime" % scalapbVersion % "protobuf", // "io.grpc" % "grpc-netty" % grpcJavaVersion , "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion, "io.monix" %% "monix" % "2.3.0 " % "0.99.18") libraryDependencies ++= Seq( "com.thesamet.scalapb" %% "compilerplugin" % "0.7.4" ) /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name
关于grpc,在前面的scalaPB讨论里已经做了详细的介绍:google gRPC是一种全新的RPC框架,在开源前一直是google内部使用的集成工具。 实际上,在使用scalaPB的过程中一直在关注akka-grpc的发展,直到v1.01发布。这是一个正式版本,相信不会在模式、风格、语法上再有大的改变,应该值得试着使用了。 与scalaPB一样,akka-grpc也是通过编译IDL(.proto)文件用相应的插件(plugin)产生相关的scala类和服务函数代码。 实际上akka-grpc产生代码的plugin还是采用scalaPB的插件,这个过程已经在scalaPB系列博客里详细介绍过了。
++= Seq( "com.thesamet.scalapb" %% "compilerplugin" % "0.7.4" ) build.sbt import scalapb.compiler.Version.scalapbVersion % akkaVersion, "com.typesafe.akka" %% "akka-cluster-metrics" % akkaVersion, "com.thesamet.scalapb " %% "scalapb-runtime" % scalapbVersion % "protobuf", "com.thesamet.scalapb" %% "scalapb-runtime-grpc /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name
下面就是本次讨论涉及的完整源代码: project/scalapb.sbt addSbtPlugin("com.thesamet" % "sbt-protoc" % "0.99.18") resolvers += Resolver.bintrayRepo("beyondthelines", "maven") libraryDependencies ++= Seq( "com.thesamet.scalapb " %% "scalapb-runtime" % scalapbVersion % "protobuf", "io.grpc" % "grpc-netty" % grpcJavaVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion, "io.monix" %% "monix" % "2.3.0", /scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name
q.autoCommit.getOrElse(false), queryTimeout = q.queryTimeout ) jdbcAkkaStream(ctx, toRow) 用scalaPB 下面是scalaPB产生的源代码: override def runQuery: Flow[grpc.jdbc.services.JDBCQuery, grpc.jdbc.services.JDBCDataRow syntax = "proto3"; import "google/protobuf/wrappers.proto"; import "google/protobuf/any.proto"; import "scalapb /scalapb.proto"; package grpc.jdbc.services; option (scalapb.options) = { // use a custom Scala
"io.monix" %% "monix" % "3.0.0-RC2", "org.typelevel" %% "cats-core" % "2.0.0-M1", "com.thesamet.scalapb " %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf", "com.thesamet.scalapb " %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion ) // (optional) If you need scalapb /scalapb.proto or anything from // google/protobuf/*.proto //libraryDependencies += "com.thesamet.scalapb " %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf" PB.targets in Compile