我正在参与创作者训练营第6期,点击了解活动概况

GoZero结构能够作为一个单体服务的开发结构。与大多数依据proto或许thrift界说的接口描绘文件生成根本代码的结构(包含GoZero能够经过proto生成代码)相似,GoZero为RESTAPI也供给了这种生成服务。

它需求一个所谓的API文件,为了便利咱们的运用,他有在VSCode和Intelij上供给名为Goctl的插件用于完成辅佐操作和代码高亮。这种API文件格式相似于Go言语的语法,详细示例就不给出了。其间能够界说API交互的数据结构路由端点endpoint(支撑path参数),恳求方法。

依据这些界说,运用官方供给的工具,能够生成一般意义上的处理器层(有生成的逻辑)和业务逻辑层(空逻辑),类型界说,以及入口文件,默许的配置文件。

GoZero在规划上把业务逻辑层规划成如下的方式:

// 代码有省略,仅示意
Alogic struct{}
func(...) xxxxxlogic(context,req) resp{}

业务逻辑层只是和恳求数据和返回的数据,这样和处理器层降低了耦合程度,这是优点,业务逻辑就专心处理业务逻辑,依据恳求的那些参数生成一个相应目标,坚持简略的职责。但是这也意味着不能够直接影响相应的HTTP恳求目标和相应目标,这会给某些场景带来一些不方便,暂且不表。

处理器层只需求把数据转换成json数据就行,并且保证类型安全。这其实是个很强的假定,HTTP给恳求供给了太多的东西,有很强的灵活性,而这儿的REST API把参数限制了,姑且也能算作是KISS的体现吧。处理器层算是GoZero供给的路由结构,因而也供给了中间件接口,能够做一些hook处理。

类型纯粹是一些界说,配置则是依据yaml,相对还算友爱。

再来扒一扒它的缺点,为了让每次都能拿到共享一些数据目标,运用了一个自界说的Context上下文目标,并且每层都依靠他,耦合稍微有点重。
除此之外,作为作为API服务,文件传输是必备的,GoZero在上传文件这儿并不是很友爱,相同的还有用它完成websocket功能也不友爱。因为它限制了数据结构。官方给的websocket完成,便是把逻辑层和处理器层魔改,传给它恳求和呼应流目标。同理上传/下载文件官方给的示例也是魔改两层,用本来的呼应或许恳求流目标作为传入/传出参数。这两种状况最大的问题在于他要魔改生成的代码,而生成的代码有时候需求改动从头生成会覆盖掉魔改部分。

总而言之,关于大部分状况来说,能够让人省掉很多的工作。而关于少部分的状况,需求做一点魔改,但是这少部分状况究竟也确实不太一样,能够了解。