更多Go内容请见: https://blog.csdn.net/weixin_39777626/article/details/85066750
部署方法:
一、独立服务器
- 物理服务器
- 虚拟服务器(虚拟机)
1.Amazon Web Services(AWS)
2.Digital Ocean
二、云端
- Heroku
- Google App Engine
三、Docker化容器
- 本地Docker服务器
- Digital Ocean虚拟机
独立的服务器
步骤:
- 创建一个可执行的二进制文件
- 放到互联网服务器运行
服务模型
- IaaS(Infrastructure-as-a-Service)基础设施即服务
- PaaS(Platform-as-a-Service)平台即服务
- SaaS(Software-as-a-Service)软件即服务
main.go
package main
import (
"database/sql"
_ "github.com/lib/pq"
)
var Db *sql.DB
func init() {
var err error
Db, err = sql.Open("postgres", "user=postgres dbname=testdb password=3141596 sslmode=disable")
if err != nil {
panic(err)
}
}
func retrieve(id int) (post Post, err error) {
post = Post{}
err = Db.QueryRow("select id,content,author from posts where id=$1", id).Scan(&post.Id, &post.Content, &post.Author)
return
}
func (post *Post) create() (err error) {
statement := "insert inte psots (content,author) values ($1,$2) returning id"
stmt, err := Db.Prepare(statement)
if err != nil {
return
}
defer stmt.Close()
err = stmt.QueryRow(post.Content, post.Author).Scan(&post.Id)
return
}
func (post *Post) update() (err error) {
_, err = Db.Exec("update posts set content=$2,author=$3 where id=$1", post.Id, post.Content, post.Author)
return
}
func (post *Post) delete() (err error) {
_, err = Db.Exec("delete from posts where id=$1", post.Id)
return
}
server.go
package main
import (
"encoding/json"
"net/http"
"path"
"strconv"
)
type Post struct {
Id int `json:"id"`
Content string `json:"content"`
Author string `json:"author"`
}
func main() {
server := http.Server{
Addr: "127.0.0.1:8080",
}
http.HandleFunc("/post/", handleRequest)
server.ListenAndServe()
}
func handleRequest(w http.ResponseWriter, r *http.Request) {
var err error
switch r.Method {
case "GET":
err = handleGet(w, r)
case "POST":
err = handlePost(w, r)
case "PUT":
err = handlePut(w, r)
case "DELETE":
err = handleDelete(w, r)
}
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
func handleGet(w http.ResponseWriter, r *http.Request) (err error) {
id, err := strconv.Atoi(path.Base(r.URL.Path))
if err != nil {
return
}
post, err := retrieve(id)
if err != nil {
return
}
output, err := json.MarshalIndent(&post, "", "\t\t")
if err != nil {
return
}
w.Header().Set("Content-Type", "application/json")
w.Write(output)
return
}
func handlePost(w http.ResponseWriter, r *http.Request) (err error) {
len := r.ContentLength
body := make([]byte, len)
r.Body.Read(body)
var post Post
json.Unmarshal(body, &post)
err = post.create()
if err != nil {
return
}
w.WriteHeader(200)
return
}
func handlePut(w http.ResponseWriter, r *http.Request) (err error) {
id, err := strconv.Atoi(path.Base(r.URL.Path))
if err != nil {
return
}
post, err := retrieve(id)
if err != nil {
return
}
len := r.ContentLength
body := make([]byte, len)
r.Body.Read(body)
json.Unmarshal(body, &post)
err = post.update()
if err != nil {
return
}
w.WriteHeader(200)
return
}
func handleDelete(w http.ResponseWriter, r *http.Request) (err error) {
id, err := strconv.Atoi(path.Base(r.URL.Path))
if err != nil {
return
}
post, err := retrieve(id)
if err != nil {
return
}
err = post.delete()
if err != nil {
return
}
w.WriteHeader(200)
return
}
云端
Heroku
部署步骤
- 修改代码,从环境变量中获取端口号
- 使用Godep引入依赖关系
- 创建Heroku应用
- 将代码推送到Herku应用
Google App Engine
部署步骤
- 修改代码,使用Google提供的库
- 创建app.yml文件
- 创建GAE应用
- 将代码推送到GAE平台
Docker容器
定义
Docker:在容器中构建、发布和运行应用的一个平台
Docker客户端:用户在与Docker守护进程交互时所使用的命令行接口
Docker守护进程:对客户端发送的服务请求进行应答,并对容器进行管理
Docker容器:对运行特定应用所需的全部程序(包括操作系统在内)的一种轻量级虚拟化
Docker镜像:构建Docker容器的基础
容器与虚拟机的区别
安装
sudo pacman -S docker
#使用前记得启动
systemctl start docker.service
#测试是否安装成功
sudo docker run hello-world
部署
1.在ws-d目录下创建Dockerfile
FROM golang
ADD . /go/src/github.com/sausheong/ws-d
WORKDIR /go/src/github.com/sausheong/ws-d
RUN go get github.com/lib/pq
RUN go install /github.com/sausheong/ws-d
ENTRYPOINT /go/bin/ws-d
EXPOSE 8080
2.使用Dockerfile构建Docker镜像
docker build -t ws-d .
3 .根据镜像创建Docker容器并运行
docker run --publish 80:8080 --name simple_web_service --rm ws-d
检测容器是否启动
docker ps
向服务器发送一个POST请求
curl -i -X POST -H "Content-Type:application/json" -d '{"content":"My first post","author":"Sau Sheong"}' http://127.0.0.1:8080/post/
获取记录
curl -i -X GET http://127.0.0.1.:8080/post/1
安装docker machine
curl -L https://github.com/docker/machine/releases/download/v0.9.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
chmod +x /tmp/docker-machine &&
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
- 在云端创建Docker宿主
- 连接远程Docker宿主
- 在远程宿主中构建Docker镜像
- 在远程宿主中启动Docker容器
部署方法之间的对比
独立服务器 | Heroku | GAE | Docker | |
---|---|---|---|---|
类型 | 公有 & 私有 | 公有 | 公有 | 公有 & 私有 |
是否需要修改代码 | 不需要 | 少量 | 中等 | 不需要 |
是否需要配置系统 | 大量 | 不需要 | 不需要 | 中等 |
是否需要维护 | 大量 | 不需要 | 不需要 | 中等 |
部署的难度 | 低 | 高 | 中等 | 低 |
平台对应用的支持程度 | 无 | 低 | 高 | 低 |
平台对平台的紧密程度 | 无 | 低 | 高 | 低 |
可扩展性 | 无 | 中等 | 高 | 高 |
评注 | 自主更新部署,使用者需要自己未完成所有事情 | 公有PaaS平台,除少数几项限制之外,使用者几乎可以做所有事情 | 严格受限的PaaS平台,使用者需要与平台绑定 | 一项非常有前景的技术,有很多供应商可供选择 |
更多Go内容请见: https://blog.csdn.net/weixin_39777626/article/details/85066750