本文将介绍API网关集成Zookeeper访问微服务后端的原理,以及如何创建、发布并调用服务发现类型的API。
1. 概述
本文依次介绍如下步骤:
原理说明
创建VPC融合专享实例(仅VPC融合实例支持Zookeeper)
部署Zookeeper服务并注册微服务应用
创建分组
创建后端服务
创建API
创建应用并授予API的调用权限
调试API
2. 原理说明
Zookeeper 采用了类似文件系统的树形结构来存储数据,树中的各个节点都有一个唯一的访问路径,如“/provider/service”。服务的提供者可将微服务应用的实例信息注册到Zookeeper的服务节点上,API网关可以监听这些节点,并从中解析服务的IP地址和端口,然后根据负载均衡策略,将客户端的请求分发到后端的多个微服务实例中。
服务的提供者将微服务实例注册到Zookeeper的服务节点;
API网关根据节点的访问路径,监听该节点及其子节点,并解析节点中存储的微服务实例信息,包括服务的IP地址和端口号Port。为了减少通信消耗,IP和Port会缓存在网关本地;
客户端的请求到达API网关后,网关首先从缓存中获取一个可用的微服务实例地址,然后向指定的微服务Server发送HTTP请求并获取后端响应,最后将响应结果返回给客户端;
如果微服务应用的信息发生变动,例如某个服务实例下线或者增加了新的服务实例,那么Zookeeper会将更新后的实例信息推送给网关,网关则会根据接收到的服务信息实时更新缓存,以确保网关侧和Zookeeper侧的服务信息保持相同;
客户端再次请求API网关,网关会根据最新的微服务地址信息进行请求的路由和转发。
API网关与Zookeeper、与微服务实例之间的交互仅支持内网通信,因此在创建API时,Zookeeper的服务地址需配置为内网地址,否则网关将返回Zookeeper地址无效的异常信息。同样的,注册在Zookeeper上的微服务应用的后端地址也必须为内网地址。在调用API时,若网关从Zookeeper获取到的微服务后端地址为公网地址,那么本次请求将无法处理成功,此时网关会返回错误码I504IA
,若网关未能从Zookeeper获取到任何微服务后端地址,则返回错误码I504BA
。
3. 创建VPC融合专享实例
由于API网关与Zookeeper、与注册在Zookeeper上的微服务应用之间仅支持内网通信,而传统的专享实例又无法实现自定义内网通信,因此我们提供了一种新型的VPC融合专享实例,以支持API网关通过内网打通用户的VPC,融合实例的创建过程可参考VPC融合专享实例。
4. 部署Zookeeper服务并注册微服务应用
4.1 部署Zookeeper服务
Zookeeper服务需部署在步骤3中选择的【VPC-可用区-交换机】下,可以选择原生的Zookeeper服务,将其部署在所选交换机下的ECS中,这样Zookeeper服务的访问地址便可设置为"ECS的内网IP:Zookeeper服务的Port"。创建ECS时,网络类型选择专有网络,VPC和交换机需和步骤3中的配置保持相同。
原生Zookeeper的创建过程可参考部署Zookeeper,ECS的创建过程可参考创建ECS。
也可以使用阿里云的微服务引擎(MSE)来创建Zookeeper服务,创建Zookeeper时,网络类型选择专有网络,VPC和交换机需和步骤3中的配置保持相同。创建完成后,可在MSE的实例列表页查看Zookeeper的访问地址。
使用MSE创建Zookeeper的过程可参考创建ZooKeeper引擎。
4.2 注册微服务应用
微服务应用也需部署在步骤3中选择的【VPC-可用区-交换机】下,这样才能确保微服务能够成功注册到Zookeeper并能够被API网关成功访问。可以选择将微服务应用部署在ECS中,该ECS需创建在步骤3中指定的交换机下。
注册到Zookeeper的服务信息需满足如下格式:
{
"address":"localhost",
"enabled":true,
"id":"cb1467f745c64d9f8cbfa5c2bd217cb8",
"name":"provider",
"payload":{
},
"port":8080,
"registrationTimeUTC":1699525871398,
"serviceType":"DYNAMIC",
"sslPort":443,
"uriSpec":{
"parts":[
{
"value":"scheme",
"variable":true
},
{
"value":"://",
"variable":false
},
{
"value":"address",
"variable":true
},
{
"value":":",
"variable":false
},
{
"value":"port",
"variable":true
}
]
}
}
存储在Zookeeper服务节点上的数据结构可参考开源项目Apache Curator提供的org.apache.curator.x.discovery.ServiceInstance
类,其中uriSpec
不能为空,推荐将其配置为“{scheme}://{address}:{port}”,若需使用HTTPS协议,请配置sslPort
属性。
若数据格式不规范,那么网关可能无法解析出微服务实例的后端地址。注册到Zookeeper上的微服务应用必须支持HTTP调用。
5. 创建分组
API分组是API的管理单元,因此需要先创建API分组,然后在分组下创建API。
登录API网关控制台。
在左侧导航栏选择API管理-分组管理,单击界面右上角的创建分组按钮,在弹窗页面填写分组信息,实例选择步骤3中创建的VPC融合实例,分组名称和BasePath可自定义。
分组创建完成后,在分组管理中单击分组名称即可进入分组详情页,在详情页可以绑定域名、修改基本信息、切换实例类型等操作。
API分组会自动创建公网二级域名,此二级域名仅供调试使用,如果直接访问此域名,每天有1000次的限制(海外Region及中国香港限制100次/天),因此建议在使用时为分组绑定独立域名,文档参考使用自定义域名调用API。
6. 创建后端服务
服务发现类型的API仅支持通过已有的后端服务进行创建,因此需要先创建后端服务,然后创建API。
登录API网关控制台。
在左侧导航栏选择API管理-后端服务。在界面的右上角单击创建后端服务,在弹窗页面填写后端服务名称,后端类型选择服务发现。创建完成后,可以在后端服务列表中找到刚刚创建的后端服务,单击服务名称即可进入后端服务详情界面。
本例中,我们选择“线上”环境,只有在环境上创建了后端服务,创建的API才可以发布到相应的环境。在界面的右侧单击创建,进入后端服务配置界面,
需要在后端服务配置界面填写Zookeeper服务和微服务应用的相关信息,包括:
ConnectString:Zookeeper服务的内网地址,必填参数,可参考步骤3填写Zookeeper的实际部署地址。
命名空间:微服务信息所在节点的父节点名,必填参数。
服务名:微服务应用的名称,必填参数。
命名空间和服务名共同构成了服务节点的访问路径,例如节点的路径为“/provider/service”,那么命名空间和服务名可分别设置为“provider”和“service”,服务的提供者可将微服务实例的信息注册到访问路径为"/provider/service"的节点以及该节点的子节点上。
7. 创建API
在API网关控制台左侧导航栏选择API管理- API列表,在界面的右上角单击创建API。
API基本信息
本环节介绍如何配置API的基本信息,包括API分组、API名称、安全认证方式、API类型和描述等。API分组选择刚刚创建的分组,安全认证选择阿里云APP,AppCode认证选择APPcode(header&Query),API名称和描述信息可以自行设置。
安全认证方式可根据实际需求配置,如果不需要API网关做安全校验,可以选择无认证。
定义API请求
本环节是定义client端(如浏览器、手机APP或其他的业务系统)如何请求API,需要确定的内容包括请求类型、协议、请求Path、HTTP Method、入参请求模式、和入参定义,可以根据实际情况设置客户端请求的Path和Method等信息。
定义API后端服务
本环节是定义API网关收到client端的请求后,进行何种参数映射、处理,以及连接哪个后端地址。本例中的后端配置选择使用已有的后端服务,后端服务类型选择服务发现,后端服务选择之前创建的后端服务,后端请求的Path、Method以及超时时间可以自行设置。
定义返回结果
本环节用于API帮助文档的自助生成,帮助API使用者更好理解。可以设置返回结果示例和失败返回结果示例。本例中不涉及到这部分,因此可以单击保存按钮。
发布API
在上一环节保存成功后,需要发布API。对API进行过任何的配置,都需要发布到对应的环境中才能够生效。本例中在创建后端服务的时候,只在线上环境进行了后端服务配置,因此这里只可以发布到线上环境,如果需要发布到其他环境,需要在刚创建的后端服务的其他环境配置后端服务定义。单击发布,按照控制台页面的提示,把此API发布到“线上“环境。
8. 创建应用并授予API的调用权限
应用(APP)是调用API服务时的身份,在本例创建API的时候,认证方式选择的是“阿里云APP认证“,因此在API发布后,还需要创建APP,并将APP和API的对应关系建立好,才能够正常访问。具体操作步骤可参考授权管理。
9. 调试API
API网关提供了在线调试的功能,因此一般建议在API网关上完成API配置之后,先通过此功能确认API是否配置成功,然后再通过client端进行调用。
在API列表页,单击前面步骤中新增的API,进入详情页,单击调试API。如果定义了API的入参,在调试API页面中也可以输出不同的参数查看API的执行情况。
在调试API中,注意认证方式选择已经授权的APP,并且Stage选择此APP授权好的环境,如果选择错误的Stage,可能会造成API调试失败。