背景提要:
① 前端开发工程师,完成了项目A的前端工作,包括页面及接口对接,含html+css+js及php层
② 出于职业规划,负责担任项目B的Server层开发,初次接触Go语言
③ 毕设项目为:JavaWeb搭建的一套系统,了解从【数据库--JDBC--server--页面】的运行逻辑
文章目的:
搭建http服务端,完成第一个GoServer层接口Connect
接口说明:判定数据库是否连接成功
接口流程:前端发送请求到指定URL,返回结果
搭建Go环境
此文不叙
简单项目架构
代码分析
main.go
package main
import (
"fmt"
"dao"
)
func main() {
fmt.Print("预备加载BI服务 ......\n")
dao.RegisterAPIRouter()
}
main(主)服务执行文件,从代码可以看出,当加载main()
方法后,调用了dao.RegisterAPIRouter()
方法,这里dao
是一个包,RegisterAPIRouter
是dao
包中的一个方法。可以看到import
的有dao
这个包。
go的规则简单理解为,import
即引入某个包后,即可以调用该包中的全局方法(大写开头的方法),不以包下的文件名做区分,只要是dao
下的全局方法,都可以以dao.xxx
的形式调用。
router.go
package dao
import (
"github.com/gin-gonic/gin"
"net/http"
)
func RegisterAPIRouter() {
gin.SetMode(gin.DebugMode) //调试模式
router := gin.Default() //获得路由实例
routerDatasource := router.Group("/data/source")
// 监听/data/source/connect的get和post请求,对应方法:ConnTest
routerDatasource.GET("/connect", ConnTest)
routerDatasource.POST("/connect", ConnTest)
//监听端口
http.ListenAndServe(":9000", router)
}
这里引入了gin框架,更简便的搭建http服务器,监听url请求。上述代码监听/data/source/connect
的get和post
请求,对应方法:ConnTest
,监听端口为9000。而ConnTest
方法在dao
下的datasource.go
中,触发监听时,会调用此方法。
datasource.go
package dao
import (
"database/sql"
_ "github.com/lib/pq"
_ "github.com/go-sql-driver/mysql"
"github.com/gin-gonic/gin"
)
/**
* [测试连接数据库]
* @Author CaiYu
* @DateTime 2017-01-11T14:40:34+0800
* @param dbname 数据库名
* @param dbtype 数据库类型
* @param user 用户名
* @param password 密码
* @param port 端口
* @param host 主机
*/
func ConnTest(c *gin.Context) {
var(
status int
desc string
)
dbtype := c.Query("dbtype")
dbname := c.Query("dbname")
user := c.Query("user")
password := c.Query("password")
host := c.Query("host")
port := c.Query("port")
constr := user+":"+password+"@tcp("+host+":"+port+")/"+dbname
db, err := sql.Open(dbtype, constr)
err = db.Ping() //sql.Open无法断定数据库是否正常连接,所以调用db.Ping()进行判定
if err != nil {
status = 300
desc = "数据库连接失败"
}else{
status = 200
desc = "数据库连接成功"
}
c.JSON(200, gin.H{"status": status,"msg": desc})
}
sql.Open()
不会创建连接 ,只是创建一个DB实例,所以执行Open()
函数时,系统并不会去获得数据库连接的有效性,执行数据库操作的时候才会去连接。
当我们需要在Open()
之后就知道连接的有效性时,可以通过Ping()
来进行。如上述代码所示。
我们对db.Ping()
的结果进行了一个err判定,对应赋值,将结果以json的形式返回,方便前端调用。
项目编译(构建)
1.先把该项目加入到环境变量GOPATH
中。
假设projectB目录位于~/gotest下,则应编辑~/.bashrc文件,并添加下面这行代码:
export GOPATH=~/gotest/projectB
2.然后使路径生效:
$ source ~/.bashrc
GOPATH
和PATH
环境变量一样,也可以接受多个路径,并且路径和路径之间用冒号分割。
3.设置完GOPATH后,开始编译(构建)项目。
假设我们希望把生成的可执行文件放到projectB/bin
目录中,需要执行的一系列指令如下:
$ cd ~/gotest/projectB/bin
//runserver为我们主程序main.go所在的文件夹名称
$ go build runserver
可以看到生成了名为一个runserver
的文件,执行它即启动了projectB
//启动服务
./runserver
执行后的结果,以及服务监听的反馈
调用请求
用postman发送请求
示例url:
127.0.0.1:9000/data/source/connect?dbname=mysql&user=admin&password=admin&host=127.0.0.1&port=3306&dbtype=mysql
返回结果如图所示:
结语
至此我的第一个GoServer接口就完成了:ip:port/data/source/connect
小功告成!
待续