昨天朋友发来一个消息,问我express源码中的一个问题,我去看了一番源码以后,发现自己并不是很懂,只能看懂一些字面意思...

不过在聊天过程中,了解到他们公司在用express做api网关,什么是api网关呢?

我将以express-gateway为例,学习get started教程,对api网关进行探索。
安装
①npm i -g express-gateway
②创建一个express网关:eg gateway create
③根据提示选择server模板
④运行express网关:npm start
5分钟入门教程
目标:
1.选择一个微服务并且作为一个api暴露出去
2.定义一个api的消费者
3.使用key认证保证api的安全性
1.选择一个微服务并且作为一个api暴露出去
①直接访问微服务
curl http://httpbin.org/ip
{
"origin": "73.92.47.31" # this will be your own IP address
}
②指定微服务

在express gateway的一个默认的管道中,服务将被分配到一个端口。一个管道指的是一个策略集合。Express Gateway有一个代理策略。在默认的管道中,会使用这个代理策略,网关现在挡在了https://httpbin.org/ip服务前面,并且并且路由其它请求到网关的端口。
在config/gateway.config.yml这个文件中,可以找到一个serviceEndpoints选项,这里定义了httpbin这个服务。
serviceEndpoints:
httpbin:
url: 'https://httpbin.org'
在默认管道的proxy选项的action中,可以找到serviceEndpoint: httpbin
③以api的方式公开微服务

通过Express Gateway,我们将暴露httpbin 服务到api端口。当通过api端口公开api后,外部可以访问到api。
在config/gateway.config.yml这个文件中,可以找到apiEndpoints选项,这里定义了api。
apiEndpoints:
api:
host: 'localhost'
paths: '/ip'

现在我们有一个公共api浮出水面了,我们应该确保自己可以穿过express网关获取到service的权限。
2.定义一个api网关的消费者
管理我们api的人,在这里我们称之为“Consumer”。

eg users create
3.使用key认证方式确保安全
①现在api暴露了出去,而且也获得了访问权限。我们现在将为其加上key安全认证。
在config/gateway.config.yml这个文件中,可以找到pipelines选项,这里定义了key-auth。
pipelines:
- name: getting-started
apiEndpoints:
- api
policies:
- key-auth:
- proxy:
- action:
serviceEndpoint: httpbin
changeOrigin: true
②为Consumer Bob分配key。
eg credentials create -c bob -t key-auth -q

③Bob没有加key直接访问。
curl http://localhost:8080/ip
//Unauthorized

④Bob加了key进行访问。
$ curl -H "Authorization: apiKey 0Er0Ldv5EHSUE364Dj9Gv:2Yzq1Pngs1JYaB2my9Ge4u" http://localhost:8080/ip
{
"origin": "73.92.47.31"
}

That's it!
期待和大家交流,共同进步,欢迎大家加入我创建的与前端开发密切相关的技术讨论小组:
- SegmentFault技术圈:ES新规范语法糖
- SegmentFault专栏:趁你还年轻,做个优秀的前端工程师
- 知乎专栏:趁你还年轻,做个优秀的前端工程师
- Github博客: 趁你还年轻233的个人博客
- 前端开发交流群:660634678
努力成为优秀前端工程师!
网友评论