在开发项目之前,需要先设计一个合理的软件架构。一个好的软件架构不仅可以大大提高项目的迭代速度,还可以降低项目的阅读和维护难度。目前,行业中有多种流行的软件架构,例如: MVC 架构、六边形架构、洋葱架构、简洁架构等。在 Go 项目开发中,用的最多的是简洁架构,所以我们的项目也遵从简洁架构实现。
为什么需要软件架构?#
这里引用 Robert C.Martin 在其《Clean Architecture》书"的一句话,来说明为什么需要软件架构:软件架构的目标是最大限度地减少构建和维护系统所需的人力资源。 具体而言,采用一个合理的软件架构将带来以下好处:
- 可测试性: 良好的软件架构能够提高代码的可测性,从而增强软件的稳定性;
- 可维护性: 良好的软件架构使系统的各个部分相互独立,易于理解和修改。它提供了结构化的方式来组织代码,使系统的修改和维护变得更加简单;
- 扩展性: 软件架构应能够很好的支持系统的扩展和演变。通过合理的分层和模块化,软件架构可以使系统的功能很容易的得到扩展,而无需对整个系统进行重构;
- 可重用性: 好的软件架构能够提高代码的复用度。将通用的功能封装为可复用的包/库,可以使这些功能在不同的项目和模块中重复使用,从而提高开发效率和代码质量。
架构模式介绍#
IAM 系统采用了简洁架构与前后端分离架构相结合的架构模式。
简洁架构#
简洁架构(Clean Architecture)是一种软件架构模式(又称整洁架构、干净架构),旨在实现可维护、可测试和可扩展的应用程序。最初由 Robert C.Martin 在其文节课 The Clean Architecture 提出。之后,因为简洁架构的诸多优点,在 Go 项目开发中被大量采用。
软件架构有多种形式,例如六边形架构、洋葱架构、尖叫架构、DCI 架构和 BCE 架构等。这些架构在细节上各有不同,但整体而言非常相似。它们的共同目标是实现关注点的分离,并通过软件的分层设计来达到这一目的,从而践行高内聚、低耦合的架构理念。
采用这些软件架构开发的应用都具有以下五点特性:
- 独立于框架: 该架构不会依赖于某些功能强大的软件库存在。这可以让开发者使用这样的框架作为工具,而不是让 开发者的系统陷入到框架的约束中;
- 可测试性: 业务规则可以在没有 UI、数据库、Web 服务或其他外部元素的情况下进行测试,在实际的开发中,可以通过 Mock 来解耦这些依赖;
- 独立于 UI: 在无需改变系统其他部分的情况下,UI 可以轻松地改变。例如,在没有改变业务规则的情况下,WebUI 可以替换为控制台 U;
- 独立于数据库: 开发者可以用 Mongo、Oracle、Etcd 或者其他数据库来替换 MariaDB,开发者的业务规则不要绑定到数据库;
- 独立于外部媒介: 实际上,开发者的业务规则可以简单到根本不去了解外部世界。
上述五点特性,也可以看作是简洁架构的五点约束,理论上任何遵循了以上五点约束的软件架构、都可以看作是简洁架构的一种实现方式。通常所说的简洁架构指的是洋葱架构。
IAM 系统中的 iam-apiserver 模块的简洁架构如下图所示:

整个软件架构一共分为以下三层:
- Controller 层: 负责 API 接口请求的参数解析、参数校验、业务逻辑处理分发、参数返回逻辑。在 Controller 层中还有 Validation 模块,用来校验请求参数的合法性;
- Service 层: 包括了具体的业务逻辑实现。Service 层根据 REST 资源类型分为不同的模块,内部可模块间交叉调用;
- Store 层: 数据访问层(包括访问数据库或第三方微服务),用来跟数据库/微服务交互执行数据的 CURD 操作。
上图所示的简洁架构,还具有以下特点:
- 简洁架构提供了清晰的分层结构,各层功能明确,职责分明;
- 通过接口解耦每一层,从而实现代码的可测性、独立性和扩展性;
- 代码依赖由上向下(图中的有向箭头表示依赖规则),单向单层依赖,提供了清晰的依赖关系,使代码易于理解和 维护。
上述三个特点也使得整个软件代码具有很高的易读性和可维护性。如图所示的简洁架构有三层,但这不意味着简洁架构只有三层。如果有需要你可以对层进行增减。虽然层数可变,但是依赖关系是固定的,即: 单向依赖。
前后端分离架构#
我们以 IAM 的运营系统 iam-operating-system 为例,来详细说说前后端分离架构。一般来说,运营系统的功能可多可少,对于一些具有复杂功能的运营系统,我们可以采用前后端分离的架构。其中,前端负责页面的展示以及数据的加载和渲染,后端只负责返回前端需要的数据
iam-operating-system 前后端分离架构如下图所示:

采用了前后端分离结构之后,当你通过浏览器请求前端 ops-webconsole 时,ops-webconsole 会先请求静态文件服务器加载静态文件,比如 HTML、CSS 和 JavaScript,然后它会执行 JavaScript,通过负载均衡请求后端数据,并将后端返回的数据渲染到前端页面中。
采用前后端分离的架构,让前后端通过 RESTfUl API 通信,会带来以下几点好处:
- 可以让前、后端人员各自专注在自己业务的功能开发上,让专业的人做专业的事,来提高代码质量和开发效率。
- 前后端可并行开发和发布,这能提高开发和发布效率,加快产品迭代速度。
- 前后端组件、代码分开,职责分明,可以增加代码的维护性和可读性,减少代码改动引起的 Bug 概率,同时也能快速定位 Bug。
- 前端 JavaScript 可以处理后台的数据,减少对后台服务器的压力。
- 可根据需要选择性水平扩容前端或者后端,节约成本。
完整架构#
上面介绍了 IAM 所使用的架构模式,下面介绍 IAM 的完整架构。
IAM 系统的完整架构如下图所示:

- iam-apiserver:核心组件,通过 RESTful API 完成用户、密钥和授权策略的增删改查。
- iam-authz-server:授权服务,从 iam-apiserver 拉取密钥和授权策略,并缓存在内存中,用户通过请求 iam-authz-server 提供的 /v1/authz 接口来完成资源的授权。/v1/authz 接口会查询缓存的授权策略,根据这些策略决定授权是否通过。iam-authz-server 也会将授权日志上报的 Redis 中。
- iam-pump:从 redis 中拉取缓存的授权日志,分析后存入 mongo 数据库中。
- iam-watcher:分布式作业服务,间隔一定时间查询MariaDB数据库,执行一些业务逻辑处理,例如:从policy_audit表中删除超过指定天数的授权策略、禁用超过指定天数还没有登录过的用户。
- marmotedu-sdk-go:IAM 的 golang sdk,参考了 kubernetes 的 client-go,封装了 iam-apiserver 和 iam-authz-server 的所有 RESTful API,方便用户调用。
- iamctl:IAM 的客户端,参考了 kubernetes 的客户端工具 kubectl,通过 marmotedu-sdk-go 访问 iam-apiserver 和 iam-authz-server。iamctl 封装了 iam-apiserver 的所有 RESTful API,还封装了其它功能。用户可以通过命令行的方式访问 iam-apiserver。
- redis:缓存数据库,用来缓存密钥和授权策略,降低访问延时。同时也会缓存授权日志,作为运营系统的数据来源。
- mysql:持久性存储用户、密钥和授权策略信息。
- mongo:存储授权日志,供后期运营系统展示和分析。
上图中,灰色部分也是 IAM 项目需要的组件:
- app:第三方应用,是 IAM 的使用方,通过 RESTful API 或者 marmotedu-sdk-go 调用 iam-authz-server 提供的 /v1/authz 接口完成对资源的授权。
- iam-webconsole:IAM 的前端,通过 RESTful API 调用 iam-apiserver 实现用户、密钥和策略的增删改查。
- iam-operating-system:IAM 运营系统,可以用来展示运营数据或者对 IAM 进行运营类管理,比如提供上帝视角查看所有用户的资源,调整某个用户下密钥的最大个数等。
- Loadbalance:负载均衡器,可以是 Nginx、Haproxy 或者 API 网关,后端挂载多个 iam-apiserver 和 iam-authz-server 实例,实现 iam-apiserver 和 iam-authz-server 组件的高可用。
小结#
本章介绍了 IAM 系统的架构设计,主要包含以下几个方面:
软件架构的重要性:一个好的软件架构能够最大限度地减少构建和维护系统所需的人力资源,提供可测试性、可维护性、扩展性和可重用性。
简洁架构:IAM 采用了简洁架构(Clean Architecture)作为核心架构模式,通过清晰的三层结构(Controller 层、Service 层、Store 层)实现职责分离和单向依赖,确保代码的高内聚、低耦合。
前后端分离架构:在运营系统中采用前后端分离设计,让前后端通过 RESTful API 通信,实现并行开发、专业分工、灵活扩容。
完整系统架构:IAM 系统由核心服务(iam-apiserver、iam-authz-server)、辅助服务(iam-pump、iam-watcher)、客户端工具(iamctl、SDK)以及配套的数据存储(MySQL、Redis、MongoDB)共同构成,形成了一个完整、可扩展的身份认证授权系统。
通过合理的架构设计,IAM 系统不仅具备了良好的可维护性和扩展性,也为后续的功能迭代和系统演进奠定了坚实的基础。