分层服务基本架构

举报
码乐 发表于 2024/02/14 07:24:32 2024/02/14
【摘要】 各司其职,清清楚楚。 2.0 服务配置和日志处理配置的使用,对于小型项目,我们把配置写入一个json或yaml文件即可,再通过某些键值管理工具可以很方便管理。类似单点的viper和关键数据的分布式系统etcd,可靠的键值存储服务,提供了管理页面和丰富指令支持。 对于多个集群键的分布式系统。它们在网络间优雅地处理主节点的选举。大批量的日志通常很难处理和分析,常用的方式有第三方包 logrus...
	各司其职,清清楚楚。

2.0 服务配置和日志处理

配置的使用,对于小型项目,我们把配置写入一个json或yaml文件即可,再通过某些键值管理工具可以很方便管理。

类似单点的viper和关键数据的分布式系统etcd,可靠的键值存储服务,提供了管理页面和丰富指令支持。 对于多个集群键的分布式系统。它们在网络间优雅地处理主节点的选举。

大批量的日志通常很难处理和分析,常用的方式有第三方包 logrus,zap, EBK,ELK 架构等等。
自我内建方式可以通过log 内建包自定义,或将fmt的输出内容从控制 stdout 导入到指定文件。

不同大小的项目选择以上不同的类型服务,在下一节,我们可以具体讨论一些。
这一节我们关注项目如何分离。

2.1 项目基础结构分离

我们将在model层预定我们需要的模型,比如服务引擎,ServerEngine 它将被服务和路由分组用到

	type ServerEngine struct {
		*gin.Engine
	}

作为Server的 GroupServer的构造器 最后返回对象将被服务调用

  func NewServers(e *gin.Engine) *ServerEngine {
		s := &ServerEngine{Engine: MakeNewEngine()}
		if e != nil {
			s.Engine = e
		}
		return s
	}

并且预定基础返回结构体,动物园信息。注意对齐。

type ZoosInfo struct {
	ID           string `  db:"id" json:"id" form:"id"`
	Title        string `  db:"title" json:"title" form:"title"`
	Url          string `  db:"url" json:"url" form:"url"`
	Introduction string `  db:"introduction"  json:"introduction"   form:"introduction"`
	CreatedAt    int64  `  db:"created_at" json:"created_at" form:"created_at"`
	Founded      int64  `db:"founded" json:"founded"  form:"founded"`
	Price        int64  `db:"price" json:"price"  form:"price"`
}

2.2 项目基础结构分离:视图

然后在视图中实现该模型的功能,listZoos 函数将在服务内部搜索zoo 的对应信息,并以预期的结构化格式返回数据,获取所有zoo信息列表

type zoos struct{}

func (that *zoos) List(page, pageSize int, ex map[string]string) (*service.ZoosDatas, error) {
	zood := listZoos(page, pageSize, ex)
	return zood, nil
}

并且此函数通过接口的方式向控制层提供服务

	type Handler interface {
	 
		//返回zoo信息列表
		List(page, pageSize int, ex map[string]string) (*service.ZoosDatas, error)
	 
	}

最后在基础服务层级被App应用实现

  type ZooApp struct {
		Zoos zoos.Handler
	}

2.3 项目基础结构分离:应用接口

并且在接口中实现对外服务,在api实现中有很多内容可以做,比如使用哪一个方式校验参数,判定字符,数字,参数合法性校验等等。

这里可以只做基本的校验,helpers.VailFilerLetter 函数将帮助我们做这个事情,失败则返回用户校验失败。

同时使用 helpers.JSONs 去帮助我们实现序列化输出。

func (zoo *zoosApi) List(ctx *gin.Context) { 

    page = ctx.Param("page")
    pageSize = ctx.Param("page_size")

    if !helpers.VailFilerLetter(page) {
    	helpers.JSONs(ctx, http.StatusBadRequest, gin.H{"message": "error param", "data": page})
    	return 
    }
    if !helpers.VailFilerLetter(pageSize) {
    	helpers.JSONs(ctx, http.StatusBadRequest, gin.H{"message": "error param", "data": pageSize})
    	return 
    }

	datas, err := zooService.Zoos.List(page , pageSize, nil)
	if err != nil {
		helpers.JSONs(ctx, http.StatusNoContent, gin.H{"message": "failed", "data": err})
		return
	}

	helpers.JSONs(ctx, http.StatusOK, gin.H{"message": "success", "data": datas, "status": 200})

}

2.4 整体结构

类似之前的,这个最后形式如下

	Mode                 LastWriteTime         Length Name
	----                 -------------         ------ ----
controler  接口 
	d-----                7:25                services    # 初始化服务等
	d-----                6:36                routers     # 路由封装
	d-----                7:44                apis        # 对外服务接口

views   功能视图
	d-----                7:56                systems     # 系统功能封装 
	 
Model层   模型
	d-----                4:25                models      # 模型
            d-----                9:46                database    # 连接基础服务工具
	d-----                7:39                logs        # 日志路径
	d-----                9:46                configs     # 配置
	d-----               14:16                qas         # 质检平台
	-a----               10:35                config.yaml # 全局配置 
	-a----               10:13                main.go     # 服务入口
	-a----               10:32                README.md

3 小结

分层结构适合tcp流式服务,它把功能划分清楚,对应七层模型,去分别实现。不仅仅是模型视图控制层。

高内聚低耦合,范围和区域区分,在网络路由协议中有很明显的体现,比如有边际路由协议,也有网际最短路径优先,也有不同的选举方法,在应用软件,和web应用层得到实现。在新的组织方法DDD中,这些分离的思想也继续在发挥作用。

因此可以说,这些技术的实现都是相互自相似的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。