ScalaPB(0): 找寻合适的内部系统微服务集成工具
前一段时间我们探讨了SDP的一个基于集群的综合数据平台解决方案,由多种数据库组成,包括:JDBC, Cassandra 及MongoDB。其中Cassandra和MongoDB属于分布式数据库,可以在集群中任何部署节点调用。而JDBC数据库则是非分布式的,无法部署在多个节点。假设我们把每种数据库的数据处理功能以微服务microservice形式提供出来的话,任何从其它集群节点对JDBC数据库微服务的调用都需要进行数据的序列化(serialization)。虽然Cassandra和MongoDB是分布式的,但也只限在它们已部署的不同节点上自由交流。现在看来,不同的数据微服务之间的交互还是需要通过serialization来实现的。也就是说数据需要经过序列化marshalling才能发送,接收后反序列化unmarshalling才能还原数据。曾经花了点时间研究了一下akka-http:当时我初选的所谓系统集成工具,它是通过json格式数据交换来集成系统的。json是个标准数据格式,所以可以实现异类系统之间的数据交换。一直在考虑,如果SDP数据平台微服务之间是通过akka-http进行数据交换的形式实现集成的话,这个集成的体系内部交互效率会非常低,这是因为1、json是一种字符型的数据,占据空间较大,传输效率自然低。2、受制于http1.0交互模式,方便了数据下行但上行数据只限于请求指令。这种模式在系统层面的交互能力很有限,或者很不自然,很不方便。为此也郁闷了一阵。实际上使用akka-http需要的门槛很高,即使akka-http已经提供了许多帮助http操作的类型,但光是理解http协议内容及httprequest,httpresponse细节、构建、使用方法就花去了我几个星期的精力,而且才刚刚达到枯浅的理解水平,如果在实际应用中能够真正调动自然,则需要添加更多的努力了。
google gRPC是一种全新的RPC框架,在开源前一直是google内部使用的集成工具。gRPC支持通过http/2实现protobuf格式数据交换。protobuf即protocol buffer,是google发明的一套全新的序列化传输协议serialization-protocol,是二进制编码binary-encoded的,相对java-object,XML,Json等在空间上占有优势,所以数据传输效率较高。由于gRPC支持http/2协议,可以实现双向通讯duplex-communication,解决了独立request/response交互模式在软件编程中的诸多局限。这是在系统集成编程方面相对aka-http占优的一个亮点。protobuf格式数据可以很方便的转换成 json格式数据,支持对外部系统的的开放协议数据交换。这也是我决定选择gRPC作为大型系统微服务集成开发工具的主要原因。更重要的是:用protobuf和gRPC进行client/server交互不涉及任何http对象包括httprequest,httpresponse,很容易上手使用,而且又有在google等大公司内部的成功使用经验,用起来会更加放心。
gRPC支持下面四种交互协议:
1、Unary:独立的一对client-request/server-response,是我们常用的http交互模式
2、Server-Streaming:client发出一个request后从server端接收一串多个response
3、Client-Streaming:client向server发送一串多个request后从server接收一个response
4、Bidirectional-Streaming:还是由client首先发送request启动连接,然后在这个连接上client/server双方可以不断交互信息。
感觉第4种方式最适合程序流程层面的交互。也就是说它可以代表一种自然的程序流程,虽然它还是需要client主动发起交互连接。由于产生的源代码中不涉及任何http协议相关类型及操作,使用起来更容易上手。
在scala编程世界里我们可以用scalaPB来实现对gRPC和protobuf的使用。
google gRPC的使用流程如下:
1、创建一个.proto文件,用IDL语言(Interface Definition Language)定义数据类型和服务
2、对.proto文件进行编译后产生相关的java数据类型和抽象服务框架
3、在java编程中可以直接调用编译产生的数据类型及对数据进行操作
4、继承并实现产生的服务类
scalaPB是一个scala版的protobuf编译器。编译.proto文件后产生scala语言的数据类型和抽象服务类,这样我们就可以在scala环境里使用protobuf和gRPC实现微服务的集成编程了。
我将会在下面几篇博文里介绍使用scalaPB进行protobuf数据转换、gRPC微服务实现、gRPC的流式操作以及gRPC流与json之间转换方法等。
ScalaPB(0): 找寻合适的内部系统微服务集成工具的更多相关文章
- Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战
Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战 Java生鲜电商平台- 什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定 ...
- 毕业设计代做,各种系统微服务项目ssm项目,员工管理系统,微信小程序,购物商城,二手商城系统,销售系统,等等
毕业设计代做,各种系统,微服务项目,ssm项目 小程序,商城等,期末作业等都可以,价格好说,长期接单, 有项目说明书,软件介绍相关文档,答辩的时候包过,知识点对接好,给你讲解等, 毕业设计代做,各种系 ...
- microcks 微服务mocks 工具&&运行时
microcks 是一个方便的微服务mock 工具,我们可以用来mock request.response,同时获取api 的服务契约,microcks 支持的部署模式也比较多,docker-comp ...
- 基于SkyWalking的分布式跟踪系统 - 微服务监控
上一篇文章我们搭建了基于SkyWalking分布式跟踪环境,今天聊聊使用SkyWalking监控我们的微服务(DUBBO) 服务案例 假设你有个订单微服务,包含以下组件 MySQL数据库分表分库(2台 ...
- iUAP云运维平台v3.0全面支持基于K8s的微服务架构
什么是微服务架构? 微服务(MicroServices)架构是当前互联网业界的一个技术热点,业内各公司也都纷纷开展微服务化体系建设.微服务架构的本质,是用一些功能比较明确.业务比较精练的服务去解决更大 ...
- mPass多租户系统微服务开发平台
目录 项目总体架构图 基于SpringBoot2.x.SpringCloud并采用前后端分离的企业级微服务,多租户系统架构微服务开发平台 mPaaS(Microservice PaaS)为租户业务开发 ...
- Google、IBM和Lyft开源其大型微服务系统管理工具Istio
Istio 的优势 集群规模可视性:在故障状况出现时,运营人员需要利用多种工具以始终关注集群运行状况并分析微服务状态图表.Istio 项目能够监控与应用程序及网络活动相关的数据,利用 Promethe ...
- Spring Cloud(一)简单的微服务集成Eureka
1 Spring Cloud简介 1.1 简介 Spring Cloud项目的官方网址:https://projects.spring.io/spring-clo ...
- 微服务效率工具 goctl 深度解析(上)
前言 本文根据 安前松 的视频分享整理而来,视频回放地址如下: https://www.bilibili.com/video/BV1Hr4y1x7Ne goctl 的由来 1. goctl 的诞生 g ...
随机推荐
- nyoj 非洲小孩
非洲小孩 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 家住非洲的小孩,都很黑.为什么呢?第一,他们地处热带,太阳辐射严重.第二,他们不经常洗澡.(常年缺水,怎么洗 ...
- Mysql-5.7.21安装配置
搞开发多年,其实MySql前前后后安装配置了无数次,但是每次都需要到网上搜教程,折腾半天才搞定,这次索性把整个过程全部记录下来,以便以后查阅. 下载 到MySql官网,导航找到DOWNLOADS> ...
- windows 10下通过python3.6成功搭建jupyter 服务器
最近通过python学习爬虫技术,发现一个工具jupyter notebook很不错,该工具明显优势通过浏览器可以输入多行python代码,支持在线运行以及运行结果保存功能,在线验证python小模块 ...
- ASP.NET 访问项目网站以外的目录文件
简单的说,可以通过在 IIS 添加虚拟目录的方法做到,获取访问路径的时候就用 HttpContext.Current.Server.MapPath("~/xxx"); 的方式. 下 ...
- Win7下安装composer, 并使用其安装smarty
安装composer需要开启PHP openssl扩展. 1) 先查看PHP是否开启了openssl扩展 键盘win+r 输出cmd, 可以看到Dos窗口, 然后执行php -m (需要添加PHP环境 ...
- java 实现多文件打包下载
jsp页面js代码: function downloadAttached(){ var id = []; id.push(infoid); var options = {}; options.acti ...
- javascript改变style样式和css样式
转载 在很多情况下,都需要对网页上元素的样式进行动态的修改.在JavaScript中提供几种方式动态的修改样式,下面将介绍方法的使用.效果.以及缺陷. 1.使用obj.className来修改样式表的 ...
- eclipse版本对应的jdk版本
Installing Eclipse is relatively easy, but does involve a few steps and software from at least two d ...
- Python之面向对象一
引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...
- spark算子:partitionBy对数据进行分区
def partitionBy(partitioner: Partitioner): RDD[(K, V)] 该函数根据partitioner函数生成新的ShuffleRDD,将原RDD重新分区. s ...