Go的部署——基于Manjaro(Arch Linux) - Go语言中文社区

Go的部署——基于Manjaro(Arch Linux)


更多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, "", "tt")
	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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39777626/article/details/86228003
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-02 16:19:16
  • 阅读 ( 1809 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢