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"]