Zookeeper

本文将介绍API网关集成Zookeeper访问微服务后端的原理,以及如何创建、发布并调用服务发现类型的API。

1. 概述

本文依次介绍如下步骤:

  • 原理说明

  • 创建VPC融合专享实例(仅VPC融合实例支持Zookeeper)

  • 部署Zookeeper服务并注册微服务应用

  • 创建分组

  • 创建后端服务

  • 创建API

  • 创建应用并授予API的调用权限

  • 调试API

2. 原理说明

Zookeeper 采用了类似文件系统的树形结构来存储数据,树中的各个节点都有一个唯一的访问路径,如“/provider/service”。服务的提供者可将微服务应用的实例信息注册到Zookeeper的服务节点上,API网关可以监听这些节点,并从中解析服务的IP地址和端口,然后根据负载均衡策略,将客户端的请求分发到后端的多个微服务实例中。

image

  1. 服务的提供者将微服务实例注册到Zookeeper的服务节点;

  2. API网关根据节点的访问路径,监听该节点及其子节点,并解析节点中存储的微服务实例信息,包括服务的IP地址和端口号Port。为了减少通信消耗,IP和Port会缓存在网关本地;

  3. 客户端的请求到达API网关后,网关首先从缓存中获取一个可用的微服务实例地址,然后向指定的微服务Server发送HTTP请求并获取后端响应,最后将响应结果返回给客户端;

  4. 如果微服务应用的信息发生变动,例如某个服务实例下线或者增加了新的服务实例,那么Zookeeper会将更新后的实例信息推送给网关,网关则会根据接收到的服务信息实时更新缓存,以确保网关侧和Zookeeper侧的服务信息保持相同;

  5. 客户端再次请求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。

  1. 登录API网关控制台。

  2. 在左侧导航栏选择API管理-分组管理,单击界面右上角的创建分组按钮,在弹窗页面填写分组信息,实例选择步骤3中创建的VPC融合实例,分组名称和BasePath可自定义。

说明

分组创建完成后,在分组管理中单击分组名称即可进入分组详情页,在详情页可以绑定域名、修改基本信息、切换实例类型等操作。

API分组会自动创建公网二级域名,此二级域名仅供调试使用,如果直接访问此域名,每天有1000次的限制(海外Region及中国香港限制100次/天),因此建议在使用时为分组绑定独立域名,文档参考使用自定义域名调用API

6. 创建后端服务

服务发现类型的API仅支持通过已有的后端服务进行创建,因此需要先创建后端服务,然后创建API。

  1. 登录API网关控制台。

  2. 在左侧导航栏选择API管理-后端服务。在界面的右上角单击创建后端服务,在弹窗页面填写后端服务名称,后端类型选择服务发现。创建完成后,可以在后端服务列表中找到刚刚创建的后端服务,单击服务名称即可进入后端服务详情界面。

本例中,我们选择“线上”环境,只有在环境上创建了后端服务,创建的API才可以发布到相应的环境。在界面的右侧单击创建,进入后端服务配置界面,

需要在后端服务配置界面填写Zookeeper服务和微服务应用的相关信息,包括:

  • ConnectString:Zookeeper服务的内网地址,必填参数,可参考步骤3填写Zookeeper的实际部署地址。

  • 命名空间:微服务信息所在节点的父节点名,必填参数。

  • 服务名:微服务应用的名称,必填参数。

说明

命名空间和服务名共同构成了服务节点的访问路径,例如节点的路径为“/provider/service”,那么命名空间和服务名可分别设置为“provider”和“service”,服务的提供者可将微服务实例的信息注册到访问路径为"/provider/service"的节点以及该节点的子节点上。

7. 创建API

在API网关控制台左侧导航栏选择API管理- API列表,在界面的右上角单击创建API

  1. API基本信息

本环节介绍如何配置API的基本信息,包括API分组、API名称、安全认证方式、API类型和描述等。API分组选择刚刚创建的分组,安全认证选择阿里云APP,AppCode认证选择APPcode(header&Query),API名称和描述信息可以自行设置。

说明

安全认证方式可根据实际需求配置,如果不需要API网关做安全校验,可以选择无认证。

  1. 定义API请求

本环节是定义client端(如浏览器、手机APP或其他的业务系统)如何请求API,需要确定的内容包括请求类型、协议、请求Path、HTTP Method、入参请求模式、和入参定义,可以根据实际情况设置客户端请求的Path和Method等信息。

  1. 定义API后端服务

本环节是定义API网关收到client端的请求后,进行何种参数映射、处理,以及连接哪个后端地址。本例中的后端配置选择使用已有的后端服务,后端服务类型选择服务发现,后端服务选择之前创建的后端服务,后端请求的Path、Method以及超时时间可以自行设置。

  1. 定义返回结果

本环节用于API帮助文档的自助生成,帮助API使用者更好理解。可以设置返回结果示例和失败返回结果示例。本例中不涉及到这部分,因此可以单击保存按钮。

  1. 发布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调试失败。