上一篇博客 未来实现API管理系统的几个关键词 发布后,有不少读者私信我,让我写一篇实际运用的文章,我周末趁着有空写了这篇有关“服务编排”的文章。用的是Goku API Gateway进行演示, 希望本文对读者有所启发。

什么是服务编排/数据聚合?

服务编排/数据聚合 指的是可以通过一个请求来依次调用多个微服务,并对每个服务的返回结果做数据处理,最终整合成一个大的结果返回给前端。

例如一个服务是“查询用户预定的酒店”,前端仅需要传一个订单ID,后端会返回整个订单的信息,包括用户信息、酒店信息和房间信息等。

这个服务背后可能对应着以下几个操作:

  • 请求订单详情,返回订单对应的用户ID、酒店ID、房间ID;
  • 根据各类ID查询对应的信息;
  • 将数据做过滤、移动等操作,最后整合起来;
  • 将整合好的数据返回给前端。

下面的图可以帮你更好理解:

编排的优势

微服务架构上对功能做了解耦,使用服务编排可以快速从各类服务上获取需要的数据,对业务实现快速响应。总的来说,编排有以下几点优势:

  • 功能解耦,服务能够被复用;
  • 对前端友好,无需多次请求;
  • 业务响应速度快,服务能够被快速生成;
  • 返回数据有改动的话,请求接口无影响;
  • 老系统改动的情况下,不需要改动前端,可以通过网关对数据做兼容。

使用编排工具Goku API Gateway:

先简单介绍一下,Goku API Gateway (中文名:悟空 API 网关)是一个基于 Golang 开发的微服务网关,能够实现高性能 HTTP API 转发、服务编排、多租户管理、API 访问权限控制等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行 API 服务治理、提高 API 服务的稳定性和安全性。

本次之所以采用Goku API Gateway来进行演示,因为它支持一个编排API对应多个后端服务,每个后端服务的请求参数可以使用前端传入的参数,也可以在编排里自定义(写静态参数或从返回数据里获得)。每个后端服务的返回数据支持过滤、删除、移动、重命名、拆包和封包等操作,而且编排API能够设定编排失败时的异常返回。

这次用的是Goku API Gateway 的社区版本(CE),也就是开源版本,我对内置的插件系统进行部分改动也算是定制开发了。

项目地址:https://github.com/eolinker/goku-api-gateway

官网地址:https://www.eolinker.com

下面进入实际操作环节。

如何在Goku上做服务编排?

我们将编排的整个操作放到网关进行,由网关对数据做处理与转换,这样无需对后端服务做改动。一个请求到达网关,网关调用多个后端服务,并且在网关上对各个服务的返回数据做处理(操作有过滤、移动、重命名、封包、拆包,后面会对各操作做详细解释),最后由网关将数据整合好返回给前端。通过下图查看会更加明白:

操作步骤

1.在网关上,新建API的类型可以选择服务编排:

2.配置 查询预定酒店 API的请求信息:

3.添加并配置Step:

网关将编排过程中对 API的转发处理过程(转发->获取返回数据->数据处理)称为一个 Step

添加一个转发服务,该服务为 查询订单详情API,配置相应的转发地址、传入的参数、对返回数据做何种处理等。

由于篇幅原因,后续的Step(查询用户详情、查询酒店详情、查询房间详情)就不一一展示了。

编排的传递参数方式和数据处理

为了让读者更好的理解编排的实现方式,简单说一下两种传递参数方式:

(一)编排的两种传递参数方式

网关将编排过程中对 API的转发处理过程(转发->获取返回数据->数据处理)称为一个 Step。

我们将处理查询订单详情API称为 Step1,其中Step1的返回数据有:用户ID、酒店ID、房间ID。同理,将查询用户信息这步称为 Step2,将查询酒店信息称为 Step3,将查询房间信息称为 Step4

传参规则:

  • 使用前端传入的参数可以写成:body.参数名、header.参数名
  • 使用Step1里的返回数据作为参数可以写成:body1.参数名header1.参数名
  • 以此类推
1.在转发路径传参

以下为转发路径的传参写法:

  • 例如Step1要接收前端传入的orderID参数,还有Authorization参数。

Step1的转发路径可以写成:/getOrderInfo/{{body.orderID}}/{{header.Authorization}}

  • 例如Step2 接收 Step1 里的返回用户ID参数(userID),同时接收前端传入的Authorization参数。

Step2的转发路径可以写成:/getUserInfo/{{body1.userID}}/{{header.Authorization}}

2.在Step里配置请求参数

Step2中需要接收Step1里返回的userID作为参数,同时需要接收前端传入的Authorization参数

在网关里Step2的请求参数配置如下所示,请求参数存在多个的话用换行表示:

(二)返回数据处理

1.查询订单详情的API,返回数据称为json1,内容如下:

{
"status":"",
"data":{
"id":"201910180009x"
,"user_account":"zzz@163.com"
,"hotal":""
,"room":"biger1"
,"time_start":""
,"time_end":""
}
}
 
2.查询用户详情的API,返回数据称为json2,内容如下:
{
"status":"",
"data":{
"account":"goku@eolinker.com",
"full_name":"",
"phone":""
}
}
 
3.查询酒店详情的返回数据,称为json3,内容如下:
{
"status":"",
"data":{
"id":"",
"type":"星级酒店",
"name":"",
"address":"",
"location":{},
}
}
 
4.查询房间详情的返回数据,称为json4,内容如下:
{
"status":"",
"data":{
"name":"豪华大床房"
,"window":
,"floor":"10-12"
,"nosmoke":
}
}

5.可以在每一个Step里对返回Json做处理,网关会将处理过的数据最后整合起来,再返回前端,例如这是通过网关返回的最终数据:

{
"id":"201910180009x"
,"userInfo":{
"account":"goku@eolinker.com",
"full_name":"",
"phone":""
}
,"hotelinfo":{
"type":"星级酒店",
"name":"",
"address":"",
"location":{},
}
, "roominfo":{
"name":"豪华大床房"
,"window":
,"floor":"10-12"
,"nosmoke":
}
}
 
这里以查询酒店详情API的返回数据json3为例,讲解网关如何在编排过程中对返回数据做处理。
 
查询酒店详情API返回的原始数据如下:
{
"status":"",
"data":{
"id":"",
"type":"星级酒店",
"name":"",
"address":"",
"location":{},
}
}
从网关返回给前端的数据中截取酒店信息的数据如下:
"hotelinfo":{
"type":"星级酒店",
"name":"",
"address":"",
"location":{},
}

那么从原始数据到处理后的数据需要经过以下操作:

  • 字段黑名单

字段黑名单的作用是排除某些字段,支持数组形式。

在网关的Step3里配置如下:

经过网关处理后,实际的返回数据如下,可以看到data对象里的id字段已经被过滤掉:

{
"status":"",
"data":{
"type":"星级酒店",
"name":"",
"address":"",
"location":{},
}
}
  • 字段拆包

拆包是指将指定对象的内容提取出来作为该步骤(step)的返回结果。其中匹配目标只能为object,匹配目标为空时,结果为 {},可用于清除数据。

在网关的Step里配置如下:

经过网关处理后,实际的返回数据如下,可以看到data对象被拆开,最终数据仅保留了data对象里面的字段:

{
"type":"星级酒店",
"name":"",
"address":"",
"location":{},
}
  • 封包

字段封包会将当前的数据整体打包为最终返回数据中的一个对象,不支持*,不支持数组。

在网关的Step里配置如下:

经过网关处理后,实际的返回数据如下,数据被整体打包为hotelinfo对象:

{
"hotelinfo":{
"type":"星级酒店",
"name":"",
"address":"",
"location":{},
}
}

经过三个步骤,就可以将原始数据变成最终的数据。

本文仅列举了编排过程中部分数据处理的操作,如需了解更多编排细则,可以在评论区留言。欢迎提出任何建议和想法。最后给出相关的链接,有条件实践的可以去github下载试试。项目地址:https://github.com/eolinker/goku-api-gateway

如何更快理解和运用服务编排?(使用Goku API Gateway实现)的更多相关文章

  1. 几种部署Goku API Gateway的方式,最快一分钟可使用上网关

    本文将介绍几种部署Goku API Gateway的方式,最快一分钟可使用上为网关,详情请看全文. 什么是Goku API Gateway? Goku API Gateway (中文名:悟空 API ...

  2. [转载] 构建微服务:使用API Gateway

    原文: http://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=206889381&idx=1&sn=478ccb35294c ...

  3. v8是怎么实现更快的 await ?深入理解 await 的运行机制

    最近v8团队发表一篇博客Faster async functions and promises, 预计在v7.2版本实现更快的异步函数和promise. 文章内容看起来不是很容易理解,背后的原理比较隐 ...

  4. 让DB2跑得更快——DB2内部解析与性能优化

    让DB2跑得更快——DB2内部解析与性能优化 (DB2数据库领域的精彩强音,DB2技巧精髓的热心分享,资深数据库专家牛新庄.干毅民.成孜论.唐志刚联袂推荐!)  洪烨著 2013年10月出版 定价:7 ...

  5. 让互联网更快:新一代QUIC协议在腾讯的技术实践分享

    本文来自腾讯资深研发工程师罗成在InfoQ的技术分享. 1.前言 如果:你的 App,在不需要任何修改的情况下就能提升 15% 以上的访问速度,特别是弱网络的时候能够提升 20% 以上的访问速度. 如 ...

  6. 快速理解高性能HTTP服务端的负载均衡技术原理(转)

    1.前言 在一个典型的高并发.大用户量的Web互联网系统的架构设计中,对HTTP集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案.HTTP负载均衡的本质上是将Web用户流量进行均衡减压,因此 ...

  7. 比Python、Java更快的 Go 语言,能否称霸江湖?

    关注之后加星标,江湖要事早知道 ​ 文章来源:jb51.net 有一种语言堪称比语言排行榜前五热门选手的Python.Java更快,它就是GO语言. Go于2009年11月正式宣布推出,成为开放源代码 ...

  8. 修复bug有哪些更快的技术?做好这6点就够了

    你有没有想过为什么有时修复错误似乎比它应该花费更长的时间?当你终于找到问题时,事实证明你所需要的只是一个小小的改变.然而,花了很多时间才能找到正在发生的事情.这种情况比我想象的更频繁. 另一方面,当您 ...

  9. Quick UDP Internet Connections 让互联网更快的协议,QUIC在腾讯的实践及性能优化

    https://mp.weixin.qq.com/s/44ysXnVBUq_nJByMyX9n5A 让互联网更快:通往QUIC之路 原创: 史天 翻译 云技术实践 8月15日 QUIC(Quick U ...

随机推荐

  1. 大数据平台搭建 - cdh5.11.1 - oozie安装

    一.简介 oozie是hadoop平台开源的工作流调度引擎,用来管理hadoop作业,属于web应用程序,由oozie server 和oozie client构成. oozie server运行与t ...

  2. ActiveMQ的安装与使用。

    1.什么是ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE .4规范的 JMS Provider实现,尽 ...

  3. 白话系列之IOC,三个类实现简单的Ioc

    前言:博客园上已经有很多IOC的博客.而且很多写的很好,达到开源的水平,但是对于很多新人来说,只了解ioc的概念,以及怎么去使用ioc.然后想更进一步去看源码,但是大部分源码都比较困难,当不知道一个框 ...

  4. Day 24 定时任务

    1.什么是crond crond 就是计划任务,类似于我们平时生活中的闹钟,定点执行. 2.计划任务时间管理 1.Crontab配置文件记录了时间周期的含义 vim /etc/crontab * 表示 ...

  5. 使用git管理github上的代码

    第一次接触git是使用git来提交自己的github的代码,在new repository之后,github会给出一些操作示例. 示例如下: …or create a new repository o ...

  6. Hadoop 之 深入探索MapReduce

    1.MapReduce基础概念 答:MapReduce作业时一种大规模数据的并行计算的便程模型.我们可以将HDFS中存储的海量数据,通过MapReduce作业进行计算,得到目标数据. 2.MapRed ...

  7. gitbook 入门教程之还在搞公众号互推涨粉?gitbook 集成导流工具,轻轻松松躺增粉丝!

    相信大多数博客作者都或多或少有过这样想法: 现在各种平台这么多,想要实现全平台发布就要到处复制粘贴,等我有空一定做统一平台一次性全部解决! 不知道正在阅读文章的你,有没有这样的想法? 反正我确实这么想 ...

  8. 用Python怎么telnet到网络设备

    0.前言 Telnet协议属于TCP/IP协议族里的一种,对于我们这些网络攻城狮来说,再熟悉不过了,常用于远程登陆到网络设备进行操作,但是,它的缺陷太明显了,就是不安全,信息明文传送,极容易被攻击窃取 ...

  9. frp 端口映射

    简介 frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透. 场景 利用处于内网或防火墙后 ...

  10. 为RecyclerView定制可滑动的Item

    最近项目有需要弄一个可以像手机QQ会话页一样可以滑动的小菜单,每一个Item当用户在向左滑动的时候右侧会出现一个小菜单当时就想在也不是很难心想着找个开源的使用就好呢,但是我的项目是用的Recycler ...