内容简介: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日
如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。
第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Google软件测试之道
James A. Whittaker、Jason Arbon、Jeff Carollo / 黄利、李中杰、薛明 / 人民邮电出版社 / 2013-10 / 59.00元
每天,google都要测试和发布数百万个源文件、亿万行的代码。数以亿计的构建动作会触发几百万次的自动化测试,并在好几十万个浏览器实例上执行。面对这些看似不可能完成的任务,谷歌是如何测试的呢? 《google软件测试之道》从内部视角告诉你这个世界上知名的互联网公司是如何应对21世纪软件测试的独特挑战的。《google软件测试之道》抓住了google做测试的本质,抓住了google测试这个时代最......一起来看看 《Google软件测试之道》 这本书的介绍吧!