# 《API网关》第22章:订阅服务注册消息驱动网关映射

作者:小傅哥
博客:https://bugstack.cn (opens new window)

沉淀、分享、成长,让自己和他人都能有所收获!😄

  • 本章难度:★★★★☆
  • 本章重点:通过 Redis 发布和订阅的模块,在网关注册中心和网关助手中分别提供相关功能,在应用接口注册到网关中心后触发通知,让网关助手完成新增接口的映射处理。
  • 课程视频https://t.zsxq.com/09Sq7fqr7 (opens new window)

# 一、前言

设计的目的就是要解决很多细碎的点

当我们开发一个软件服务或者应用时,如果有一些很小点的没有处理好,那么将要面对的是和所有的使用者进行信息沟通,同时所有的使用者也会因为你的设计而增加他们的工作量。

例如你开发了一个组件,但这个组件中有一个需要注意的配置事项。配置错了系统就没法正常运行,可能最开始开发这个组件并没有意识到,就一个配置即使错了和你沟通也没有多少成本,但随着组件被越来越多人使用时,那么就是把你的一个设计错误,分摊到所有使用者身上去。而这样带来的成本,将是非常庞大的。

# 二、消息监听

这一章节的开发有一个需求的背景,我们的网关算力服务在启动过程中会拉取注册中心的接口信息,到网关算法上进行注册操作。通过这样的一个步骤,才能让我们在访问网关接口的时候,泛化调用到对应的 RPC 服务。

那么,这里需要思考🤔。当网关算力服务已经是部署在Docker容器中后,再有新的服务或者接口注册到网关注册中心的时候,那么网关算力该如何把这些信息获取到并完成网关的映射呢?

其实,你可以通过几个方案来处理;

  1. 接口的轮训,在网关算力 api-gateway-assist 助手服务中通过不断的像网关中心请求接口的方式,拉取到所有需要被注册的接口。这里可以在已经拉取的服务接口上,在Redis中做数据的记录,减少重复拉取。不过这样的方式会给网关中心带来不小的压力。
  2. 服务的连接,在网关助手类与网关中心建立一个 Netty 的服务,由网关中心接收到新的接口注册时候进行信息通知。但这样的长链接,已经会占用不少的资源。
  3. 事件的通知,其实通过事件来通知是一个比较合适的方式,比如你可以使用 MQ、ZK等方式,也可以使用 Redis 的发布和订阅。在有接口变化的时候,可以通过消息的推送,让网关算力获取到变化的接口信息进行注册处理。那么本文就是通过 Redis 的方式进行处理。

带有颜色标记的工程;api-gateway-assist、api-gateway-center、api-gateway-sdk,都是本章节中所涉及要改动的工程;

  • 在 api-gateway-center 工程中添加 Redis 发布消息模块,并提供应用服务注册后的事件通知操作。这个通知只会通知给对应的网关算力服务,不会全局通知。
  • 在 api-gateway-assist 工程中开发 Redis 订阅消息模块,当收到注册中心的消息推送时,则根据系统的标识信息进行拉取服务。注意这里你可以进行细化,只把变更的信息一条条推送给网关注册,减少接口的拉取
  • 在 api-gateway-sdk 工程中添加对网关注册中心接口的调用,当所有的服务注册完成后,调用接口进行通知。