云世 公众号
在“自己动手用 Go 实现 Service Mesh”这个大的模块中,会带你动手用 Go 语言实现一套简单的 Service Mesh 系统,以加强你对 Service Mesh 原理的掌握和理解。在编写代码之前,这一讲我们先来讲一下项目背景,包括为什么要进行自研、自研 Service Mesh 的优势、自研 Service Mesh 可以解决哪些问题,以及项目框架的初步搭建等内容。
首先,我们先来看一下这个项目的背景。假定你所在的 B 公司目前已经初具规模,正在进行从单体服务到微服务的初步拆分,公司的主要语言为 Go 语言,同时存在 Python、Node.js、PHP 等多种语言。
项目背景
公司的 X 项目目前已经初具规模,随着人员的扩张,从单体服务拆解到了多个子服务。但现在遇到了一些问题,急需解决方案。该项目目前面临如下困难。
-
入口层缺乏统一的系统网关:多个服务同时对外暴露,无法进行统一的登录验证、加/解密等功能,只能在各个对外暴露的服务中单独实现,无法进行统一的维护。
-
存在雪崩现象:某一个核心微服务出现故障后,导致级联故障,依赖的服务因为响应延时变高,都将出现故障,最终导致整站故障。
-
无法处理突发流量:很多时候因为运营活动,前期没有配合提前扩容资源, 导致服务被突发流量打挂。
-
内部通过内网集中网关调用:内部通过统一的网关调用,一旦内部集中网关出现问题,导致所有服务出现故障,继而引起整站故障。
-
项目可观测性不足,问题排查困难:各个服务自己实现监控指标,没有统一的监控,随着服务数量增多,问题越来越难以排查。
鉴于以上多种问题,已经影响了线上 App 的稳定性,急需技术手段解决。
下面我们针对上述问题,进行技术选型,调研以下几种解决方案,包括微服务框架、开源 Service Mesh 方案、自研 Service Mesh 方案。
以下三种方案,通过服务治理的方式,都可以解决上述问题,其中微服务框架需要再引入一个开源系统网关或者用框架实现聚合层。下面我们来看几种常见的框架选型。