其他语言:
我最近对这个框架进行了重大升级,虽然所做的改动不大,但成效显著。升级后的项目在"servicetmpl1"。这次更新修复了旧框架中的所有主要问题,尽管它的的主要项目结构和接口都没有改变,具体改动内容请参见清晰架构(Clean Architecture)的Go微服务—重大升级。 现在它几乎拥有了我理想框架中的所有内容。它是一个轻量级的框架,但功能强大,并且还是可插拔的。
这是一个基于gRPC的Go微服务项目。它为Go微服务程序找到了合适的程序结构,并且应用了清晰架构(Clean Atchitecture)设计并使用依赖注入(Dependency Injection)将具体类型注入到每个函数中。
下面是讲述这个项目的系列文章:
在创建gRPC微服务项目时,此项目最适合用作基本框架。它已经具有丰富的内置功能并且已经调试通过,因此没有理由从头开始。该项目的目标是构建一个具有基本功能的灵活框架,以便以后轻松扩展。 程序设计遵循“SOLID (面向对象设计)”设计原则和Go的简洁编码风格,因此当你需要执行某些编码规范时,它可以用作程序设计和编码样式的具体示例。
- 通过更改配置文件来切换持久层实现。目前,它实现了MySQL和CouchDB数据库。 (它可以扩展以支持其他SQL或NoSQL数据库)
- 通过更改配置文件切换日志记录库。目前,它实现了ZAP和Logrus。 (它可以扩展支持其他日志记录提供库,只要它们有类似于ZAP和Logrus的通用接口)
- 支持业务层事务(它不支持跨微服务的事务或嵌套事务)
- 使用依赖注入创建具体类型。
- 程序配置保存在YAML文件中。
- 程序有三层:用例,模型和持久性。每层通过接口访问其他层。
- 外部功能也通过接口访问。
- 不同层之间的依赖关系仅在接口而不是具体类型上。
- 接口在顶级包中定义,并与具体类型分开。
- 每个具体类型都在单独的子包和文件中定义
- 用包来隔离不同的层
- 用包隔离每个用例
- 用包隔离每个实现(例如数据库实现)
- 当添加新功能时,请添加新代码,而不是修改现有代码
- 消除包级变量 (“容器”包是例外)
- 尽量减少常量的使用。
- 记录错误的完整堆栈跟踪
- 仅在调用链顶函数层处理错误
- 隔离不同的关注(Separation of Concerns)
- 命名规范。局部变量用短名称,类型或接口用长名称。
不需要完成本节中的所有步骤以使代码运行。 最简单的方法是从github获取代码并运行它,然后在真正需要某些部件时再返回安装。 但是,访问数据库时会遇到错误。 所以,我建议你至少安装一个数据库(MySQL更好),然后大部分代码就都可以运行了。
go get github.com/jfeng45/servicetmpl
有两个数据库实现,MySQL和CouchDB,但大多数函数都是在MySQL中实现的。 你最好安装至少其中一个。
安装MySQL
在script文件夹中运行SQL脚本以创建数据库和表
没有它,代码工作正常。创建CouchDB用来完成切换数据库的功能(通过更改配置)。
安装Windows
安装Linux
安装Mac
CouchDBExample
通过浏览器访问“Fauxton”:http://localhost:5984/_utils/#(使用:admin/admin登录)。
在“Fauxton”中创建新数据库“service_config”。
将以下文档添加到数据库(“_id”和“_rev”由数据库生成,无需更改):
{
"_id": "80a9134c7dfa53f67f6be214e1000fa7",
"_rev": "4-f45fb8bdd454a71e6ae88bdeea8a0b4c",
"uid": 10,
"username": "Tony",
"department": "IT",
"created": "2018-02-17T15:04:05-03:00"
}
没有它,调用另一个微服务部分将无法正常工作,其余部分工作正常。请按照reservegrpc中的说明设置服务。
cd [MySQLroot]/bin
mysqld
它应该已经启动了
请按照reservegrpc中的说明启动服务器。
在“main.go”的“main()”函数中,有两个函数“testMySql()”和“testCouchDB()”。 “testMySql()”从“configs/appConifgDev.yaml”读取配置并访问MySQL。 “testCouchDB()”从“configs/appConifgProd.yaml”读取配置并访问CouchDB。 “testMySql()”中有多个函数,你可以通过注释掉其他函数来单独测试一个函数。
cd [rootOfProject]/cmd
go run main.go
启动gRPC服务器
cd [rootOfProject]/cmd/grpcserver
go run grpcServerMain.go
启动gRPC客户端
cd [rootOfProject]/cmd/grpcclient
go run grpcClientMain.go
MIT 授权