什么是微服务?
在了解微服务架构前,我们需要先了解什么是微服务
在传统单体架构(如上图左侧)中,我们一个项目的所有模块是聚合在一个程序中。我们所有模块数据都存放到一个数据库中。因为这种架构很简单的原因,所以开发效率很快,部署方便,在项目初期阶段比较常用。但随着项目复杂度增加,开发规模上升缺点也有很多比如:模块之间代码容易引起冲突,因为太容易修改到同一个文件了。还有就是一个小改动也需要整体上线,线上稳定性很难得到保证。
随着软件架构的不断演进,微服务架构逐渐流行起来。在微服务架构(如上图右侧)中,模块是独立运行的进程服务,每个模块都有独立的数据库,当业务流量增大时可以通过增加部署实例的方式来应对。
「 微服务 」的理念提倡每个服务都是单一职责,且每一个服务都能实现自治,因此可以带来一些明显好处:
部署简单:每个微服务都可以独立去部署,方便快捷。
逻辑清晰:将一个独立功能逻辑封装在单一微服务里面,实现整体项目的逻辑清晰。
可扩展:因为可以随时增加和减少微服务,可以很方便的扩展功能。
可靠性高:某一个功能的异常可以隔离在单一微服务里面,可以提高整体可靠性。
微服务架构实现形式
实现形式大致有三种:
基于云原生的微服务
当前概念最火的微服务实现方式,这种方式需要依赖k8s集群来管理服务的容器。
如上图,每个微服务其实就一个Service,Pod是每个服务的部署实例。服务的对外访问提供需要依赖Ingress来实现。
优点很多: 需要考虑服务注册发现问题(内部已集成)、支持容器的弹性伸缩等
存在问题: 非云原生的应用无法使用、架构复杂导致运维成本很高、
基于微服务框架的微服务
Java系的spring-cloud、Go系的go-micro都是微服务框架的代表。 上图以go-micro为例进行说明:
Register确保每个Server的启动和消亡最终写入到Consul。Client是请求服务的接口,请求服务时会先使用Selector选择一个服务器,然后再经过transport和codec的最终抵达目标Server.
优点:内部集成了服务注册发现、服务间调用都是代码形式实现更便捷、插件丰富
缺点:与开发语言强绑定、功能复用性不强(A服务的功能,即使做成公共库其他服务也需要调用才行)
基于网关的微服务
基于网关的微服务架构,我们以GateKeeper进行说明。
1、用户通过接入层 (一般选用 nginx、Haproxy、LVS) 连接到 GateKeeper 实例中。
2、每个 GateKeeper 实例,针对每个子服务模块,单独进行服务探测。
3、在线服务管理时,配置数据先保存到 GateKeeper 配置 DB 中,然后再通过调用配置更新接口( /reload ),更新所有实例机器配置。
1、网关提供服务的注册发现机制和负载均衡
2、外部访问可以直接使用网关接入,内部服务互调也可以经由网关接入
3、网关可提供额外的其他功能拓展支持(如:登陆、权限验证)只实现一次多出调用。
4、接入的服务不受语言限制
5、非云原生应用、云原生应用皆可使用。
为什么考虑开发 GateKeeper?
我们公司项目在发展初期时,我们的服务比较少。而且大多是内部服务,对外服务只有一个后端(PHP)。18年下半年 随着业务发展,增加了N多个服务模块。考虑到之前的单体架构已经无法满足当前需求了,所以开始考虑微服务化划分,在划分好业务边界后,我们整理出共 10+个服务,5个服务需要对外服务。
这5个对外服务在部署完毕后首要解决的问题是需要接入用户权限系统(UPM),因为之前功能是下挂在PHP系统中的,当时我们考虑了三种方式:
1、是多个服务单独接入UPM、SSO系统。这样成本很高而且相同代码需要多出维护。
2、是仍然使用之前的 PHP项目当做外层项目,通过转发请求做统一权限和登陆操作。这是当时成本最低的方式。
3、独立做一个权限和登陆的API gateway,让它作为统一接入服务。以后再加项目时加一个配置即可。
从长远发展以及通用性来说我们最终选择了,独立做一个 API gateway。
首先,当前GO这个技术栈 没有成熟的API gateway。
另外其他主流的API gateway,大多都有依赖软件较多的问题,比如要实现动态服务注册就需要 Consul这类的分布式数据库。
而我们的业务有时候需要本地化部署,这就需要:依赖少、快速简易部署、支持多种权限配置等。
综合以上因素,我们就考虑使用GO自研API网关了。
项目信息:
GateKeeper地址:
https://github.com/didi/gatekeeper
GateKeeper 还有很多改进点,希望大家提出宝贵意见。
我们下一步的精力主要会放在三个方面:
1、持续不断推进项目稳定性建设和问题修复。
2、增加示例代码,让使用者更加容易、便捷。
3、增加新特性:熔断机制、基于云原生的部署等