导读:在微服务中,当服务跨多个公有云的可用区时候,我们采用什么样的服务访问策略以及保障其高可用?本文是 DerbySoft 架构师朱攀在高可用架构群的分享,介绍微服务中路由服务的设计。
朱攀,德比软件架构师,2007 年 2 月加入德比软件。主要负责数据对接平台的架构和实现。作为德比软件早期员工,从无到有的主导了德比软件数据对接平台的架构设计和实现,完成了对接平台多个版本的架构改进和升级。期间设计并实现了很多必要的基础设施和服务,如内部的 RPC 框架 derbysoft-rpc,路由服务 Router,分布式存储服务 DStorage,网关服务 DGateway 等,主要编程语言 Golang,Scala,Java。目前主要关注的方向在基础架构、微服务、大数据等。
背景介绍
我来自德比软件 (DerbySoft),今天跟大家介绍我们做的微服务架构中的路由服务。德比软件是一家旅游行业 B2B 公司,为全球酒店集团及其分销渠道提供数据对接服务,构建全球旅游分销网络( GDN)。目前, 公司拥有全球超过 20 万家酒店数据,每天处理 10 亿 + API 调用,每月处理 500 万 + 间夜的订单。服务的客户包括全球重要地区的顶级分销渠道,在线旅行社,垂直搜索引擎,批发商以及众多大型旅游经销商(如: booking.com, Expedia, Google, Ctrip 等)。
为什么需要路由服务?
先来看看我们的数据对接平台的一个总体架构图:
(点击图片可放大浏览)
系统架构不是今天分享的重点,下文主要跟大家交流一下中间服务层中的路由服务( Router)。
微服务化之后,系统面临的一个突出问题是服务虽小,但是数量极多,如果这些服务全部在一个可用区内,服务之间的依赖还比较好管理,可以做服务自动注册和发现来实现依赖管理,但是如果服务分布在很多可用区域,尤其是跨国跨地区的可用区之间的依赖和调用,管理起来就比较麻烦。
下面是我画的一个服务之间的示范依赖图,实际情况的依赖可能会比图示更复杂:
如果这些服务部署分布在不同国家或地区的可用区里,它们之间的依赖调用就更难管理了,另外,跨可用区服务之间的调用还需要考虑安全认证问题。我们内部的通讯协议是 TCP,自研的 RPC 框架 derbysoft-RPC( 多语言实现 ),序列化采用 Protocol Buffers,各个服务采用的主要编程语言有 Golang, Scala, Java 等,每个服务开不同的特殊端口,所有的服务都部署在 AWS 的 EC2 上,如果服务跨区域调用,访问权限配置也是一件麻烦的事情。
为了解决这种情况下服务之间的依赖调用问题、 API 安全问题和服务的高可用问题,我们设计开发了路由服务,解耦服务的调用者和提供者,简化网络拓扑图,简化服务器的安全配置。
下面是引入路由服务之后的服