『项目结构与框架:Go』

gopher-1.png

gopher-one.png

大家好,我叫谢伟,是一名程序员。

今天和大家谈谈项目的组织结构。在这之前的文章,我给大家推荐了一个适合爬虫的项目组织结构:

workspace
    download
        download.go
    engine
        engine.go
        objects.go
    infra
        utils.go
    main
        main.go
    parse
        github
            github_trending_parse.go

整个项目设计成下面几块:

  • download : 下载器,获取网页源代码
  • engine: 调度层, 进行爬虫任务调度、抓取信息的定义
  • infra: 基础设施层,项目辅助功能
  • main: 主函数入口
  • parse:解析层,进行网页信息解析

这样把逻辑顺序理顺了,写代码的逻辑顺序也理顺了。知道什么地方做什么。之所以对项目进行良好的组织,一方面是便于理清逻辑顺序,一方面是便于项目的可扩展性,低耦合性。

什么意思呢。

打个比方,你现在的解析层是解析的是github 网站的源代码,如果将数据和业务等混杂在一起,以后可能你换一个网站抓取,代码就需要改动。这样的强耦合性失去了代码的可扩展,完全不适合扩展。

好,上面的例子是我借鉴之后形成的专门给爬虫定下的框架。

这个例子可能没有说服力。

再举个例子:beego 是著名的 HTTP 框架。

整体设计架构分为八大独立的模块构成,高度解耦。

  • cache: 缓存逻辑
  • config:解析配置文件
  • context:上下文层
  • httplibs: 网络模块
  • logs: 日志模块
  • orm: 数据库orm 模块
  • session: 持久化模块
  • toolbox: 工具模块

architecture.png

└─beego
    ├─.github
    ├─cache
    │  ├─memcache
    │  ├─redis
    │  └─ssdb
    ├─config
    │  ├─env
    │  ├─xml
    │  └─yaml
    ├─context
    │  └─param
    ├─grace
    ├─httplib
    ├─logs
    │  ├─alils
    │  └─es
    ├─migration
    ├─orm
    ├─plugins
    │  ├─apiauth
    │  ├─auth
    │  ├─authz
    │  └─cors
    ├─session
    │  ├─couchbase
    │  ├─ledis
    │  ├─memcache
    │  ├─mysql
    │  ├─postgres
    │  ├─redis
    │  └─ssdb
    ├─swagger
    ├─testing
    ├─toolbox
    ├─utils
    │  ├─captcha
    │  ├─pagination
    │  └─testdata
    └─validation

这些独立的模块最后反应在项目组织上就是一个个相互独立的文件夹,各个文件夹下完成相应的任务。

所以,我们需要打造属于自己的项目框架(项目组织结构)。当然需要按场景来,比如,这是一个 web 项目,你还傻乎乎的按照上文提的爬虫的项目组织进行组织代码。

相信你是孤独的

我司技术教练正在推进领域驱动设计(Domain-Driven-Design DDD),强调将分析模型和领域模型当做一个不可分割的实体进行代码梳理和设计。

先讲述下领域驱动设计的层结构:

  • User Interface : 负责向用户展现信息,并且会解析用户行为,即常说的展现层。
  • Application Layer: 应用层没有任何的业务逻辑代码,它很简单,它主要为程序提供任务处理。
  • Domain Layer:这一层包含有关领域的信息,是业务的核心,领域模型的状态都直接或间接(持久化至数据库)存储在这一层。
  • Infrastructure Layer:为其他层提供底层依赖操作

我认识不是太深刻。

在此还是分享下提供restful api 服务的项目组织结构,希望对大家有帮助,而且这个项目结构会是我今后主推的代码框架。直到能够熟练的使用。

workspace
    app
    domain
    infra
    main
    scheduler
          scheduler.go
    ui
       api-server
           api_server.go
           router_function.go
       parse
           parse

所以:

    ui
       api-server
           api_server.go
           router_function.go
       parse
           parse

不难发现,对于一个 restful api 服务,UI 层便是 http 的那些东西、和用户解析数据的那些东西

app

app 层是应用层:比如说 restful api 需要操作的是一个学生管理系统,那么App 便是和 学生、学校有关的一些应用

domain

domain 层:领域层,学生管理系统,那么领域表示学生、学校、知识、课本等这些属于该一领域的知识集;PaaS 系统,那么领域表示组件、安装部署、场景等属于该一领域的知识集

infra

infra 基础设施层:为其他层提供服务,比如字符串操作、比如排序操作、比如数据清洗操作等

scheduler

scheduler 调度层,UI 层API 和 APP 实体存在一些调度关系,都交于scheduler 层进行操作。

main

主函数入口,启动 restful api 服务等。

以上就是我想本节分享的关于项目结构和组织的两个框架:1. 一个适用于爬虫 2. 一个适用restful api 服务

再会,我是谢伟。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ATYUN订阅号

【业界】iOS Bug解决办法:如何防止Siri读出隐藏的通知

AiTechYun 编辑:yuxiangyu ? 尽管苹果尚未针对iOS错误展开修复,使得Siri能够读出隐藏的锁屏通知,但以下方法可以解决目前的安全漏洞。 ...

35140
来自专栏顾宇的研习笔记

Serverless 微服务架构案例无服务器架构 (Serverless Architectures) 简介 AWS Lambda 的编程模型Amazon API Gateway + AWS Lamb

Serverless 架构最早可以追溯到 Ken Fromm 发表的文章《Why The Future Of Software And Apps Is Serv...

26810
来自专栏架构师之路

微服务架构多“微”才合适?

前情提要:互联网架构为什么要做服务化? 一、互联网架构为什么要进行服务化-总结 上一篇和大伙交流了一下,随着数据量、并发量、业务复杂度的增长,互联网架构会出现以...

40160
来自专栏Petrichor的专栏

Python核心团队计划2020年停止支持Python2

Python 核心团队计划在 2020 年停止支持 Python 2。NumPy 自 2010 年以来同时并行支持 Python 2 和 Python 3,但是...

17550
来自专栏北京马哥教育

运维CMDB建设思路

? ? 在我们日常的运维工作中,面对着大量的基础设施和软件服务,该如何管理?这个管理的原则又是什么?粒度该如何控制?我们是否可以建立一个统一的标准模...

75690
来自专栏沃趣科技

降低保险行业TCO成本最好的方式是……

保险行业升级测试工作较多,此为行业背景。从客户甲了解到,他所在的DBA团队一方面要承担数据库日常维护工作,另一方面也要为业务部门提供测试数据库。除去生产环境的日...

509140
来自专栏架构师之路

朋友圈微博feed流,推拉实践

上一篇《feed流拉取,读扩散,究竟是啥?》关于feed流的拉取还是推送,只写了一半“拉取”,今天把另一半“推送”(写扩散)的坑填完。

33930
来自专栏京东技术

测试工程师做好缺陷预防,居然可以避免50%的错误!

21970
来自专栏章鱼的慢慢技术路

游戏服务器架构概要

方案:切分xysvr,让多个scene分别服务于一些用户,world负责拉取数据。并协调控制多scene。

58220
来自专栏DevOps时代的专栏

什么是服务网格(Service Mesh)?为什么需要使用它?

在过去的一年中,服务网格(Service Mesh)已经演变成为云原生堆栈的重要组成部分。像 Paypal,Lyft,Ticketmaster 和 Credit...

84160

扫码关注云+社区

领取腾讯云代金券