iris mvc + xorm,Go Web站点开发。(含完整源码)

前言

简要说说开发一个go web站点,咱们须要掌握哪些技能?准备哪些技术点?css

一、web框架

一个好的框架能提高你的开发效率,也有益于团队合做。iris自称是最快的goweb框架,快不快咱们要测试了才知道,可是看了支撑对比,iris目前是最丰富的。html

二、数据库操做

咱们选用mysql,关系型数据库的主流。另外要选择一个orm框架,对于大多数的业务开发,手写sql语句的方式未免太怀旧了,这里推荐xorm,他提供了自动映射的工具。前端

三、缓存数据库

非关系型缓存数据库,对于一个合格的站点,缓存必不可少,能减小数据库压力,提升访问速度。咱们选用redis。mysql

四、负载均衡

虽然go天生支持高并发,可是随着网站访问量的不断增高,单台服务器始终会成为瓶颈。另外为了站点的高可用,免不了分布式部署。负载均衡咱们选用nginx作反向代理服务器。nginx

本文重点

一、本文重点介绍web框架内容,使用iris开发一个mvc站点。
二、数据库操做:《golang 使用xorm操做mysql》
三、缓存数据库:《golang 操做redis5大数据类型》
四、关于nginx的部署会另起篇幅。git

iris 安装

github地址github

github.com/kataras/iris

若是直接使用go get 命名安装会有部分包下载不下来,咱们建议使用代理。golang

1.打开CMD命令提示框,设置临时环境变量web

set GO111MODULE=on

set GOPROXY=https://goproxy.io

二、再次执行ajax

go get -v -u github.com/kataras/iris

安装完成后,GOPATH的src目录下会多出github.comkatarasiris文件夹,就表明下载成功了。
iris下载的问题确实使人头疼。若是运行过程当中有缺乏什么零散的bao,能够直接访问github.com地址,手动下载后放到github.com文件夹下的对应目录.

建立iris项目结构

目录是参照 github.com/kataras/iris/_examples 下的例子,根据实用性,作了些调整。

demo.book.com
—— conf     //配置相关的放在此目录
    —— sysconf.go       //配置读取代码
    —— web.config       //自定义文本配置
—— dao
    —— book_dao.go      //book表的xorm操做代码
—— dbsource
    —— dbsource.go      //数据引擎,单例模式
—— log
    —— 2020
        —— 04
            —— 2020-04-12.log       //站点日志,按日期存储
—— models
    —— goxorm           //非站点使用,用于生成映射类的工具
    —— book_tb.go       //xorm根据数据库自动生成的映射类
—— services
    —— book_service.go      //业务操做类,调用的是book_dao.go,能够根据实际业务增长额外代码,例如从缓存读取数据等。
—— web
    —— content          //存放站点静态资源,css、image、js等
        —— mould
            —— book  
    —— controllers
        —— BookController.go        //书城业务控制器
        —— DemoController.go        //一些辅助demo控制器,测试用
    —— views            //视图代码
        —— book
            —— home.html
        —— shared
            —— bookLayout.html      //书城模板页
—— main.go              //主函数入口

要点说明:

一、web.config,文本配置文件

站点启用端口,数据库连接配置等,放在web.config中。go的配置文件的读取还有一些专门的开源库,例如toml、yaml等。但我我的以为仍是这种key=value的设置简单易用。web.config其实就算是一个文本文件,经过sysconf.go来读取后存到全局的SysConfMap里。若是站点的自定义文本配置有修改,能够调用sysconf.ReLoad()来从新读取,这样不须要重启站点便可生效。

//服务配置
domain =
port = 8082

//数据库配置
dbuser = root
dbpwd = 112233
dbhost = 127.0.0.1
dbport = 3305
dbname = mygo
二、main.go,主函数

main是程序的入口,主要作了一些iris服务监听启用前的设置,例如日志记录方式、全局错误捕获、视图模板注册、静态文件路径注册、路由器注册等。
全局错误捕获是自定义了一个customRecover中间件,recover恐慌,把错误记录下来后,再继续下一步ctx.Next()

三、dao 数据库操做类

book_dao.go数据操做,提供了一些经常使用的例子:获取单条数据、获取列表、获取分页列表、删除数据、更新数据、新增数据,都是对xrom的使用。业务层不会直接调用dao,而是经过services来调用dao,例如在读取mysql以前,先在redis查询是否存在数据,若是存在直接返回,不存在则读取mysql后再存到redis里。这样明确的业务分层便于从此业务的扩展。关于redis的使用,能够参考前面提到的文章,本文再也不赘述。

四、BookController,业务控制器

BookController包含了2个方法

一个是首页视图的访问。

访问地址 127.0.0.1:8082/book

func (c *BookController) Get() mvc.Result {
    service := services.NewBookService()
    list := service.GetList("", "ID asc", 0)
    return mvc.View{
        Name: "book/home.html",
        Data: iris.Map{
            "Title":  "首页-" + conf.SysConfMap["port"],
            "List":   list,
            "Server": conf.SysConfMap["port"],
        },
        Layout: "shared/bookLayout.html",
    }
}

代码作了很简单的事情,获取book_tb数据列表展现。返回视图地址book/home.htmlconf.SysConfMap["port"]是获取站点监听的端口,展现到首页是为了搭建负载均衡的时候直观的能够看到访问到哪一台服务器。

另外一个是搜索数据接口。

首页输入搜索关键字经过ajax异步调用搜索接口,返回json数据,用js展现搜索结果。
访问地址 127.0.0.1:8082/book/ajaxbooks?key=go

func (c *BookController) GetAjaxbooks() {
    //获取url参数
    key := c.Ctx.URLParam("key")

    service := services.NewBookService()
    list := service.GetList(" bookName like '%"+key+"%'", "ID asc", 0)

    c.Ctx.JSON(list)
}

关于访问地址呢,mvc为咱们设定了规则,Get是表示接收请求的方式,咱们能够把方法名写成PostAjaxbooks,那就须要经过post方式请求。后面的Ajaxbooks就是实际的路由地址,用小写访问就是/book/ajaxbooks

五、views,数据视图

数据视图必须先通过main函数的注册才可以使用,否则会报找不到视图的异常。
bookLauout.html是书城的模板,里面包含前端共用的部分,例如总体的html代码,底部公用导航等。主内容用{{ yield }}做为占位符。

六、项目源码

项目已经发布在github上

https://github.com/imleaf/demo.book.com

book_tb数据表的建立语句

CREATE TABLE `book_tb` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `BookName` varchar(100) DEFAULT '' COMMENT '书名',
  `State` int(11) DEFAULT '0' COMMENT '状态',
  `Author` varchar(50) DEFAULT '' COMMENT '做者',
  `Press` varchar(100) DEFAULT '' COMMENT '出版社',
  `PublishTime` datetime DEFAULT NULL COMMENT '出版时间',
  `BookImage` varchar(300) DEFAULT '' COMMENT '图书封面',
  `Price` decimal(10,2) DEFAULT '0.00' COMMENT '售价',
  `Introduction` varchar(300) DEFAULT '' COMMENT '简介',
  `UpdateTime` datetime DEFAULT NULL,
  `AddTime` datetime DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COMMENT='图书表';

页面演示

首页
image.png

搜索结果
image.png

总结

demo.book.com项目为你们举例了goweb开发的开发模式和框架结构,若是你作过web开发,相信依葫芦画瓢,很容易开发一个属于本身的站点。只要你会go,建立好数据库,成功运行站点便可顺利在本地浏览站点。关于goweb项目如何部署到服务器上,如何作负载均衡,关于这块内容会抽空再写。
若是本文对你有所帮助,请点个赞。