背景提要:
① 前端开发工程师,完成了项目A的前端工作,包括页面及接口对接,含html+css+js及php层
② 出于职业规划,负责担任项目B的Server层开发,初次接触Go语言
③ 毕设项目为:JavaWeb搭建的一套系统,了解从【数据库--JDBC--server--页面】的运行逻辑
文章目的:
搭建http服务端,完成第一个GoServer层接口Connect
接口说明:判定数据库是否连接成功
接口流程:前端发送请求到指定URL,返回结果
搭建Go环境
此文不叙
简单项目架构
代码分析
main.go
package mainimport ( "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 daoimport ( "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 daoimport ( "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
小功告成!
待续