怎么样的go程序设计风格好-开源代码owlcache分析有感

栏目: 软件资讯 · 发布时间: 4年前

内容简介:golang程序设计,怎么样的风格比较好?我个人一直推荐的是Aop方式来做golang程序设计。可见谈谈基于Go的Aop设计在golang程序中,模块的设计,可以通过用架构设计的模式方法来做程序设计。利用这种思想方式,去做程序设计,那么程序的耦合性将很容易降低到最低。

golang程序设计,怎么样的风格比较好?我个人一直推荐的是Aop方式来做golang程序设计。可见谈谈基于 Go 的Aop设计

在golang程序中,模块的设计,可以通过用架构设计的模式方法来做程序设计。 通过对比, 把golang看做一个平台,go runtime对应对os kernel。那么程序模块的设计,就完全可以对应于多个进程在同一台机器上进行合作运行。

利用这种思想方式,去做程序设计,那么程序的耦合性将很容易降低到最低。

怎么样的go程序设计风格好-开源代码owlcache分析有感 怎么样的go程序设计风格好-开源代码owlcache分析有感

说到这里,对于单模块的设计,通过角色的划分(或者服务功能来划分),很容易将整个程序的模块划分清楚。

当模块数量不多的时候,模块的组织结构也会很简单。

但当模块数量较多时,特别是模块之间的互相依赖关系复杂的时候,这个时候,虽然单个模块的功能简单,但整体的复杂性会成指数性增加。

那么这里就上升到架构的设计。而架构的设计有很多。有分层架构,有扁平化架构。把模块看做是角色,看做是人,那么模块如何组织,其实就是架构组织。在《架构即未来》这本书中,非常详细的讲解了架构组织。

程序架构,组织架构,这些都是通用的。

那么要减少程序的复杂性,又要保留模块组织的功能和灵活性。这里面没有说哪个架构模型是万能的。架构组织过程中,都是一个中庸平衡的过程。

那么在golang程序设计中,大多数情况下,可以通过混合架构方式来做设计。

首先,分层设计。通过将模块角色或功能,特别是依赖关系,划分层次。几个原则:

1、最好,不做跨层依赖和调用

2、上层依赖下层,下层不依赖上层

3、同一层中,模块数量不要过多。

其次,扁平化设计。在同一个分层中,通过组织角色划分,将几个共同协作的模块,划分成一个组织角色。 几个原则:

1、一个组织,可以包含少数几个模块。这几个模块,依赖调用,可以适当放开限制。

2、组织与组织之间,通过开放接口、api等方式,提供功能。组织之间的依赖,以及调用,尽量少。

3、若组织之间依赖关系过多,则,可以考虑将其增加分层设计。

总结下:

1、golang提供的是一种类似os kernel的环境,让我们可以非常简单的做模块化设计。

2、模块设计之后,将模块化具象化成角色(人+职能

3、模块之间的关系,又可以上升到组织结构,可以通过架构组织方式去思考。将模块化之间的组织关系具象化为角色与角色之间的关系设计。

大道至简,你以为你在写代码,其实你是在做上帝。生活中,我们生活在这样的,那样的组织架构中。而代码,在你手里,你可以设计模块的组织架构。让其在你的设想中运行。

业余时间,经常会看一些开源代码。一直都没有碰见我认为比较适合做案例的真正代码。我想万千世界中,肯定会有志同道合之人。有幸看到owlcache开源代码。

owlcache 是一款由Go编写的轻量级、高性能、无中心分布式的Key/Value内存缓存型的数据共享应用(一定场景下可以作为轻量型数据库来使用)。github.com/xssed/owlcache

其功能架构设计如下

怎么样的go程序设计风格好-开源代码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版本

怎么样的go程序设计风格好-开源代码owlcache分析有感

其代码目录也是非常的清晰

怎么样的go程序设计风格好-开源代码owlcache分析有感

每一个目录,就是一个模块。名称与功能都非常清晰。

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函数的做用,就是开天辟地,混沌初开。将各个模块按照顺序进行初始化或者启动。

其代码模块组织架构为

怎么样的go程序设计风格好-开源代码owlcache分析有感

一共可以分为四层:(从下往上)

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

怎么样的go程序设计风格好-开源代码owlcache分析有感

封装了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日

如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

怎么样的go程序设计风格好-开源代码owlcache分析有感


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

重来

重来

[美] 贾森·弗里德、[丹] 戴维·海涅迈尔·汉森 / 李瑜偲 / 中信出版社 / 2010-10 / 36.00元

大多数的企业管理的书籍都会告诉你:制定商业计划、分析竞争形势、寻找投资人等等。如果你要找的是那样的书,那么把这本书放回书架吧。 这本书呈现的是一种更好、更简单的经商成功之道。读完这本书,你就会明白为什么计划实际上百害而无一益,为什么你不需要外界投资人,为什么将竞争视而不见反倒会发展得更好。事实是你所需要的比你想象的少得多。你不必成为工作狂,你不必大量招兵买马,你不必把时间浪费在案头工作和会议......一起来看看 《重来》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具