Infraship
Golang base infrastructure
用于存放项目运行的各种各样的基础设施, 方便快捷的支撑Domain层的业务逻辑
[TOC]
目录结构
infra包中虽然存放的是基础设施的代码, 原则上应该避免互相调用, 保持独立, 但实际上, 为了支撑业务需求以及方便抽象出通用的部分, 很难避免模块间的调用, 因此, 为了避免调用关系的混乱, 需要为每个模块标识出调用Level.
采用如下方式约束调用链
L1 <- L2 <- L3
L1表示最底层的模块, 它是infra下所有调用的源头, 被标识为L1的模块严格禁止调用别的模块的内容
- L1: 完全与业务无关的模块, 例如: 日志, 监控, 熔断限流等组件, 公共函数和方法等(这里的完全业务无关是指:不依赖特定的服务, 不包含特定的业务代码)
- L2: 原则上它也是业务无关的模块, 例如: mysql client, redis client等, 本质上它也可以无缝移植到各个服务中去, 但往往它可能需要记录日志, 上报信息, 调用一些通用的公共处理方法, 它现在或者将来可能需要依赖L1模块中的函数或方法
- L3: 业务相关的基础模块, 有一定的项目相关性, 可能会依赖L2,L1的相关基础模块
注意⚠️: 需要保证L1 L2的目录可以随时可以抽象移动到公共基础库中
目录说明
- [L3] application 作为服务通用的入口, 并管理整个服务的生命周期, 维护业务相关的组件和模块
- [L1] gobject global object用于管理和维护全局对象
- [L1] logger 日志组件
- [L2] connector 用于放置各种用于链接外部服务, 它仅仅用于描述, 如何构建一个用于与外部服务沟通的客户端, 例如mysql客户端, redis客户端等等
- connector.go 定义接口用于描述一个connector需要实现哪些方法
- database/ 实现数据库的connector
- cache/ 实现缓存的connector
- web/ 实现web相关的各种connector
- [L1] kit 存放各种工具函数, 并封装一些完全业务无关的公共组件
- [L1] x 用于扩展, 封装标准库或者三方库, 便于这些库使用起来简单方便
- [L1] def 用于定义各种接口公共常量等
- 每个项目一个单独的目录, 必须提供
rpc.go
的服务接口定义