分层服务基本架构
各司其职,清清楚楚。
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中,这些分离的思想也继续在发挥作用。
因此可以说,这些技术的实现都是相互自相似的。
- 点赞
- 收藏
- 关注作者
评论(0)