Go编程实践

2019 年 11 月 20 日

Go编程实践

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


1 golog


项目地址:

https://github.com/goinbox/golog


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


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



  • 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 就是这样开发的:



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.消息顺序消费


整体处理框架如图:



里面的对象关系如下:


  • 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 作为一个代码文件,这样很清晰:



svc 的组织



6 其他


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


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


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


结束语


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


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


原文链接:


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


2019 年 11 月 20 日 14:41174

评论

发布
暂无评论
发现更多内容

SQL:我为什么慢你心里没数吗?

Java架构师迁哥

分布式文件系统(Hadoop HDFS)客户端写入机制

守护石论数据

hadoop hdfs 大数据技术 大数据架构 分布式文件系统

5. 穿过拥挤的人潮,Spring已为你制作好高级赛道

YourBatman

Spring Framework 类型转换 Converter

阿里工作6年,熬到P7就剩这份学习笔记了(汇聚六年经验总结),已助朋友拿到7个Offer

Java成神之路

Java 程序员 架构 面试 编程语言

必须清除互联网世界的毒瘤:网络谣言背后存在病态心理

石头IT视角

基于App SDK和API搭建无人自习室等无人场景

IoT云工坊

物联网 智慧琴房 24小时无人自习室 24小时自助游戏厅 共享办公室

裸辞在家闭关,啃下这些面试笔记,终,拿到字节跳动4面offer

Crud的程序员

Java java面试 程序员面试

App性能测试揭秘(Android篇)

应用研发平台EMAS

阿里云 软件测试 测试 性能测试 云性能测试

anyRTC加持AI,打造下一代实时音视频引擎

anyRTC开发者

人工智能 android 音视频 WebRTC RTC

KKR四币连发挖矿系统软件APP开发

开發I852946OIIO

系统开发

一文带你了解传统手工特征的骨龄评估方法的发展历史

华为云开发者社区

方法 骨龄 评估

等不到明年金三银四了!五面滴滴之路,爆砍37K+16薪Offer

Java架构追梦

Java 学习 架构 面试 滴滴

Redis实战丨阿里架构师耗时三年写出的Redis实战文档PDF

Java成神之路

Java 程序员 架构 面试 编程语言

区块链商城系统开发模式制作

系统开发咨询:I76-883I-5I52 邓森

iOS 崩溃分析

ios 崩溃分析

源码解析Synchronized同步方法的八种使用场景,收藏

996小迁

Java 源码 架构 面试 synchronized

软件测试(功能、接口、性能、自动化)详解

测试人生路

软件测试

BitQy交易所软件系统开发|BitQy交易所APP开发

开發I852946OIIO

被阿里、腾讯、华为追捧为最牛逼的 Java 框架你知道是什么吗?

Java架构师迁哥

物联网打工人必备:LiteOS Studio图形化调测能力

华为云开发者社区

互联网 LiteOS 打工人

完全懵掉的电话面试

escray

面经 面试经历 101次面试 日更挑战 十日谈

秒杀系统设计的挑战和问题(转载)

jorden wang

源码解析Synchronized同步方法的八种使用场景,收藏

小Q

Java 学习 架构 面试 多线程

阿里技术官亲荐“998页的应届生面试手册”看完才发现,原来求职也没那么难!

比伯

Java 程序员 面试 编程语言 计算机

干货时间:聊聊DevOps下的技术系列之契约测试

华为云开发者社区

DevOps 测试 交互

堪称完美!阿里架构师亲自手撕”Spring Boot实战笔记“用60个案例给你整的明明白白

比伯

Java 编程 程序员 架构 技术宅

字节跳动的这份《算法中文手册》火了,完整版PDF开放下载!不少小伙伴靠这份指南成功掌握了算法的核心技能,成功拿到了 BATJ等大厂offer。

Java成神之路

Java 程序员 架构 面试 编程语言

2021年Java程序员请先把这几项硬技能熟悉掌握,再想着跳槽拿高薪。

Java成神之路

Java 程序员 架构 面试 编程语言

面试大厂通过了技术面试,却因学历被拒发 offer 的悲惨经历

Java成神之路

Java 程序员 架构 面试 编程语言

源码输出纯净版SSM架构,收藏直接CV使用它不香吗?

小Q

Java 学习 编程 面试 ssm

带宽、延时、吞吐率、PPS 这些都是啥?

小林coding

Linux 操作系统 网络

Go编程实践-InfoQ