使用gRPC作为云平台和移动前端的连接方式,网络安全应该是必须考虑的一个重点。gRPC是支持ssl/tls安全通讯机制的。用了一个周末来研究具体使用方法,实际上是一个周末的挖坑填坑过程。...gRPC的ssl/tls的原理是在服务端安装安全证书公用certificate和私钥key, 在客户端安装公共证书就可以了,gRPC代码是这样写的: // Server SslContext sslContext..." %% "compilerplugin" % "0.9.0-M6" 在sbt中执行dependencyTree: ~/scala/intellij/learn-grpc> sbt [info] Loading...不过客户端在使用了证书后仍然无法连接到服务端。没办法,又要再去查资料了。看来现在应该是证书的问题了。先看看是不是因为使用的证书是自签的self-signed-certificate。...grpc-java里提供了一些测试用的证书和私钥和说明文档。
gRPC是google开源提供的一个RPC软件框架,它的特点是极大简化了传统RPC的开发流程和代码量,使用户可以免除许多陷阱并聚焦于实际应用逻辑中。...Language),一种简单的描述语言来自动产生RPC的api源代码 3、支持blocking/non-blocking双向数据流交互,适合程序的流程控制 gRPC的使用非常简单,具体流程如下: 1、...在一个.proto字符类文件中用IDL来描述用户自定义的数据类型和服务 2、用protoc编译器编译文件并产生自定义数据类型和服务的api源代码 3、在server端实现.proto中定义的服务函数 4...、在client端通过自动产生的stub来调用服务 下面我们就来示范gRPC的编程流程。...在本篇讨论中我们先示范Unary-service的编程流程,下面是.proto文件内容: syntax = "proto3"; import "google/protobuf/wrappers.proto
有两种方式可以实现需要的网络连接:Restful-api, gRPC。由于gRPC支持http/2通讯协议,支持持久连接方式及双向数据流。...所以对于POS设备这样的前端选择gRPC作为网络连接方式来实现实时的操作控制应该是正确的选择,毕竟采用恒久连接和双向数据流效率会高很多。...这篇讨论焦点集中在gRPC的server,client两头的具体实现。刚才提过,gRPC是google公司的开源库,同时还提供了各种语言的客户端,有:java, C++,python,go ......现在市面可供选择的gRPC-scala-客户端有scalaPB和akka-grpc两个,akka-grpc是基于akka-stream和akka-http构建的,按理来说会更合适,但由于还是处于preview...scalaPB是一个比较成熟的gRPC客户端,在前面的博客里我们也进行了介绍和示范。下面我们就用scalaPB来实现上面这个例子的客户端-平台集成。
在前面几篇讨论里我们介绍了scala-gRPC的基本功能和使用方法,我们基本确定了选择gRPC作为一种有效的内部系统集成工具,主要因为下面gRPC支持的几种服务模式: 1、Unary-Call:独立的一对...很明显,gRPC支持双向的streaming。...那么如果能把gRPC中ListenableFuture和StreamObserver这两种类型转成akka-stream的基本类型应该就能够实现所谓的reactive-gRPC了。...如果我们能用akka-stream编程方式实现gRPC服务调用的话,可能会遭遇下面的场景:在服务端我们只需要实现一种akka-stream的Flow把进来的request转化成出去的response,如下..."com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion, "io.monix" %% "monix" % "2.3.0",
[SumResponse]): Unit 调用scala函数addOneToMany需要传入参数SumRequest和StreamObserver[SumResponse],也就是说用户需要准备这两个入参数...scalaPB自动产生scala代码中的addManyToOne函数款式如下: def addManyToOne(responseObserver: StreamObserver[SumResponse...注意:虽然在.proto文件中AddManyToOne的返回结果是单个SumResponse,但产生的scala函数则提供了一个StreamObserver[SumResponse]类型,所以需要谨记只能调用一次..." %% "scalapb-runtime" % scalapbVersion % "protobuf", "io.grpc" % "grpc-netty" % grpcJavaVersion,..."com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion, "io.monix" %% "monix" % "2.3.0"
用户首先在.proto文件中用IDL来定义系统中各种需要进行交换的数据类型。然后用protoc编译器自动产生相关的源代码,里面包括了完整的序列化处理函数。...这样把protobuf数据类型和相关的序列化/反序列化函数打成一个独立的包,由用户系统各自引用就是一种最佳解决方案了。 下面示范产生一个独立的protobuf包。..." %% "scalapb-runtime" % scalapbVersion % "protobuf", "io.grpc" % "grpc-netty" % grpcJavaVersion,..."com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion ) PB.targets in Compile := Seq(...scalapb.gen( flatPackage = true ) -> (sourceDirectory in Compile).value / "scala/generated" )
想想实际上用JWT会更加便捷,而且更安全和功能强大,因为除JWT的加密签名之外还可以把私密的用户信息放在JWT里加密后在服务端和客户端之间传递。...通过JWT实现gRPC的函数调用权限管理原理其实很简单:客户端首先从服务端通过身份验证获取JWT,然后在调用服务函数时把这个JWT同时传给服务端进行权限验证。...基本上骑劫了Request和Response。...request-header的,但gRPC又一个结构Context可以在两个地方都能调用。.../scalapb.proto"; option (scalapb.options) = { // use a custom Scala package name // package_name
其中Cassandra和MongoDB属于分布式数据库,可以在集群中任何部署节点调用。而JDBC数据库则是非分布式的,无法部署在多个节点。...由于gRPC支持http/2协议,可以实现双向通讯duplex-communication,解决了独立request/response交互模式在软件编程中的诸多局限。...由于产生的源代码中不涉及任何http协议相关类型及操作,使用起来更容易上手。 在scala编程世界里我们可以用scalaPB来实现对gRPC和protobuf的使用。...java数据类型和抽象服务框架 3、在java编程中可以直接调用编译产生的数据类型及对数据进行操作 4、继承并实现产生的服务类 scalaPB是一个scala版的protobuf编译器。...编译.proto文件后产生scala语言的数据类型和抽象服务类,这样我们就可以在scala环境里使用protobuf和gRPC实现微服务的集成编程了。
关于grpc,在前面的scalaPB讨论里已经做了详细的介绍:google gRPC是一种全新的RPC框架,在开源前一直是google内部使用的集成工具。...由于gRPC支持http/2协议,可以实现双向通讯duplex-communication,解决了独立request/response交互模式在软件编程中的诸多局限。...在http/1应用中对二进制文件的传输交换有诸多限制和不便,特别是效率方面的问题。在protobuf这种序列化模式中对任何类型的数据格式都一视同仁,可以很方便的实现图片等文件的上传下载。...也许,在开发一套内部IT系统的过程中akka-grpc可以很趁手。...实际上akka-grpc产生代码的plugin还是采用scalaPB的插件,这个过程已经在scalaPB系列博客里详细介绍过了。
首先声明:标题上的所谓编程模式是我个人考虑在集群环境下跨节点(jvm)的流程控制编程模式,纯粹按实际需要构想,没什么理论支持。...由于jdbc数据库不支持分布式的运算模式,所以从数据交换的角度上它与集群环境是脱离的:jdbc数据不可以从集群中的任何节点获取。所以只有通过基于http的一种服务来向其它节点提供数据。...我首先考虑了akka-http,在准备过程中接触了gRPC,发现gRPC更加适合跨jvm的程序控制,主要因为gRPC支持双向的流控制。...在这篇讨论里我们将会验证通过JDBC Streaming实现gRPC服务。有关JDBC-Streaming的具体实现方式和使用方法请参考以前写的博客。那我们就开始吧。.../scalapb.proto"; package grpc.jdbc.services; option (scalapb.options) = { // use a custom Scala
我在前面提到过MongoDB不支持像SQL般字符式的操作指令,所以我们必须对所有的MongoDB操作指令建立protobuf类型才能支持MongoDB指令的序列化。...在对上一篇博文里我们把MongoDB的消息指令序列化单独挑出来讨论了一番,在这篇我们准备在一个MongoDB scala开发环境里通过streaming运算来示范这些protobuf消息的应用。 ...这两个函数的实现包含在文章后面提供的源代码中。.../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
具体使用方式是在集群所有节点部署ClusterSingletonManager,由集群中的leader节点选定其中一个节点并指示上面的ClusterSingletonManager运行一个cluster..." = proto } } 例子里的protobuf消息是由scalapb从.proto文件中自动产生的。...下面是这次讨论中的示范源代码: project/scalapb.sbt addSbtPlugin("com.thesamet" % "sbt-protoc" % "0.99.18") libraryDependencies..."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
毕竟用akka-grpc做了些事情,想想还是再写这篇跟大家分享使用kka-grpc的过程。 我说过,了解akka-grpc的主要目的还是在protobuf的应用上。这是一种高效率的序列化协议。...如何在akka系统里使用protobuf格式的数据正是本篇讨论和示范的目的。...shopId:posId就是代表为某用户构建的entityId,这个是通过用户在Request中提供的MetaData参数中jwt解析得出的。 可以看到,具体服务提供是通过集群的分片实现的。...akka消息支持多种序列化格式,包括protobuf, 在配置文件.conf里定义: akka { loglevel = INFO actor { provider = cluster...客户端设置可以在配置文件中定义: akka { loglevel = INFO grpc.client { "com.datatech.pos.abs.Services" {
gRPC Streaming的操作对象由服务端和客户端组成。在一个包含了多个不同服务的集群环境中可能需要从一个服务里调用另一个服务端提供的服务。...下面我们就针对以上场景在一个由JDBC,Cassandra,MongoDB几种gRPC服务组成的集群环境里示范在这几个服务之间的stream连接和运算。..."; import "google/protobuf/any.proto"; import "scalapb/scalapb.proto"; option (scalapb.options) = {...file name to package flat_package: true // generate one Scala file for all messages (services still...在处理R1的环节里可能会需要其它服务的运算结果。
这是在同一个集群内的消息共享机制:发布者(publisher)和订阅者(subscriber)都在同一个集群的节点上,所有节点上的DistributedPubSubMediator通过集群内部的沟通机制在底层构建了消息流通渠道...在具体应用中要注意sender()的具体意义:从提供服务的actor方面看,sender()代表ClusterClientReceptionist。..." %% "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
akka提供了一种基于节点运算资源负载的算法,在配置文件中定义: akka.extensions = [ "akka.cluster.metrics.ClusterMetricsExtension" ]...的使用场景和作用,这部分与官方文档有些出入。..." %% "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
和createCQL,可以预计这会是一种批次型batch方式。...在.proto文件里用DDL来对应Context和Service: message CQLUpdate { repeated string statements = 1; bytes parameters..." %% "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
在一个akka-cluster环境里,从数据调用的角度上,JDBC数据库与集群中其它节点是脱离的。这是因为JDBC数据库不是分布式的,不具备节点位置透明化特性。...因为我们已经明确选择了在akka-cluster集群环境里实施gRPC服务模式,通过akka-stream的流控制方式实现数据库操作的程序控制,所以在本次讨论里我们将示范说明gRPC-JDBC-Streaming...具体实现在附件的JDBCEngine.scala中。...JDBCEngine.scala中。.../scalapb.proto"; package grpc.jdbc.services; option (scalapb.options) = { // use a custom Scala
任何类型的实例作为消息在两端独立系统的机器之间进行传递时必须经过序列化/反序列化serialize/deserialize处理过程。...在akka中使用自定义序列化方法包括下面的这些步骤: 1、在.proto文件中对消息类型进行IDL定义 2、用ScalaPB编译IDL文件并产生scala源代码。...这些源代码中包括了涉及的消息类型及它们的操作方法 3、在akka程序模块中import产生的classes,然后直接调用这些类型和方法 4、按akka要求编写序列化方法 5、在akka的.conf文件里...() -> (sourceManaged in Compile).value ) local和remote是两个分开的项目。...注意依赖项中的scalapb.runtime。PB.targets指明了产生源代码的路径。
首先,我们需要在cassandra上创建相关的keyspace和table。...下面是在scala中使用cassandra-java-driver的例子: import com.datastax.driver.core._ import akka.actor.ActorSystem...好了,完成了事件日志读取和转换成数据行格式并写入数据库表后,下一步就是建一个reader-actor负责完成这一轮工作。..." %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf", "com.thesamet.scalapb..." %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion ) // (optional) If you need scalapb
领取专属 10元无门槛券
手把手带您无忧上云