介绍
Web框架是用于解决开发Web应用程序的一些痛苦的好工具。他们经常处理一些较低级别的配置,以便让您专注于应用程序的功能和演示。 Martini是一个用于Go编程语言的软件包,可以实现这些功能。它提供路由,静态文件服务,错误处理和中间件,并挂钩到现有的Go Web功能。这使您可以轻松地将其插入现有的Go代码并简化您的工作负载。 在本指南中,我们将讨论如何使用Martini在Ubuntu 12.04服务器上快速构建Go web应用程序。使用GVM安装Go
虽然Ubuntu 12.04有可用于安装在其默认存储库的Go软件包,但Martini要求Go 1.1或更高版本才能正常工作。存储库中的版本不符合此要求。 而不是从存储库安装Go,我们将使用gvm,Go版本管理器,安装最新版本的go。我们能做到这一点之前,但是,我们 确实需要从仓库一些依赖:sudo apt-get update
sudo apt-get install curl git mercurial make binutils bison gcc
安装gvm依赖项之后,我们可以从项目的GitHub页面下载并运行gvm安装脚本:
bash < <(curl -s https://raw.github.com/moovweb/gvm/master/binscripts/gvm-installer)
这将安装GVM脚本和文件到您的家庭文件夹中的一个隐藏目录中称为
.gvm
。要使用gvm安装Go版本,我们首先需要源脚本,以便我们当前的shell会话有可用的脚本:
source ~/.gvm/scripts/gvm
现在gvm命令在我们当前的shell中可用,我们可以通过发出以下命令来安装Go 1.2版:
gvm install go1.2
这将安装与Martini兼容的Go版本。通过键入以下内容将其设置为默认值:
gvm use go1.2 --default
设置Go环境
现在我们已经安装了Go,我们应该建立一个Go环境。 Go希望能以某种方式组织事物,以正确构建。它期望项目目录具有bin,src和pkg子目录。 我们将在我们的主目录中创建此结构:cd ~
mkdir -p go/{bin,pkg,src}
现在,我们必须将我们转到路径以反映该项目目录,并添加
go/bin
目录给我们的常规路径,使我们可以轻松地运行我们的 Go 程序:
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
您可以对添加这些
.bashrc
每当您登录,以便他们执行:
echo "export GOPATH=$HOME/go" >> ~/.bashrc
echo "export PATH=$PATH:$GOPATH/bin" >> ~/.bashrc
您现在应该准备好处理您的第一个Martini应用程序。
创建您的第一个Martini应用程序
您可以轻松创建一个“Hello world”示例程序,演示Martini应用程序的某些特性。 我们会打电话给我们的节目hello.go
并把它同名的应用程序目录中的
~/go/src
目录:
cd ~/go/src
mkdir hello
nano hello/hello.go
在这个文件中,我们将从主程序的通用Go包声明开始。接下来,我们将通过列出可以获得Martini包的地方来导入Martini包:
package main
import "github.com/codegangsta/martini"
接下来,我们将创建我们的main函数,它将包含我们程序的大部分:
package main
import "github.com/codegangsta/martini"
func main() {
server := martini.Classic()
server.Get("/", func() string {
return "<h1>Hello, world!</h1>"
})
server.Run()
}
让我们来看看我们插入代码
main()
函数的作用。
server := martini.Classic()
此行初始化变量叫
server
和“经典”对象的实例分配给它。 在
classic()
函数创建一个包含了一些默认设置和功能,大多数应用将受益于Martini的一个实例。
server.Get("/", func() string {
return "<h1>Hello, world!</h1>"
})
代码的这一部分设置了响应对资源“/”的HTTP获取请求的URL处理程序,这是根URL位置。换句话说,当用户请求服务器的基本IP地址或域名时,代码的一部分将被执行。 函数返回一个字符串,然后作为响应主体返回,并在用户的浏览器窗口中呈现。
server.Run()
此行是实际启动Martini服务器以监听请求和路由流量的行。 保存并在完成后关闭文件。 接下来,我们需要获取Martini包,以便Go可以运行我们刚才键入的程序:
go get github.com/codegangsta/martini
这将下载程序包到我们的路径,以便Go可以找到和使用这个资源。 最后,我们可以通过键入以下命令来运行我们的程序:
go run hello.go
Martini在端口3000上提供应用程序,因此您可以访问您的应用程序,方法是转到您的IP地址,然后在Web浏览器中输入端口号:
http://your_ip:3000
添加路由和参数
我们对“hello world”程序的第一次迭代是完整的,但我们可以通过利用Martini的路由功能来改进它。 我们已经创建了一个路由,用于处理基本URL的请求。这是一个一般的默认,但如果我们想个性化它,我们需要能够从用户的输入。 从用户获得输入的一种方式是通过URL本身。我们可以将URL的一部分设置为在设计函数的返回值时可以调用的参数。 在基本网址路线下方,我们添加另一个:. . .
server.Get("/", func() string {
return "<h1>Hello, world!</h1>"
})
server.Get("/:who", func(args martini.Params) string {
return "<h1>Hello " + args["who"] + "</h1>"
})
. . .
我们的新处理程序响应基本URL后面的任何请求,直到另一个斜杠。相反,匹配特定的URL字符串,它使用一个叫做占位符
:who
。这个占位符是一个称为“who”的参数,它将获取用户在第一个“/”后输入的值。 你也应该注意到函数声明现在只需称为参数
args
类型
martini.Params
。这允许我们访问将被设置为用户请求的URL值的“who”参数。 在处理函数中,我们基本上有相同的返回的字符串,但我们使用语法访问参数
args["who"]
。这会将“who”的值插入到字符串中。 如果我们保存并再次运行它,我们可以访问我们上次访问基本URL的页面。但是,我们也可以动态的名字,如果他们遵循“/基URL迎接用户
your_name
”:
http://your_ip:3000/Peter我们可以用“%20”替换网址中的空格,将多个字词串起来:
http://your_ip:3000/is%20a%20rather%20fine%20greeting
如何代理您的应用程序通过Nginx
虽然Martini服务器是提供应用程序的绝佳方式,但是最好不要让它暴露为主服务器接口。我们可以使用Nginx作为反向代理来传递适当的参数到我们的应用程序。 从Ubuntu的存储库安装Nginx,以便我们开始:sudo apt-get install nginx
我们的配置会比较基本。它只会将我们的请求直接传递到我们的Martini服务器。 编辑默认的Nginx配置文件:
sudo nano /etc/nginx/sites-enabled/default
内饰方面,改
server_name
声明,以配合您的IP地址或域名。 如果你正在使用的域名,一定要
设置主机名在DigitalOcean控制面板 。
server_name your_ip_or_domain;下一步,我们将改变
location /
声明将请求传递信息给我们的Martini的应用程序。 删除或注释掉默认的
location /
部分,并添加一个新的处理这个通行证:
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:3000;
}
保存并关闭文件,当您进行了这些更改。 现在,我们将重新启动服务器以实现我们的更改:
sudo service nginx restart
现在,我们已经配置了前端服务器,并准备好将连接传递给我们的应用程序。我们需要启动我们的程序来接受这些连接。 目前,我们使用以下语法运行我们的程序:
go run program_name我们应该安装我们的程序,以便我们可以通过名称运行它。我们已经设置了系统路径,以找到我们将使用Go安装的程序。 键入以下命令安装程序:
go install hello
这将编译和我们的节目保存到
~/go/bin
目录。 现在,我们可以通过输入以下命令来启动我们的程序:
hello
这将启动我们的Martini服务器,它将监听端口3000上的请求,就像它总是有。 如果我们想要访问命令行,我们应该在后台启动它。通过键入“CTRL-C”停止程序,然后按如下所示启动它:
hello &
这将允许我们继续在我们的应用程序工作时输入命令。 如果您通过转到其IP地址或域名访问您的服务器,您应该被路由到您的应用程序。如果您使用斜杠和名称关注域,您将收到以下问候:
http://your_ip_or_domain/John
结论
Martini使得在Go程序中处理Web请求变得容易。它不是从头开始重写所有内容,而是尝试创建在核心Web包中逻辑扩展现有服务器功能的功能。 虽然我们的例子在本文中相当简单,但Martini可以处理更复杂的配置。它实现了一个中间件系统,用于将其他功能注入服务进程,并可以通过使用社区贡献来扩展。 Martini简化了Web流程,让您专注于应用程序的核心功能。
作者:Justin Ellingwood