DJI(大疆创新)http服务网关系统是用于对http服务进行治理的系统,支撑微服务的落地和开放平台open api的接入。支持跨多机房的服务路由,通过该系统可以对调用方进行身份认证、服务授权&鉴权、服务流控、服务降级、调用度量数据统计分析、服务依赖视图等。
整个系统架构如下图,分为三大部分:api网关、网关控制台、度量数据采集分析(这个未在图中体现)。
1.api服务网关
api服务网关是一个java web应用,域名:apigw.xxx.com。api服务网关类似企业应用集成中的ESB,为服务调用提供一个统一的访问点,支持服务流控和服务异常情况下的fail-fast。
服务网关实现可采用的技术和组件:
A)mule、camel、servicemix/JBI等中间件
B)nginx+lua脚本、OpenResty
C)spring integration
考虑到代码的维护性和开发技能,没有使用这些技术。
为了提高性能和并发,全程采用异步方式,上图中的拦截器(过滤器)、servlet(包括servlet异步io)、http client均为异步。
2.网关控制台
网关控制台是一个java web应用,域名apiadmin.xxx.com。提供domain管理、应用管理、服务授权、服务监控、统计和度量数据展示、查看服务全局视图等功能。
服务消费者和服务提供者都要在网关控制台进行应用注册,控制台为每个应用分配应用id(appId唯一)和应用密钥(appSecret)。注册时需要提供的信息:应用名称、应用描述、应用负责人、负责人手机&邮箱。
3.服务注册
http服务可用任意语言实现,如ruby、php、java。服务提供者要向服务网关注册其提供的http服务。
服务注册接口url为http://apigw.xxx.com/registry/services,http方法PUT。
服务提供者启动后,调用该接口将其服务注册到服务注册中心,服务注册请求http body为json字符串,格式如下:
{“appId”:”${appId}”,
“httpServices”: {“endpoint”:[“http://${ip}:${port}?urlPrefixPattern=/xxx”,…],
”services”:[ {“resourceName”:”${resourceName}”,
“version”:”${version}”
”urls”:[{“name”:”${name}”,”url”:”/xxx/xxx”,”method”:”GET”,
”serverTimeout”:${ms}},…
]
},…
]
}
}
说明:appId为服务提供者的应用id;
endpoint为http服务地址,urlPrefixPattern是可选的,为url前缀模式,对java应用,就是servlet url pattern的前缀匹配模式字符串,urlPrefixPattern以/开头,例如/api。
endpoint示例["http://58.1.1.1:8080","http://59.2.61.34?urlPrefixPattern=/api"]
services是包含的http rest资源服务,每个rest资源都有一个resourceName,在整个api服务网关中唯一。每个资源下面可有多个urlOperation(url+http method的组合,url+http method在resourceName内唯一)的组合,urls中的内容就是描述这些组合,其中的name是功能方法的人性化名称,url以/开头,如果根据url中的path和http method已经可以唯一确定一个urlOperation,url可以没有query string,否则要在url中加入queryString的key来限定该url,key放在[]中,如果有多个key,用,分隔,例如/users?qs=[name],name就是queryString中的key。如果url中有模板参数,需要将模板参数放在{}中,例如/users/{name},可以使用/user/abc或/user/u657来匹配该模板。模板参数缺省是字符串,如果要限定是整数,可以在模板参数后面加入@d,例如/users/{id@d},这样只能使用/user/123之类的url来调用。对java spring mvc,url就是controller @RequestMapping中的value值。Method是http方法名称,可取GET、PUT、POST、DELETE、HEAD。serverTimeout是服务提供者推荐的调用超时时间(不考虑跨机房调用延时),单位是毫秒。
服务注册请求头:
Content-Type: application/json; charset=utf-8
register Time:${utc秒数}
registerToken:${token}
registerTime头是注册时的utc秒数。
registerToken用于身份验证,HMAC-SHA1加密,base64(HMAC-SHA1(http body+ registerTime)),密钥为应用注册时分配的appSecret。
服务注册response
注册成功返回200 status code,body为{"result":"success","gwToken":"xxxxxxxx"}
gwToken用于api服务网关调用服务提供者时的身份认证,服务提供者保存该token。
注册失败返回400 status code, body为{"result":"failed","errormsg":"xxxxxxxx"}
4.服务心跳
服务提供者需要提供一个http url,服务网关会周期性访问该url来检测服务提供者的存活和健康状况。如果连续三次都调用超时或失败则将该服务提供者设置为offline。在offline状态,连续两次调用成功,则切换为online状态。
5.服务消费者的服务调用
服务消费者向api网关发起http请求,调用的url为http://apigw.xxx.com/gwapi/${服务提供的url},例如
http://apigw.xxx.com/gwapi/users/2356。api网关收到请求后进行认证鉴权等处理,再由异步httpclient路由转发到服务提供者,httpclient收到服务提供者的响应后,由异步servlet将响应转发到服务消费者。
调用http头
服务消费者在调用服务时,需要如下http头:
invokeId:每请求调用id,通常是uuid生成,在同一应用实例中唯一。
consumerAppId:服务消费者的appId
resourceName:资源名称,主要是为方便进行消息路由。用请求url和http method(GET/POST/PUT/DELETE)也可进行路由。
accessToken用于服务消费者的身份认证。
accessToken的获取
accessToken的有效期为3小时(可配置),其获取流程如下:
服务网关的对服务请求的路由转发
收到服务消费者的服务请求后,服务网关结合服务的健康状况采用round-robin的策略来转发请求到后端的服务节点。
以一个例子为例来描述服务网关的路由转发。
假设有个rest资源服务名称为user.account,其所在endpoint为[”http://23.34.5.6:8080?urlPrefixPattern=/api”,” http://23.34.5.7:8080?urlPrefixPattern=/api”],该资源有个url:/users/{userId},采用GET方法来调用,功能是获取用户账号信息。
服务消费者应用id为store,它调用该功能的http请求如下:
GET /gwapi/users/2356 HTTP/1.1
Host:apigw.xxx.com
Connection: keep-alive
invokeId:1acd-3acb-bca2-ffcc
consumerAppId:store
resourceName: user.account
accessToken: 4fcb-89d3-cbde-aef7
api服务网关收到该请求后,会对该请求进行认证鉴权,通过后对该调用进行路由,假设路由选取的endpoint为http://23.34.5.6:8080?urlPrefixPattern=/api,则调用后端服务时的url为http://23.34.5.6:8080/api/users/2356.
服务网关调用该服务的http如下:
GET /api/users/2356 HTTP/1.1
Host:23.34.5.6:8080
Connection: keep-alive
invokeId: 1acd-3acb-bca2-ffcc
consumerAppId: store
resourceName: user.account
gwToken: 85a7-99df-bc11-653d
转发请求时去掉了accessToken头,增加了gwToken头,gwToken是服务注册时由服务网关生成的,前面对此有说明。服务提供者在注册时,要保存服务网关返回的gwToken,以便用于验证服务网关转发的请求。
api网关处理请求失败时的响应
当拦截器验证失败时,网关不会将请求转发到后端的服务提供者,而是直接返回响应。
请求不合法时的响应:400 Bad Request。请求中没有规定的http头(invokeId、consumerAppId、resourceName、gwToken)。
认证鉴权失败时的响应:返回http status code 为401 Unauthorized。具体的原因是consumerAppId未注册、accessToken不存在或失效或非法、resourceName非法、服务操作未授权。
流控未通过时的响应:返回http status code 为503 Service Unavailable(flow control)。
路由失败时返回的响应:返回http status code 为503 Service Unavailable(gw route)。具体原因是没有找到可用的endpoint(例如后端服务全部down)。
请求超时时的响应:504 Gateway Timeout(gw)
6.领域模型
7.失败重试
这里的失败重试是指服务提供者返回http 5xx、或服务提供者处理超时、服务提供者返回io exception异常时的重试。当重试时,网关会重新转发。是否重试可以在控制台中对服务授权时,可以设置对urlOperation是否重试,当进行重试转发时,会增加一个http头retryTimes,其值为重试次数。
8.日志采集处理
服务网关部署在多个机房中,日志采集使用flume,在每个机房中都部署有flume。服务网关(GW)使用log4j flume appender将日志发送到本地flume,最后汇聚到杭州机房中的flume。
9.系统部署
为了保证高可用和负责均衡,网关控制台和api服务网关均为多机部署,前面是负载均衡器LVS+keepalived。
10.可选方案
上面的方案是中心化的http服务治理方案,http服务调用要经过api服务网关转发,另一种是去中心化的方法(先前文章中有介绍),服务消费者直接调用服务提供者,前者对目前的代码改动较少,后者改动较多,但性能和可靠性更高。
服务消费者在调用服务之前,要通过服务发现找到可调用服务的endpoint,并到服务中心进行服务授权,获得服务调用token,在调用请求头中带上该token,服务提供者收到请求后,对该token进行认证鉴权。
相关推荐
项目学习分享。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。... 【技术】 Java、Python、Node.js...
介质波长、回损、圆极化天线、多径、史密斯圆图、波束宽度、远场、相位中心、超材料
【标题】"DJI_Onboard_API_STM32" 是一个专为STM32微控制器设计的DJI无人机开发套件,它允许开发者...通过以上知识点,开发者可以利用"DJI_Onboard_API_STM32"创建定制化的无人机解决方案,实现各种创新的应用场景。
【DJI大疆多旋翼动力系统E600用户手册】主要涵盖了E600动力系统的使用、安全注意事项、部件清单、安装方法以及产品规格等关键知识点。 1. **安全注意事项**: - 高速旋转的螺旋桨可能造成人身伤害和财产损失,因此...
【精品文章】 配合严管,DJI大疆更新我国大陆机场区域禁飞区策略.docx
首先,“DJI大疆2019年8月雷达算法工程师笔试题B卷”这一标题说明这是一次面向特定职位(雷达算法工程师)的招聘考试。大疆(DJI)是一家专门从事民用级无人机和航拍技术的制造商,因此笔试内容会涵盖相关专业知识。...
"大疆无人机说明书_Mavic_2_Pro_Zoom_User_...10. 售后保修信息:用户可以通过大疆创新官方网站了解售后保修信息,获取售后服务支持。 本文档提供了详细的产品信息和使用指南,为用户提供了全面的飞行器使用体验。
大疆创新科技有限公司(DJI)推出的Onboard API是一套强大的无人机控制接口,它允许开发者通过编程直接与无人机的飞控系统进行交互,实现高级飞行控制、任务规划以及传感器数据的获取。STM32作为一款广泛应用的微...
SDK(Software Development Kit),即软件开发工具包,用来开发适用于某个产品(比如 DJI Phantom 4)或某个平台(比如 Windows)的软件,通常由产品或平台的厂商提供给开发者使用。
"大疆无人机说明书_Mavic_Pro_用户手册_V2.0" 本篇文章将对大疆无人机Mavic Pro的用户手册进行概括性介绍,涵盖了产品概述、功能亮点、飞行器部件名称、遥控器部件名称、飞行器概述、飞行模式、飞行器状态指示灯、...
大疆无人机说明书_DJI_Mini_2_Two_Way_Charging_Hub_User_Guide 大疆无人机说明书_DJI_Mini_2_Two_Way_Charging_Hub_User_Guide是一份关于大疆无人机的详细使用指南,旨在帮助用户了解和正确使用大疆Mini 2 Two-Way...
在本项目中,开发者利用了大疆(DJI)提供的软件开发工具包(SDK)来构建了一个定制化的飞行控制系统。这个系统旨在为无人机提供更加灵活和个性化的操作体验,允许用户根据具体需求调整飞行参数和功能。以下是关于这...
大疆无人机FPV系列用户手册 本文档提供了大疆无人机FPV系列用户手册,涵盖了FPV飞行器、飞行...大疆提供了FPV系统下载中心,用户可以下载DJI Fly App、DJI Assistant 2 (DJI FPV series) 调参软件和其他相关资源。
"大疆无人机说明书_DJI_Air_2S_User_Manual_v1.0_cnIV_(已解锁)" 本文档是大疆无人机的用户手册,旨在帮助用户正确使用 DJI Air 2S 无人机产品。手册中提供了详细的使用指导、飞行器和遥控器的组件名称、智能飞行...
大疆 Mobile SDK 是专为具备iOS或Android平台开发经验的开发者设计的,旨在帮助他们利用DJI技术构建创新的行业应用。通过使用这个SDK,开发者能够实现对大疆无人机的精细控制,创建各种定制化的飞行任务和相机功能。...
大疆智图
"DJI"是大疆创新的缩写,一家全球知名的无人机制造商,提供了一系列无人机产品和服务,包括硬件、软件和飞行控制系统。 "大疆"是中国无人机制造公司的中文名,它的产品广泛应用于航拍、农业、搜救等领域。 **压缩...
《大疆MG-1S Advanced关怀计划服务条款》是大疆创新科技有限公司为用户提供的一项针对其MG-1S Advanced农业植保机的增值服务。这项关怀计划旨在为用户在使用过程中提供更全面的保障和安心的飞行体验。由众安在线财产...
4. 免责声明:大疆创新(DJI)对于直接或间接使用本产品而造成的损坏、伤害以及任何法律责任不予负责。本文档及本产品所有相关的文档最终解释权归大疆创新(DJI)所有。 5. 产品信息:大疆创新(DJI)保留对本产品...