内容简介:golang程序设计,怎么样的风格比较好?我个人一直推荐的是Aop方式来做golang程序设计。可见谈谈基于Go的Aop设计在golang程序中,模块的设计,可以通过用架构设计的模式方法来做程序设计。利用这种思想方式,去做程序设计,那么程序的耦合性将很容易降低到最低。
golang程序设计,怎么样的风格比较好?我个人一直推荐的是Aop方式来做golang程序设计。可见谈谈基于 Go 的Aop设计
在golang程序中,模块的设计,可以通过用架构设计的模式方法来做程序设计。 通过对比, 把golang看做一个平台,go runtime对应对os kernel。那么程序模块的设计,就完全可以对应于多个进程在同一台机器上进行合作运行。
利用这种思想方式,去做程序设计,那么程序的耦合性将很容易降低到最低。
说到这里,对于单模块的设计,通过角色的划分(或者服务功能来划分),很容易将整个程序的模块划分清楚。
当模块数量不多的时候,模块的组织结构也会很简单。
但当模块数量较多时,特别是模块之间的互相依赖关系复杂的时候,这个时候,虽然单个模块的功能简单,但整体的复杂性会成指数性增加。
那么这里就上升到架构的设计。而架构的设计有很多。有分层架构,有扁平化架构。把模块看做是角色,看做是人,那么模块如何组织,其实就是架构组织。在《架构即未来》这本书中,非常详细的讲解了架构组织。
程序架构,组织架构,这些都是通用的。
那么要减少程序的复杂性,又要保留模块组织的功能和灵活性。这里面没有说哪个架构模型是万能的。架构组织过程中,都是一个中庸平衡的过程。
那么在golang程序设计中,大多数情况下,可以通过混合架构方式来做设计。
首先,分层设计。通过将模块角色或功能,特别是依赖关系,划分层次。几个原则:
1、最好,不做跨层依赖和调用
2、上层依赖下层,下层不依赖上层
3、同一层中,模块数量不要过多。
其次,扁平化设计。在同一个分层中,通过组织角色划分,将几个共同协作的模块,划分成一个组织角色。 几个原则:
1、一个组织,可以包含少数几个模块。这几个模块,依赖调用,可以适当放开限制。
2、组织与组织之间,通过开放接口、api等方式,提供功能。组织之间的依赖,以及调用,尽量少。
3、若组织之间依赖关系过多,则,可以考虑将其增加分层设计。
总结下:
1、golang提供的是一种类似os kernel的环境,让我们可以非常简单的做模块化设计。
2、模块设计之后,将模块化具象化成角色(人+职能 )
3、模块之间的关系,又可以上升到组织结构,可以通过架构组织方式去思考。将模块化之间的组织关系具象化为角色与角色之间的关系设计。
大道至简,你以为你在写代码,其实你是在做上帝。生活中,我们生活在这样的,那样的组织架构中。而代码,在你手里,你可以设计模块的组织架构。让其在你的设想中运行。
业余时间,经常会看一些开源代码。一直都没有碰见我认为比较适合做案例的真正代码。我想万千世界中,肯定会有志同道合之人。有幸看到owlcache开源代码。
owlcache 是一款由Go编写的轻量级、高性能、无中心分布式的Key/Value内存缓存型的数据共享应用(一定场景下可以作为轻量型数据库来使用)。github.com/xssed/owlcache
其功能架构设计如下
图片来源https://github.com/xssed/owlcache/blob/master/doc/README_zh.md
https://github.com/xssed/owlcache/blob/master/doc/README_zh.md
本文不做详细的源码讲解,因为此开源代码里的注释,非常详细。
只是为了讲解下程序设计的方法。
这里使用了v0.2.5版本
其代码目录也是非常的清晰
每一个目录,就是一个模块。名称与功能都非常清晰。
github.com/xssed/owlcache/owlcache.go
首先看看main函数
import ( "runtime" owlconfig "github.com/xssed/owlcache/config" owljob "github.com/xssed/owlcache/job" owllog "github.com/xssed/owlcache/log" owlnetwork "github.com/xssed/owlcache/network" owlsystem "github.com/xssed/owlcache/system" ) // _ _ // _____ _| | ___ __ _ ___| |__ ___ // / _ \ \ /\ / / |/ __/ _` |/ __| '_ \ / _ \ // | (_) \ V V /| | (_| (_| | (__| | | | __/ // \___/ \_/\_/ |_|\___\__,_|\___|_| |_|\___| // //If you have any questions,Please contact us: xsser@xsser.cc //Project Home:https://github.com/xssed/owlcache func main() {
// 使用多核 cpu
runtime . GOMAXPROCS ( runtime . NumCPU ())
// 欢迎信息
owlsystem . DosSayHello ()
// 初始化配置
owlconfig . ConfigInit ()
// 初始化日志记录
owllog . LogInit ()
// 初始化数据库服务 , 核心组件
owlnetwork . BaseCacheDBInit ()
// 定时任务服务
owljob . JobInit ()
// 捕获程序正常退出操作 ctrl+c
owlsystem . OnExit ()
}
main函数的做用,就是开天辟地,混沌初开。将各个模块按照顺序进行初始化或者启动。
其代码模块组织架构为
一共可以分为四层:(从下往上)
1、基础模块,各个模块完全独立。
tools,最底层的模块,或者甚至都不能称作是模块。是一个 工具 集。 github.com/xssed/owlcache/tools/function.go
config是读取配置模块。功能简单直接。 github.com/xssed/owlcache/config/config.go
syste m,程序启动页或欢迎页,再加上捕获程序退出操作。不参与业务功能。github.com/xssed/owlcache/system/sysinfo.go
2、基础功能模块,依赖基础模块。此层,开始慢慢也业务有一定的关系。但模块功能还是相对独立。
group,封装了http的Request和Response的处理。github.com/xssed/owlcache/group
cache,封装的是数据存储模块。/Users/gonghaohua/bsy/src/github.com/xssed/owlcache/cache
log,日志模块。github.com/xssed/owlcache/log。
3、网络层,相对负责,单独成为一个层。
github.com/xssed/owlcache/network
封装了tcp,http,httpclient模块。
看下其中最重要的初始化。
//创建一个全局的缓存DB var BaseCacheDB *cache.BaseCache //创建一个全局的身份认证缓存 var BaseAuth *cache.BaseCache //创建一个全局的服务器集群信息存储列表 var ServerGroupList *group.Servergroup //创建一个全局的HttpClient客户端 var HttpClient *httpclient.OwlClient func BaseCacheDBInit() { //执行步骤信息 fmt.Println("owlcache database running...") //创建DB BaseCacheDB = cache.NewCache("owlcache") //加载之前缓存本地的DB数据 BaseCacheDB.LoadFromFile(owlconfig.OwlConfigModel.DBfile + "owlcache.db") //身份认证数据,所有客户端身份认证都在这里有效期60分钟 //存储内容: key:tonken value:"uuid" BaseAuth = cache.NewCache("Auth") //加载之前缓存本地的DB数据 BaseAuth.LoadFromFile(owlconfig.OwlConfigModel.DBfile + "auth.db") //初始化服务器集群信息存储列表 ServerGroupList = group.NewServergroup() //加载之前缓存本地的服务器集群信息 ServerGroupList.LoadFromFile(owlconfig.OwlConfigModel.DBfile, "server_group_config.json") //初始化HttpClient客户端 HttpClient = httpclient.NewOwlClient() //启动tcp服务 //检查是否开启TCP服务。默认为开启。 if owlconfig.OwlConfigModel.CloseTcp == "1" { fmt.Println("owlcache tcp server running...") go stratTCP() } else if owlconfig.OwlConfigModel.CloseTcp == "0" { owllog.OwlLogRun.Info("The configuration file does not open the TCP service.") } else { //检测到配置书写异常强制退出 owllog.OwlLogRun.Fatal(ErrorCloseTcp) } //启动http服务 fmt.Println("owlcache http server running...") go stratHTTP() }
4、业务层。定期执行的业务功能。
github.com/xssed/owlcache/job/job.go
func JobInit() { fmt.Println("owlcache job running...") //DB数据备份 DataBackup() //Auth数据备份 DataAuthBackup() //定期清理DB中过期的数据 ClearExpireData() //服务器集群信息数据定期备份 ServerListBackup() }
总结:owlcache整体代码模块的设计,分层清晰。模块之间的依赖关系简单、清晰。
注:owlcache代码中的注释非常清晰,有了功能架构图和代码模块架构图,再结合代码注释,快速理解代码,并做代码维护,是非常容易的。
龚浩华
月牙寂道长
qq:29185807
2019年06月19日
如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。
第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。