导语
腾讯云微服务平台(Tencent Service Framework,TSF)是一个围绕着应用和微服务的 PaaS 平台,提供了应用全生命周期管理、数据化运营、立体化监控和服务治理等功能。其中,API 对外管理是微服务管理中非常重要的一环,涉及多种应用场景。本次实践主要用来验证如何通过 TSF 微服务网关实现对微服务中 API 进行访问、限流、鉴权、重定向等对外管理的控制。
作者简介
王维
多年开发架构经验,熟悉电商、支付业务。熟悉微服务架构的开发与落地。目前主要聚焦于微服务、消息队列及周边中间件。
一、背景概述
在腾讯云微服务平台 TSF 中部署好微服务之后,最终需要提供给消费者进行请求调用。虽然可以将众多微服务直接提供给消费者调用,但是会带来诸多不便与风险。比如:
1. 访问域名、IP、端口众多,导致消费者进行众多配置,容易产生配置错误的情况;
2.无法统一进行限流、鉴权,导致集中治理能力的缺失;
3. 直接将真实的API完整路径对外暴露,增加风险。
腾讯云 TSF 提供了微服务网关能力来解决上述问题。微服务网关封装了限流、密钥对鉴权、第三方鉴权、设置访问标签等功能,方便用户在界面上管理微服务 API,并做好API的对外管理。
二、环境准备
本次实践采用虚拟机部署模式。
本次实践采用 postman 工具配合验证。
本次实践需要准备以下应用:
1. consumer-demo:服务消费者,普通应用。
2. provider-demo:服务提供者,普通应用。
3. gateway:微服务网关,微服务网关应用。
其中 provider-demo 需要部署两个版本,以便验证通过 Tag 进行路由的功能。示例源码可通过官方 demo 获取,github地址如下:
/tencentyun/tsf-simple-demo
(一)新建应用
1.单击【应用中心】下【应用管理】>【新建应用】按钮。填写应用信息,点击【提交】按钮。
2.分别新建两个普通应用consumer-demo、provider-demo。一个微服务网关应用gateway。
3.在应用详情页,【程序包管理】页签,点击【上传程序包】按钮进行程序包上传。
4.选择程序包,填写程序包版本,点击【提交】按钮进行上传。
(二)新建集群
1.新建虚拟机集群
单击【资源中心】下【集群】>【新建集群】按钮。创建一个虚拟机集群。
2.导入云服务器
进入上一步骤中创建的集群的详情页,点击【导入云主机】按钮,选择对应的云主机进行导入。
(三)新建部署组
单击【资源中心】下【部署组】>【新建部署组】按钮,填写部署组信息并单击【保存&下一步】创建部署组。
(四)部署应用
1.选择部署组列表中对应条目中【部署应用】按钮,部署应用。
2.选择对应版本应用程序包,点击【完成】按钮进行部署。
3.部署成功后,在【应用中心】->【服务治理】页面,可以展示出服务实例信息。
4.点击具体的微服务链接进入【接口列表】页签,可以看到对应的API列表。
三、统一对外暴露API
(一)应用场景
为后端众多微服务API对外提供统一的访问入口(访问域名、IP、端口),对外屏蔽具体微服务的IP及端口等信息。方便消费者进行服务调用配置。
(二)操作步骤
1.新建分组
单击【组件中心】>【微服务网关】>【分组管理】。在分组管理页,单击【新建分组】,并填写分组信息。
新建 group-consumer、group-provider两个分组,分别用于托管consumer-demo和provider-demo 服务中的API。分组列表如下:
2.导入API
分别在group-consumer、group-provider两个分组的【API 列表】中,单击【导入 API】,选择对外暴露的微服务下的 API,完成后单击【确认】按钮进行提交。
导入成功后,API列表显示如下。
3.访问API
分组下某个微服务 API 的访问路径为:网关的域名或网关的 IP+port/分组 context/微服务 API 所在的微服务命名空间名称/微服务名称/API 路径。
举例:当分组 context 为 csr,所在命名空间为 cluster-vm-test_default,微服务名称为 consumer-demo,API 路径为/echo/{test}时,则访问路径为域名/csr/cluster-vm-test_default/consumer-demo/echo/{test}。
单击 API 路径后面的复制按钮,会自动复制从 context 以后的路径。粘贴后的内容为/csr/cluster-vm-test_default/consumer-demo/echo-feign/{str}。
使用postman工具,通过网关对consumer-demo服务进行访问。访问路径如下:
http://{ip}:{port}/csr/cluster-vm-test_default/consumer-demo/echo-feign/1256
访问效果如下:
经过上述操作,可以实现API的统一对外暴露。
四、网关限流
(一)应用场景
在需要对外部请求进行请求流量限制的时候,可以通过网关中特定的API进行限流设置,达到限制流量,保护服务的效果。
(二)操作步骤
1.设置限流规则
针对分组 group-consumer 中API 进行限流,例如:QPS设置为1。
API:/csr/cluster-vm-test_default/consumer-demo/echo-feign/{str}
设置成功后,API列表中对应API限流规则显示如下:
2.发起调用
访问路径如下:
http://{ip}:{port}/csr/cluster-vm-test_default/consumer-demo/echo-feign/1256
在postman 中连续快速发起请求,查看效果。可以观察到,产生“429 Too Many Requests”错误,证明限流设置已经生效。
限流错误信息详情如下:
经过上述操作,即可以验证网关限流的作用。
五、网关鉴权
(一)应用场景
微服务网关有可能直接对外暴露给服务消费者,此时访问安全就显得尤为重要。可以通过在微服务网关启动密钥鉴权,来进行访问鉴权的控制。
(二)操作步骤
1.配置密钥对鉴权
在【分组管理】页面,选择某一网关分组(如:group-consumer),进入分组详情页面,在【基本信息】部分,点击【编辑】按钮,对分组进行编辑,对【鉴权类型】项选择【密钥鉴权】,开启密钥鉴权。
在分组详情页面【密钥管理】部分,点击【新建密钥】,输入【密钥名】并点击【提交】按钮,进行密钥的创建。
密钥创建成功后,显示在分组详情页面【密钥管理】部分列表中。
2.不带密钥签名访问
在header中不添加密钥签名信息的情况下,在postman中发起请求,请求失败。
访问路径如下:
http://{ip}:{port}/csr/cluster-vm-test_default/consumer-demo/echo-feign/1256
3.使用密钥签名并发起请求
在代码中生成密钥签名
在请求header中添加对应的密钥签名相关信息,然后发起请求,则可以正常请求。访问路径如下:
http://{ip}:{port}/csr/cluster-vm-test_default/consumer-demo/echo-feign/1256
经过上述操作,即可以验证网关鉴权已经生效。
六、网关Tag插件
(一)应用场景
标签是 TSF 中传递客户业务参数的形式,用户可以通过标签来实现灵活的基于业务参数的服务治理能力并依据标签过滤调用链。典型的标签的使用场景是:通过业务参数实现针对参数值的特殊路由、限流等。
通过微服务网关 Tag 插件将外部请求的请求参数转化为标签,就是其中一种标签配置方式。
(二)操作步骤
1.新建Tag插件
单击【组件中心】下的【微服务网关】>【插件管理】。单击【新建插件】,选择Tag插件类型,并填写插件信息。单击【完成】按钮提交。
2.绑定对象
单击【组件中心】下的【微服务网关】>【插件管理】。点击对应插件条目上的【绑定对象】按钮。
选择要绑定到插件上的网关分组或者API,并单击【提交】按钮,完成插件绑定。
3.配置路由规则
在【应用中心】>【服务治理】页面,点击【provider-demo】服务链接,进入【服务路由】页签,配置路由规则。根据自定义标签 version 进行路由配置,自定义标签version 等于 v1时路由到版本v1;自定标签version等于v2时路由到版本v2。
4.发起请求
在请求header中添加 version 参数。当 version = v1 时,请求被路由到 provider-demo 服务v1版本。访问路径如下:
http://{ip}:{port}/csr/cluster-vm-test_default/consumer-demo/echo-feign/1256
当 version = v2 时,请求被路由到 provider-demo 服务v2版本。
调用链
tag参数
经过上述操作,即可以验证网关Tag插件的作用。
注意:通过Tag插件进行标签转化时,无需在代码中添加putTag的逻辑。此时可以通过在url参数中添加tagName和tagValue参数进行访问,可以发现请求是轮询的分配给v1和v2版本。
七、网关Jwt插件
(一)应用场景
微服务网关有可能直接对外暴露给服务消费者,此时访问安全就显得尤为重要。
除了通过在微服务网关启动密钥鉴权,来进行访问鉴权的控制外。还可以通过 Jwt 插件的方式进行鉴权。
(二)操作步骤
1.新建 Jwt 插件
单击【组件中心】下的【微服务网关】>【插件管理】。单击【新建插件】,选择 Jwt 插件类型,并填写插件信息。单击【完成】按钮提交。
查看插件
2.绑定对象
单击【组件中心】下的【微服务网关】>【插件管理】。点击对应插件条目上的【绑定对象】按钮。
3.验证
不加参数直接发起请求进行验证,请求失败。
生成token
添加token参数和kid参数进行验证,请求成功。
token过期验证,超过token生命周期之后(如:10分钟),同样的token已经失效,无法进行正常请求。
经过上述操作,即可以验证网关Jwt插件的作用。
八、网关OAuth插件
(一)应用场景
微服务网关 OAuth 插件提供了简单的第三方鉴权的能力。外部请求到达网关,网关向第三方服务器发送请求对参数进行校验。
(二)操作步骤
1.自定义鉴权服务
编写自定义鉴权服务,并发布。确保在TSF中可以访问到该鉴权服务对应的鉴权接口。
接口地址:http://{ip}:{port}/auth?userName=hello
接口代码:
2.新建OAuth插件
单击【组件中心】下的【微服务网关】>【插件管理】。单击【新建插件】,选择OAuth插件类型,并填写插件信息。单击【完成】按钮提交。
查看插件
3.绑定对象
4.验证
使用错误的参数(userName = 123)进行请求验证,返回失败。
使用正确的参数(userName = hello)进行请求验证,返回成功。
经过上述操作,即可以验证网关OAuth插件的作用。
九、请求重定向
(一)应用场景
为了不将内部接口信息过分暴露或为了保证上下游系统接口的一致性,通常可以将微服务对外暴露的接口配置新的重定向路径,从而隐藏真实的路径。
(二)操作步骤
单个API
可以通过重定向配置为某一个 API 配置路径别名。
1.新建API
在consumer-demo 服务中新增一个API。新建ConfigController,并添加 config 方法如下:
2.将 consumer-demo 发布到TSF
3.配置重定向
单击组件中心下的【微服务网关】>【重定向配置】。单击【新建重定向配置】,并填写重定向信息。单击【确定】按钮提交。
创建成功后,在重定向配置列表页面展示如下:
4.发起请求
重定向配置成功后,按重定向路径发起请求。
重定向访问路径:
http://{ip}:{port}/config
原访问路径:
http://{ip}:{port}/csr/cluster-vm-test_default/consumer-demo/config
因为重定向规则中配置了禁止访问原路径,所以访问原路径时拒绝访问。
如果将配置改为【允许访问原路径】,则可以正常访问。
对原路径重新发起请求,可以正常访问。
通配API
当前 TSF 微服务网关提供的默认对外访问路径为`域名/分组名/命名空间/微服务名称/API路径`,可以通过通配符来设置重定向规则支持将较长的路径映射为短路径。
1.配置重定向
请求路径填写为:/provider/(.*)
原路径填写为:/pro/www-cluster-vm_default/provider-demo/echo/$1
此时,通过网关直接请求 /provider/(.*)`等请求会直接被转发到 /pro/www-cluster-vm_default/provider-demo/echo
2.发起请求
重定向配置成功后,按重定向路径发起请求。
重定向访问路径:
http://{ip}:{port}/provider/123
对原路径重新发起请求,可以发现和重定向路径请求的返回结果一模一样。
原访问路径:
http://{ip}:{port}/pro/www-cluster-vm_default/provider-demo/echo/123
经过上述操作,即可以验证网关重定向已经生效可以正常使用。
总结
综上所述,腾讯云微服务平台 TSF ,提供了丰富的微服务治理能力。同时,我们可以通过 TSF 微服务网关,进行 API 的统一管理,包括:对外暴露、限流、鉴权、路由等。从而规避开篇所说的 API 管理面临的诸多问题,使得 API 的对外管理更加安全、便捷、优雅。
END