一、技术背景
在微服务架构中,通常由统一的服务网关进行服务访问的管理和控制,实现路由、鉴权、限流、负载均衡等功能。服务网关作为系统的关键一环,对其性能和可用性提出更高的要求。现有的服务网关一般采用中心化的集群部署,在对可用性有更高要求时进一步采用跨地域部署。
在云计算行业中,资源池是按地理区域进行建设的,具有独立的业务隔离域。在对资源池进行业务管理时,通常需要由中心化的服务网关进行服务请求路由,再接入目标资源池进行业务操作。存在中心化服务网关出现故障时,无法支持业务持续开展的问题。
访问密钥是云计算常用的一种用于访问和管理云资源的身份凭证,通过签名对请求者进行身份验证。其访问密钥ID一般是一串随机字符串,不直接携带有业务信息,具体业务权限由后台IAM系统进行管理。
二、技术方案
服务网关是由任意多个去中心化的服务节点组成的集群。集群中的每个服务节点可独立执行相同的业务逻辑,不依赖于其它任何服务节点。服务节点分配有全局唯一的节点ID,节点ID可采用人工编号方式生成,也可通过ID生成算法生成。服务节点之间可以通过Gossip协议或DHT方式实现节点发现和组网通信,在对去中心化要求不高的场景也可以注册到统一的服务发现组件中实现节点发现。服务节点之间通过节点发现和信息交换,维护有一组邻居节点的信息,邻居节点的信息至少包括服务节点ID和IP地址信息,可包含节点地理位置信息。服务节点可任意动态加入和退出该服务网关集群,服务节点的故障和恢复就相当于退出和加入服务网关集群。
服务节点为需要访问其服务的客户端生成访问密钥。客户端需要绑定访问密钥才可以通过服务节点的鉴权进行服务访问,访问密钥包含访问密钥ID(AK)和秘密访问密钥(SK)两部分,其中AK是公开包含在服务请求数据中,SK则需要安全存储在客户端本地和服务网关集群中。服务节点为客户端生成的访问密钥的AK中携带有服务节点ID信息,优选的,AK携带的服务节点ID信息是通过对AK进行单向Hash运算得到,在单向Hash运算前需对AK进行加盐处理,这样攻击者无法直接从公开的AK信息中推测出所生成该访问密钥的服务节点ID,也无法伪造规律性的AK对服务节点进行恶意请求攻击。访问密钥可以由任意节点生成,避免服务节点故障时无法生成密钥。访问密钥可以使用非对称密钥,采用私钥签名验证方式进行鉴权。在去中心化要求不高的场景,访问密钥可以由统一的中心化节点生成。
服务节点把生成的访问密钥信息存储在分布式数据库中。该分布式数据库可为所有服务节点提供访问服务。该分布式数据库可采用区块链的技术实现,所有服务节点组成私有链,共同维护去中心化的访问密钥信息。在去中心化要求不高的场景,访问密钥可以统一存储在中心化数据库中。
客户端通过DNS解析服务域名,获取任一服务节点IP地址,发起服务请求。采用智能DNS或CDN等技术实现根据地理位置返回域名解析结果,实现就近访问和负载均衡。
服务节点在接收到客户端服务请求时,通过请求中携带的AK信息判断该请求所需要访问的目标服务节点,并将服务请求路由到目标服务节点。接收请求的服务节点采用重定向响应,通知客户端直接请求目标服务节点,免去服务节点间的数据转发性能损失。通过AK信息直接定位提供服务的目标服务节点,减少了繁琐的数据解析工作,可提高路由效率。目标服务节点对客户端服务请求中携带的访问密钥进行鉴权,鉴权通过则允许访问服务,否则拒绝提供服务。
服务节点在接收在客户端服务请求时,当发现目标服务节点发生故障时,可直接对客户端请求进行鉴权并提供服务,实现任意服务节点故障时,仍可保持服务网关集群的可用性。服务节点把客户端的服务请求路由给离目标节点地理位置最近的可用服务节点,由该可用服务节点提供服务,减少服务延时。
服务节点在负载较大时,可以将客户端的服务请求委托给其它可用服务节点,实现服务节点的负载均衡。将客户端的服务请求委托给离本服务节点地理位置最近的可用空闲服务节点。
具体节点ID生成方案:
(1)以服务网关集群有100个服务节点举例,采用人工编码指定节点ID分别为0~99。
(2)随机生成固定长度字符串,如30个字符,并添加2个字符的校验值,组成32位字符的字符串。
(3)对该字符串加盐并进行md5运算得到md5哈希值,取md5的前8bit作为节点ID信息,8bit可组成256个值,大于100个服务节点ID,可作为节点扩容预留。
(4)如前8bit为00000001,则该生成的32个字符组成的字符串可作为节点ID为1的服务节点的访问密钥AK。
具体系统实施方案:
(1)所有服务节点将访问IP添加到DNS解析服务记录中;
(2)客户端通过DNS域名解析得到服务节点1的访问IP;
(3)客户端对服务节点1发起服务请求。服务节点1点验证访问密钥的有效性,并通过访问密钥携带的节点ID信息识别出客户端的服务请求是针对服务节点3,响应包含服务节点3访问IP的重定向响应;
(4)客户端重新对服务节点3发起服务请求;
(5)服务节点3对客户端的访问密钥进行鉴权,确认该请求符合权限要求;
(6)服务节点3为客户端请求提供服务内容响应,并进行后续业务处理。