文档中心 V3.0
Go

概述

Go是Google开发的一种编译型,可平行化,并具有垃圾回收功能的编程语言。
Go语言具有如下特点:

  • 简洁、快速、安全
  • 并行、有趣、开源
  • 内存管理、数组安全、编译迅速

开发指南

下面为大家实战演示如何发布Go项目的demo。

使用示例

1.创建新的Go应用

Go-1.png
Go-2.png

2.进入刚刚创建的应用的控制台,选择服务详情

Go-3.png


3.在应用下创建mysql服务

Go-4.png
Go-5.png


4.以同样的方式创建Glusterfs服务

Go-6.png


5.绑定并查看您所创建的服务

Go-7.png


6.创建您的应用页面,输入代码后打包成zip格式,上传到MoPaaS

Go-8.png


7.代码简单的示例目录结构(不需要跟这个目录结构完全一致,用户可以根据自己的习惯来创建目录结构)

Go-12.png


8.Procfile文件中指定启动命令,web应用是web: command worker应用是worker: command 启动命令可以在创建应用的对话框中添加,也可以在应用的运行状态页面添加,如下图:

Go-13.png

需要在web.go中使用环境变量获取端口,不能显式指定端口号
9.指定Go语言版本在Godeps/Godeps.json文件内添加

{
"ImportPath": "go_app",
"GoVersion": "go1.5", <——版本号
"Deps": []
}

MySQL使用举例

package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
"time"
)
/*
create table t(
id int primary key auto_increment,
name varchar(20) not null,
ts timestamp
);
*/
func insert(db *sql.DB) {
stmt, err := db.Prepare("insert into t(name,ts) values(?,?)")
defer stmt.Close()
if err != nil {
log.Println(err)
return
}
ts, _ := time.Parse("2015-01-02 15:04:05", "2015-06-28 15:04:00")
stmt.Exec("edmond", ts)
}
func main() {
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/TestMysql?charset=utf8")
//TestMysql是我的数据库名称,root是数据库用户名,123456是数据库密码,3306是Mysql的端口号
//请在MoPaaS的Mysql管理界面查找对应的数据替换
if err != nil {
log.Fatalf("Open database error: %s\n", err)
}
defer db.Close()
err = db.Ping()
if err != nil {
log.Fatal(err)
}
insert(db)
rows, err := db.Query("select id,name,ts from t where id>?", 1)
if err != nil {
log.Println(err)
}
defer rows.Close()
var id int
var name string
var ts string
for rows.Next() {
err := rows.Scan(&id, &name,&ts)
if err != nil {
log.Fatal(err)
}
log.Println(id, name,ts)
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
}

Glusterfs使用举例

//Golang实现Web文件上传
package main
import (
"fmt"
"html/template"
"io"
"log"
"net/http"
"os"
)
var buf []byte
func upload(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
if r.Method == "GET" {
t, err := template.ParseFiles("upload.gptl")
checkErr(err)
t.Execute(w, nil)
} else {
file, handle, err := r.FormFile("file")
checkErr(err)
f, err := os.OpenFile("PATH"+handle.Filename, os.O_WRONLY|os.O_CREATE, 0666)
//PATH是上传文件的存放地址,请在MoPaaS的Glusterfs服务管理界面查找对应的存储路径
io.Copy(f, file)
checkErr(err)
defer f.Close()
defer file.Close()
fmt.Println("upload success")
}
}
func checkErr(err error) {
if err != nil {
err.Error()
}
}
func main() {
http.HandleFunc("/upload", upload)
err := http.ListenAndServe(":8888", nil)
if err != nil {
log.Fatal("listenAndServe: ", err)
}
}
//upload网页端文件:
<html>
<head></head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" value="" />
<input type="submit" name="submit" />
</form>
</body>
</html>

扩展服务

目前支持的扩展服务包括:

  • Glusterfs(文件系统)用户和程序可以像访问本地文件一样访问远端系统上的文件
  • MySQL(数据库)提供分布式的关系型数据库服务
  • PostgreSQL(数据库)提供分布式的关系型数据库服务
  • Mongodb(数据库)提供高性能的非关系型数据库
  • Memcached(缓存服务)提供高性能的分布式内存对象缓存服务

注意事项

1、环境变量
如果给应用绑定了相关的服务,MoPaaS将会生成对应的环境变量,您可以在代码中使用获取环境变量的方法来代替手动写入环境变量。当然,您也可以通过自定义环境变量来设置环境变量。
2、权限相关
出于安全性考虑,上传到MoPaaS的代码不被允许进行write操作,因此,有安装过程的应用需要将配置文件(一般为数据库配置文件)通过Glusterfs服务存放到文件管理中心,有上传文件功能的应用需要把文件的存放路径指向为Glusterfs给定的路径。
3、上传代码包
当手动将应用工程压缩成zip压缩包时,请勿直接将工程根目录打包,正确的打包方式为进入工程根目录,选中根目录下所有文件及文件夹,打包成zip压缩包。
4、配置默认首页
用户应用工程如未显式配置默认首页路径,如Java Web应用没有在web.xml中配置welcome页面,平台将寻找应用工程根目录下的index.html或index.php等页面作为应用的默认首页,如在应用工程根目录下未找到相关页面,则直接访问应用url时可能出现“Not Found”错误信息,在该种情况下用户需要在浏览器地址栏种输入完整的路径才能访问相关页面,例:yourappname.butterfly.mopaasapp.com/admin/login.html (yourappname是您的应用名,admin是您打包文件夹的名称,login.html是您想要访问的文件名,请根据项目定义)