API网关能够集成Nacos实现服务发现的功能,从而与微服务架构深入融合,降低系统的耦合度并提高程序的可管理性。网关可作为微服务系统的请求入口,负责所有客户端的接入、请求的路由和转发、以及保证微服务应用的安全和稳定。本文主要介绍API网关集成Nacos访问微服务后端的原理,以及介绍如何创建、发布并调用服务发现类型的API。
1. 概述
本文依次介绍如下步骤:
原理说明
创建VPC融合专享实例
部署Nacos服务并注册微服务应用
创建分组
创建后端服务
创建API
创建应用并授予API的调用权限
调试API
2. 原理说明
Nacos作为服务的注册中心,可以接收微服务实例的注册请求,并将实例信息保存在注册表中。API网关集成Nacos主要应用的是Nacos的服务发现能力,如下图所示,网关作为服务的订阅者,可以从Nacos获取微服务实例的地址、端口等信息,并根据地址和端口将请求分发到后端的多个微服务实例中,从而实现动态路由和负载均衡。
以下流程图展示了API网关访问微服务后端的具体过程:
服务的提供者将微服务应用注册到Nacos服务器;
API网关向Nacos发送请求,获取服务实例的相关信息,包括服务的IP地址、端口Port以及权重Weight等。为了减少网络间的通信次数、提高响应速度,网关会将获取到的服务实例信息缓存起来;
客户端的请求到达API网关后,网关首先从缓存中获取一个可用的微服务实例地址,每个实例被选择的概率与其权重Weight成正比。然后网关根据"IP:Port"向指定的微服务Server发送HTTP请求并获取后端响应,最后将响应结果返回给客户端;
如果微服务应用的信息发生变动,例如某个服务实例下线或者增加了新的服务实例,那么Nacos会将更新后的实例信息推送给网关,网关则会根据接收到的服务信息实时更新缓存,以确保网关侧和Nacos侧的服务信息保持相同;
客户端再次请求API网关,网关会根据最新的微服务地址信息进行请求的路由和转发。
API网关与Nacos、与微服务实例之间的交互仅支持内网通信,因此在创建API时,Nacos的服务地址需配置为内网地址,否则网关将返回Nacos地址无效的异常信息。同样的,注册在Nacos上的微服务应用的后端地址也必须为内网地址。在调用API时,若网关从Nacos获取到的微服务后端地址为公网地址,那么本次请求将无法处理成功,此时网关会返回错误码I504IA
,若网关未能从Nacos获取到任何微服务后端地址,则返回错误码I504BA
。
3. 创建VPC融合专享实例
由于API网关与Nacos、与注册在Nacos上的微服务应用之间仅支持内网通信,而传统的专享实例又无法实现自定义内网通信,因此我们提供了一种新型的VPC融合专享实例,以支持API网关通过内网打通用户的VPC,融合实例的创建过程可参考创建VPC融合专享实例。创建实例时,您需要将自己的VPC绑定到网关实例上,即在实例创建页面选择可用的用户VPC ID,并设置可用区、交换机和安全组。配置完成后,网关便可通过内网访问指定交换机下的云资源。
4. 部署Nacos服务并注册微服务应用
4.1 部署Nacos服务
Nacos服务需部署在步骤3中选择的【VPC-可用区-交换机】下,您可以选择原生的Nacos服务,将其部署在所选交换机下的ECS中,这样Nacos服务的访问地址便可设置为"ECS的内网IP:Nacos服务的Port"。创建ECS时,网络类型选择专有网络,VPC和交换机需和步骤3中的配置保持相同。
您也可以使用阿里云的微服务引擎(MSE)来创建Nacos服务,创建Nacos时,网络类型选择专有网络,VPC和交换机需和步骤3中的配置保持相同。创建完成后,可在MSE的实例列表页查看Nacos的访问地址。
使用MSE创建Nacos的过程可参考创建Nacos引擎。
4.2 注册微服务应用
您的微服务应用也需部署在步骤3中选择的【VPC-可用区-交换机】下,这样才能确保微服务能够成功注册到Nacos并能够被API网关成功访问。您可以选择将微服务应用部署在ECS中,该ECS需创建在步骤3中指定的交换机下。
注册到Nacos上的微服务应用必须支持HTTP调用。
5. 创建分组
API分组是API的管理单元,因此需要先创建API分组,然后在分组下创建API。 登录API网关控制台,在左侧导航栏选择API 管理>分组管理,单击界面右上角的创建分组按钮,在弹窗页面填写分组信息,实例选择步骤3中创建的VPC融合实例,分组名称和BasePath可自行设置。创建完成后,可在分组列表查看刚刚创建好的分组,单击名称即可进入到分组详情页,在详情页您可以执行绑定域名、修改基本信息、切换实例类型等操作。
API分组会自动创建公网二级域名,此二级域名仅供调试使用,如果直接访问此域名,每天有1000次的限制(海外Region及中国香港限制100次/天),因此建议您在使用时为分组绑定您的独立域名。
6. 创建后端服务
进入API网关控制台,在左侧导航栏选择API 管理>后端服务。在界面的右上角单击创建后端服务,在弹窗创建后端服务页面填写后端服务名称,后端类型选择服务发现。创建完成后,您可以在后端服务列表中找到刚刚创建的后端服务,单击服务名称即可进入后端服务详情界面。
服务发现类型的API仅支持通过已有的后端服务进行创建,因此需要先创建后端服务,然后创建API。
本例中,我们选择线上环境,只有在环境上创建了后端服务,创建的API才可以发布到相应的环境。在界面的右侧单击创建,进入后端服务配置界面:
您需要在上图中的配置界面填写Nacos服务和微服务应用的相关信息,包括:
NACOS地址:Nacos服务的内网地址,必填参数,可参考步骤3填写Nacos的实际部署地址。
命名空间:微服务应用所属的Namespace,必填参数,注意此处应填写的是命名空间ID。
分组:微服务应用所在的分组的名称,必填参数。
服务名:微服务应用的名称,必填参数。
权限认证:Nacos的权限认证方式,必填参数,认证方式可选择无认证、账号密码认证或密钥对认证。
集群:微服务应用所在的集群名称,非必填参数,如果需要设置多个集群,那么多个集群名称请以逗号间隔。
若您的Nacos服务开启了权限认证,那么您也需要填写相关的鉴权信息。如果您使用的是原生Nacos且开启了账号密码认证,那么您需要选择的权限认证方式为账号密码认证,并需要填写相应的账号和密码信息;如果您使用阿里云的MSE来管理Nacos,那么您可以选择使用密钥对认证的鉴权方式,采用此种认证方式时,您需要先创建一个RAM用户,并需要为该用户授予MSE资源的只读权限,然后在后端服务配置页面填写RAM用户的AccessKey和SecretKey;如果您的Nacos服务并未启用权限认证,那么您可以选择无认证。
原生Nacos开启、配置鉴权可参考Nacos权限认证,在MSE中开启、配置Nacos鉴权可参考Nacos Client访问鉴权。
若您的Nacos服务更新了配置信息,那么请及时修改后端服务的相关配置,以避免网关无法访问到指定的微服务应用。
7. 创建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调试失败。