如何使用API 网关做服务编排?

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

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

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

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

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

编排的优势

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

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

使用工具: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上做服务编排?

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

Goku上的服务编排.png

操作概览

  1. 在网关上,新建API的类型可以选择服务编排:
新建服务编排API.png
  1. 配置 查询预定酒店 API的请求信息:
配置API请求信息.png
  1. 添加并配置Step:

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

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

配置Step.png

由于篇幅原因,后续的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的请求参数配置如下所示,请求参数存在多个的话用换行表示:

在Step里入参.png

(二)返回数据处理

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

{
 "status":"000000", 
  "data":{
        "id":"201910180009x"
        ,"user_account":"zzz@163.com"
        ,"hotal":"0001"
        ,"room":"biger1"
        ,"time_start":"20191019"
        ,"time_end":"20191020"
  }
}

2.查询用户详情的API,返回数据称为json2,内容如下:

{
 "status":"000000", 
  "data":{
        "account":"goku@eolinker.com",
        "full_name":"",
        "phone":""
  }
}

3.查询酒店详情的返回数据,称为json3,内容如下:

{
 "status":"000000", 
  "data":{
        "id":"001",
        "type":"星级酒店",
        "name":"",
        "address":"",
        "location":{},
  }
}

4.查询房间详情的返回数据,称为json4,内容如下:

{
 "status":"000000", 
  "data":{
       "name":"豪华大床房"
        ,"window":1
        ,"floor":"10-12"
        ,"nosmoke":1
  }
}

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

    "id":"201910180009x"
    ,"userInfo":{
        "account":"goku@eolinker.com",
        "full_name":"",
        "phone":""
    }
    ,"hotelinfo":{
        "type":"星级酒店",
        "name":"",
        "address":"",
        "location":{},
    }
    , "roominfo":{
        "name":"豪华大床房"
        ,"window":1
        ,"floor":"10-12"
        ,"nosmoke":1
    }
}

这里以查询酒店详情API的返回数据json3为例,讲解网关如何在编排过程中对返回数据做处理。

查询酒店详情API返回的原始数据如下:

{
 "status":"000000", 
  "data":{
        "id":"001",
        "type":"星级酒店",
        "name":"",
        "address":"",
        "location":{},
  }
}

从网关返回给前端的数据中截取酒店信息的数据如下:

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

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

  • 字段黑名单

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

在网关的Step3里配置如下:

字段黑名单配置.png

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

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

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

在网关的Step里配置如下:

拆包配置.png

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

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

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

在网关的Step里配置如下:

封包配置.png

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

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

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

本文仅列举了编排过程中部分数据处理的操作,如需了解更多编排细则,可通过文末给出的教程链接。

相关链接

  1. 项目地址:https://github.com/eolinker/goku-api-gateway
  2. 官网地址:https://www.eolinker.com
  3. 相关教程: 服务编排

转载自:https://blog.csdn.net/qq_40579834/article/details/102661837

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容