Go 编程实践

阅读数:49 2019 年 11 月 20 日 14:41

Go编程实践

今天我给大家介绍下我使用 Go 语言做过的一些编程实践。

1 golog

项目地址:
https://github.com/goinbox/golog

无论我们做什么开发,log 都是个强需求,所以先给大家介绍下我开发的 golog.

首先看下里面最重要的几个数据结构间的关系:

Go编程实践

  • writer

对底层写操作的封装,写的对象可以是文件、队列、ES 等,当前提供如下 writer 实现:

1.FileWriter 写文件
2.FileWithSplitWriter 写文件,可自动按照天、小时为单位分文件写入
3.ConsoleWriter 写终端
4.buffer

对写操作加 buffer 提升写性能,实现时有如下要点:

1. 实现为 writer 的装饰者
2. 提供单独的 goroutine 做 autoflush
3.formater

formater 是将要记录的 log 内容发往 writer 之前做一次格式化,例如添加统一的 log 日期、终端输出添加颜色等,当前有如下实现:

1.simpleFormater 在消息前面加上 loglevel 和时间
2.webFormater 在 simpleFormater 的基础上添加 clientIp 和 logId
3.consoleFormater 为终端输出添加颜色
4.logger

这个是程序中记录 log 要使用到的对象,当前提供了 simpleLogger 这个实现,是一种同步的方式(写操作阻塞程序执行)

  • async

将写入操作放到单独的 goroutine 中从而提升程序性能,实现要点如下:

1.asyncLogger 实现为对 logger 的装饰者
2. 提供单独的 goroutine 做写操作

2 shardmap

项目地址:
https://github.com/goinbox/shardmap

go 中的原生 map 在多个 goroutine 同时读写时是需要加锁的,为了提升性能,核心思想是减少锁粒度,shardmap 就是这样开发的:

Go编程实践

go1.8 之后的官方包中提供了 sync.Map 用于解决 map 的并发读写问题,但我自己测试没有 shardmap 性能好,读者有兴趣可以自己试下。

3 redis

项目地址:
https://github.com/goinbox/redis

redis 可用的包很多,我自己实现的这个包,底层 driver 部分使用了 redigo,考虑到实际的生产环境使用,我自行实现了如下机制:

1. 懒加载机制,即只有真正和 redis 做交互时才创建网络连接
2. 操作失败自动重连机制
3. 提供连接池以提高性能
4.pipeling 封装
5. 事物封装

4 goconsumer

项目地址:
https://github.com/goinbox/goconsumer

对异步队列的使用目前在开发中也是必不可少的,这里提供了一个消费处理框架,目前支持:

1. 消息非顺序消费
2. 消息顺序消费

整体处理框架如图:

Go编程实践

里面的对象关系如下:

  • consumer

从各种队列中做消费的对象,例如 kafka、nsq 等

  • dispatcher

分配消息到 worker 中处理,可以在这里实现自己的分配算法达到顺序消费的目的,当前提供下面两种实现:

1.simpleDispatcher,这个做消息的随机分发,无需顺序的消费均可以使用
2.specifyDispatcher,自己指定消息的分发方法,需要顺序消费等特殊消费需求可以使用
3.worker

消息处理对象,干实际业务工作的。

  • task

启动一个消费任务框架,执行的入口,我在 task_test.go 中有个 demo 实现,可供大家参考。

5 gobox-demo

项目地址:
https://github.com/goinbox/gobox-demo

gobox-demo 是我开发的一个通用的模版项目,基于这个项目我有一些使用 Go 语言做项目开发的心得想要介绍给大家。

controller 和 action 的组织

我见过的大多数项目,都喜欢把 controlelr 和 action 放到一个代码文件中,项目功能越多,文件就越长。

实际中这样做会给开发和维护带来很大的不利,所以我把他们拆开,每个 action 作为一个代码文件,这样很清晰:

Go编程实践

svc 的组织

Go编程实践

6 其他

以上都是我在开发过程中最常用到的一些工具,我的原则向来是追求精简,团队没用到的功能就不添加。

另外,一些涉及到公司内部的代码,例如上线操作无法放到这里展示,但都是会有单独的目录去组织这些。

总之一句话,我力求做到项目组织合理,命名清晰,层次分明,希望让大家从项目的组织结构上就能判断出哪部分功能放在哪里,任何会让人有歧义的地方都要改善。

结束语

应用编程课已经全部讲完了,希望我的经验对大家有帮助,有认识不当的地方还请指正,谢谢大家!

本文转载自公众号 360 云计算(ID:hulktalk)。

原文链接:

https://mp.weixin.qq.com/s/vj89FCj8HlQ-yQ05kX7kdg

评论

发布