## 前言
简要说说开发一个go web站点,我们需要掌握哪些技能?准备哪些技术点?
##### 1、web框架
一个好的框架能提升你的开发效率,也有益于团队合作。iris自称是最快的goweb框架,快不快我们要测试了才知道,但是看了支撑对比,iris目前是最丰富的。
##### 2、数据库操作
我们选用mysql,关系型数据库的主流。另外要选择一个orm框架,对于大多数的业务开发,手写sql语句的方式未免太怀旧了,这里推荐xorm,他提供了自动映射的工具。
##### 3、缓存数据库
非关系型缓存数据库,对于一个合格的站点,缓存必不可少,能减少数据库压力,提高访问速度。我们选用redis。
##### 4、负载均衡
虽然go天生支持高并发,但是随着网站访问量的不断增高,单台服务器始终会成为瓶颈。另外为了站点的高可用,免不了分布式部署。负载均衡我们选用nginx做反向代理服务器。
##### 本文重点
###### 1、本文重点介绍web框架内容,使用iris开发一个mvc站点。[《iris mvc + xorm,Go Web站点开发。(含完整源码)》](https://segmentfault.com/a/1190000022348886)
###### 2、数据库操作:[《golang 使用xorm操作mysql》](https://segmentfault.com/a/1190000022023758)
###### 3、缓存数据库:[《golang 操作redis5大数据类型》](https://segmentfault.com/a/1190000021702953)
###### 4、关于nginx的部署会另起篇幅。
## iris 安装
github地址
```
github.com/kataras/iris
```
**如果直接使用go get 命名安装会有部分包因为翻墙问题下载不下来**,我们可以使用GOPROXY,设置代理。
1.打开CMD命令提示框,设置临时环境变量
```
set GO111MODULE=on
set GOPROXY=https://goproxy.io
```
2、再次执行
```
go get -v -u github.com/kataras/iris
```
安装完成后,GOPATH的src目录下会多出github.com\kataras\iris文件夹,就代表下载成功了。
`iris下载的翻墙问题确实令人头疼,关于GOPROXY的使用当初我也是折腾了好久才成功。如果运行过程中有缺少什么零散的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 //主函数入口
```
#### 要点说明:
##### 1、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
```
##### 2、main.go,主函数
main是程序的入口,主要做了一些iris服务监听启用前的设置,例如日志记录方式、全局错误捕获、视图模板注册、静态文件路径注册、路由器注册等。
全局错误捕获是自定义了一个`customRecover`中间件,`recover`恐慌,把错误记录下来后,再继续下一步`ctx.Next()`
##### 3、dao 数据库操作类
`book_dao.go`数据操作,提供了一些常用的例子:获取单条数据、获取列表、获取分页列表、删除数据、更新数据、新增数据,都是对xrom的使用。业务层不会直接调用`dao`,而是通过`services`来调用`dao`,例如在读取mysql之前,先在redis查询是否存在数据,如果存在直接返回,不存在则读取mysql后再存到redis里。这样明确的业务分层便于今后业务的扩展。关于redis的使用,可以参考前面提到的文章,本文不再赘述。
##### 4、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.html`,`conf.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`。
##### 5、views,数据视图
数据视图必须先经过`main`函数的注册才可使用,不然会报找不到视图的异常。
`bookLauout.html`是书城的模板,里面包含前端共用的部分,例如整体的html代码,底部公用导航等。主内容用`{{ yield }}`作为占位符。
##### 6、项目源码
项目已经发布在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='图书表';
```
## 总结
demo.book.com项目为大家举例了goweb开发的开发模式和框架结构,如果你做过web开发,相信依葫芦画瓢,很容易开发一个属于自己的站点。只要你会go,创建好数据库,成功运行站点即可顺利在本地浏览站点。关于goweb项目如何部署到服务器上,如何做负载均衡,关于这块内容会抽空再写。
**如果本文对你有所帮助,请点个赞。**
有疑问加站长微信联系(非本文作者))