谈DevOps持续交付和API网关协同(12.18)

在很早以前的博客文章我就谈到,当前在构造整体架构的时候将DevOps支撑平台和API网关分离,变为两个相当独立和松耦合的产品。今天重点再谈下DevOps支撑平台和API网关协同的场景。
我们首先看下什么时候需要涉及到API网关,在我们最初的概念里面是当一个业务应用需要对外发布API接口服务能力,这个对外发布可能是外部其它合作伙伴使用,也可能是我们自己的APP前端使用,只要存在这种场景往往就涉及到API网关的使用。
在一个大型项目的多团队协同下可以看到,如果都采用微服务架构,我们实际建议的是每个团队都是自己独立的微服务注册中心,负责团队内部多个微服务模块之间的API接口调用,这些API接口调用走注册中心即可。但是涉及到跨团队协同的API接口服务,那么就需要注册到API网关进行统一管理。
简单来说就是, 对外发布API或者跨团队API接口调用都需要涉及将API注册接入到网关统一管理 。
对于一个微服务模块和API网关的协同,包括了提供API接口服务注册和接入到网关,也包括了从网关调用API接口服务消费。因此需要从API注册接入和API消费调用两个方面来谈协同。
API注册接入
对于整个DevOps过程可以看到,底层是Docker容器+K8s资源调度,在我们编排流水线的时候涉及到编译构建和打包,部署等各个动作。实际上可以看到在完成自动部署后接口服务会暴露一个k8s提供出来的动态ip访问地址。而我们需要做的是将这个ip地址提供出来的访问接口,注册和接入到网关。
在整个过程搞清楚后,实际上我可以有两种方式来处理API注册接入。
1. 在部署节点,增加自定义脚本编写,通过自定义运行的脚本来完成API接口服务的注册。
2. 增加接口注册流水线编排节点,在部署节点完成后,编排注册节点,在API注册节点定义接口注册内容。
由于整个DevOps流水线设计和执行偏开发人员使用,可以看到,采用第一种方式往往更加灵活。唯一的就是在定义某一个流水线的时候,需要预先规划好需要接入和注册的接口内容。
而在DevOps支撑平台虽然不需要完整的API网关管控功能,但是最好还是增加一个功能,就是能够在DevOps支撑平台查询到当前已经注册和接入了哪些接口服务,注册接入后提供的代理服务地址是什么,是哪个微服务模块注册接入的该服务等基本服务目录信息。
API消费调用
注意在采用了API网关后带来的一个好处就是,API网关本身提供出来的API访问地址的IP是固定的,不会随着每次微服务模块的自动构建和部署动态变化。对于API网关我们会提前先部署到测试环境和生产环境,在网关部署完成后再开始进行各个微服务模块的持续集成和部署操作。
因此一个微服务模块需要访问其它微服务模块哪些接口,一个方法是每次都调用服务注册中心去查询具体的服务访问地址,一个方法就是本身要将访问地址存在在本地配置文件。更好的方法是:
1. 首先调用先访问服务注册中心,获取服务访问地址,并存在到本地配置文件
2. 在发现本地配置文件已经有服务访问地址后,不再从服务注册中心调用,除非得到地址变更消息通知
在这个确定后,微服务模块本身的构建打包和部署,实际上和原来没有和API网关协同是完全一样的,只是配置文件访问地址固定为了API网关提供的地址而已。如何知道API网关提供了哪些地址,即我们谈到的可以在API网关的管控平台查询,也可以在DevOps平台提供的服务目录查询功能上进行查询。
本地调式和环境迁移
在前面我们谈到过,在持续集成过程中的环境设置是否需要设置开发环境的问题。对应这个问题,个人的观点是,在本地开发人员的开发项目只包括自己的开发包,其它交互和协同都需要调用其它模块的API接口服务来完成的时候,必须设置开发环境,而且要确保开发环境和测试环境分离。
那么本地开发人员在本地调试的时候,涉及到外部模块的接口则直接配置为开发环境接口地址进行本地调式。而外部模块提供的接口也需要提前开发完成并可用,并部署到开发环境上面。
环境迁移是另外一个在协同过程中必须解决的关键问题。
即在环境迁移后,需要对服务访问地址的配置文件中的ip地址进行自动化修改,这个过程可以在流水线编排的时候的脚本代码中来完成。我们可以准备多个备用的配置文件,在环境迁移的时候用当前环境的配置文件对缺省配置文件进行覆盖即可。