背景概述
在接入层高可用架构设计文章中,我们详细讨论了接入层的故障域并给出了解决方案,并结合一个具体案例,来说明如何实现接入层的高可用建设。
本文我们主要专注逻辑层。在容灾场景下,由于需要跨机房调用,所以很多客户都有一个疑问:我能不能让我的微服务就近访问?
其实有比较多的方案来实现这个功能。
方案概述
逻辑层就近接入,主要是指微服务之间的相互访问,从用户来的流量,经过业务网关路由后,不在本文讨论范围内。
整个业务流程来看,业务流量大概经过两个部分,主要是业务基础设施、业务程序。
业务基础设施层面,主要思路是感知基础设施部署情况,在基础设施寻址层面就做劫持。具体实现是智能DNS,但这种方式有较多的人力投入;如果采用了服务网格后,可以通过服务网格来自动化管理,具体参考:TCM同城双活设计方案-腾讯云开发者社区-腾讯云
业务程序上实现,一般开源框架就包含了这部分的内容,下面我们以dubbo为例分析说明。
应用框架层调研
由于阿里巴巴影响力,国内比较多的互联网公司使用Dubbo作为微服务框架,基于这个开源框架来谈一谈开源产品的就近接入实现。
Dubbo 2.7之前版本,原生不支持就近访问,需进行编码实现,一般有两种方式:Dubbo filter及Java agent。Dubbo2.7及之后版本,原生支持。下面是一些对比及实现思路
对比 | Dubbo < 2.7 | Dubbo >= 2.7 | |
---|---|---|---|
实现方案 | Java agent | filter接口 | ConditionRouter |
具体实现 | AOP编程方式,根据规划的IP规则,过滤invoker list | 1、自定义filter 1、 修改@DubboService注解的filter字段,启用filter | 路由规则中添加(IP根据实际情况修改):conditions: - host=10.10* => host=10.10* - host=10.20* => host=10.20* |
对代码侵入性 | 无 | 有 | 无 |
上手曲线 | 较难,需新增组件,并且需修改启动方式,以挂载agent | 开发简单,需考虑异区服务的兼容性 | 无开发成本,且在本区服务异常后,会自动重试异区服务 |
适用范围 | 广 | 基于框架 | 基于框架 |
其它的框架,基本也可以按照上面思路,实现就近接入,解决业务延时敏感问题:
1) java agent是基于jvm的,与框架无关,使用范围非常广
2) 接口属于框架的扩展能力,依赖具体框架。
3) 原生支持,也属于框架能力,依赖具体框架的实现。如spring cloud,原生就支持就近接入
我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表