Go语言GoFrame框架之二:模版生成的web服务示例分析

Go语言GoFrame框架之二:模版生成的web服务示例分析

  • 一、需要用到的的组件清单:
  • 二、目录结构
  • 三、启动流程
  • 四、import

一、需要用到的的组件清单:

  1. gcmd(属于goframe)
  2. gctx(属于goframe)
  3. g(属于goframe)
  4. ghttp(属于goframe)
  5. Context(属于go)
  6. error(属于go)
    通过模版的命令(gf init demo -u)生成示例。相关组件的各个功能可以在官网https://goframe.org/pages/viewpage.action?pageId=1114119查看。

二、目录结构

  • api(目录:对外接口,也就是常说的前后端接口定义)
    • v1(目录:版本,这里以v1定义为第一版本)
      • hello.go(文件:hello,定义了请求HelloReq和返回HelloRes结构体,主要是给controller/hello.go的Hello实例下的Hello函数使用,接口的绑定是通过ghttp.Server的BindHandler或ghttp.RouterGroup的Bind等来执行但是最终都是由ghttp_server_router文件里的func (s *Server) setHandler(ctx context.Context, in setHandlerInput) {…}方法完成,底层会把HelloReq下的path关联到请求接口路由中)
  • hack(目录:开发工具,自已编写的脚本存放)
    • config.yaml (文件:CLI工具的配置)
  • internal(目录:内部逻辑,提供业务逻辑存放)
    • cmd(目录:入口指令,命令行管理目录。可以管理维护多个命令行)
      • cmd.go (文件:命令行管理,定义了gcmd.Command的Main实例,实例通过Func接收启动上下文context.Context和启动命令参数gcmd.Parser)
    • consts(目录:常量定义)
      • consts.go(文件:提供常量方式定义)
    • controller(目录: 接口处理,接收/解析用户输入参数的入口/接口层)
      • hello.go(文件:定义了cHello结构体的Hello实例,还有一个Hello函数接收了context.Context和v1.HelloReq参数,函数返回 v1.HelloRes 和 error 这里注意的是ghttp.RouterGroup以接收v1.HelloReq参数来决定前后端接口请求的绑定,如果接收v1.HelloReq参数相同有两个不同名的函数就报无法解释错误)
    • dao(目录:数据访问,数据访问对象,这是一层抽象对象,用于和底层数据库交互,仅包含最基础的 CURD 方法)
    • logic(目录:业务封装,业务逻辑封装管理,项目中最复杂的部分)
    • model(目录:结构模型,数据结构管理模块,管理数据实体对象,以及输入与输出数据结构定义。)
      • do(目录:领域对象,用于dao数据操作中业务模型与实例模型转换,由工具维护,用户不能修改
      • entity(目录:数据模型,数据模型是模型与数据集合的一对一关系,由工具维护,用户不能修改
    • packed(目录:打包目录,用于打包相关的文件存放)
    • service(目录:业务接口,用于业务模块解耦的接口定义层。具体的接口实现在logic中进行注入)
  • manifest(目录:交付清单,提供程序编译、部署、运行、配置 使用)
    • config(目录:配置管理,提供配置文件存放)
    • deploy(目录:部署相关,可以通过Kubernetes集群化部署的Yaml模板修改)
    • docker(目录:镜像相关,提供镜像相关依赖文件,脚本文件存放)
  • resource(目录:静态资源,打包发布(手动发布要把打出的静态资源放在运行程序的 同一目录层级)和运行时用到)
    • i18n(目录:国际化,提供国际化多语言文件存放)

    • public(目录:公共资源,提供对外的资源文件存放)

      • html(目录:网站,提供网站文件存放)
      • plugin(目录:脚本,提供第三方脚本存放)
      • resource(目录:资源,可以存放css,image,js等)
        - css(目录:css,提供css存放)
        - image(目录:image,提供image存放)
        - js(目录:js,提供js存放)
    • template(目录:模版资源,提供模版文件存放)

  • utility(目录:公用功能,提供公用的功能文件存放)
  • go.mod(特别文件:提供go和goframe的更新的依赖管理,可以手动修改)
  • main.go(文件:程序入口,主要是main包main函数)
  • Makefile(文件:提供了Terminal终端机make命令的 cli,dao,service,image,image.push,deploy功能)
  • README.MD(文件:主要介绍Makefile文件的功能)
    目录结构只是为了项看起来清晰易懂减少维护成本,你也可以自已定义,但是最好和官网的一样,这样更符合go和goframe的框架思想。

三、启动流程

  1. 生成一个gctx上下文实例并传给,入口main.go文件的main函数执行cmd.Main.Run
代码:cmd.Main.Run(gctx.New()) 
  1. 执行cmd.Main实例的Func回调并带上下文context.Context和命令行参数gcmd.Parser 两个参数
代码:	Main = gcmd.Command{
		Name:  "main",
		Usage: "main",
		Brief: "start http server",
		Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { ... },}
  1. 通过g.Server()生成单例的ghttp.Server
代码:s := g.Server()
  1. ghttp.Server.Group生成一个路由组ghttp.RouterGroup
  2. 路由组ghttp.RouterGroup生成结束后执行回调并带入ghttp.RouterGroup参数
代码:s.Group("/", func(group *ghttp.RouterGroup) {}
  1. ghttp.RouterGroup实例group注册了一个ghttp.MiddlewareHandlerResponse中间件
代码:group.Middleware(ghttp.MiddlewareHandlerResponse)
  1. ghttp.RouterGroup实例group绑定controller.Hello实例
代码:group.Bind(
				controller.Hello,
			)
  1. 并根据controller.Hello实例方法的参数中的path关联相应的前后端接口(示例关联了v1/hello.go中的HelloReq)
	代码:
var ( Hello = cHello{})
type cHello struct{}
func (c *cHello) Hello(ctx context.Context, req *v1.HelloReq) (res *v1.HelloRes, err error) {
	g.RequestFromCtx(ctx).Response.Writeln("Hello World!")
	return
}
  1. ghttp开启监听
  2. ghttp回调绑定的controller.Hello实例中Hello函数
  3. 最后通过g.RequestFromCtx(ctx).Response.Writeln(“Hello World!”)返回"Hello World!"字符串给前端
代码:g.RequestFromCtx(ctx).Response.Writeln("Hello World!")

四、import

import引入的是package定义的包,代码里使用包里的变量和函数要以包名开始

你可能感兴趣的:(服务器,前端,golang,linux)