成都网站建设设计

将想法与焦点和您一起共享

go语言部署文件 go 部署

关于在go语言中导入当前文件夹的步骤

1.先把要导入的包go build - go install

目前创新互联公司已为1000+的企业提供了网站建设、域名、网站空间、网站托管、服务器托管、企业网站设计、秦淮网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

2.接着在要导入的方法中以: 项目名 / 导入的文件名  的形式导入即可(如下方test(项目名) / chiid(文件名))

Go语言文件操作

本文主要介绍了Go语言中文件读写的相关操作。

文件是什么?

计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件。

os.Open() 函数能够打开一个文件,返回一个 *File 和一个 err 。对得到的文件实例调用 close() 方法能够关闭文件。

为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句。

Read方法定义如下:

它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回 0 和 io.EOF 。 举个例子:

使用for循环读取文件中的所有数据。

bufio是在file的基础上封装了一层API,支持更多的功能。

io/ioutil 包的 ReadFile 方法能够读取完整的文件,只需要将文件名作为参数传入。

os.OpenFile() 函数能够以指定模式打开文件,从而实现文件写入相关功能。

其中:

name :要打开的文件名 flag :打开文件的模式。 模式有以下几种:

perm :文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。

如何将用go语言开发的服务器程序部署到docker

部署简单。Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。这和 Python 有着巨大的区别。由于历史的原因,Python 的部署工具生态相当混乱【比如 setuptools, distutils, pip, buildout 的不同适用场合以及兼容性问题】。官方 PyPI 源又经常出问题,需要搭建私有镜像,而维护这个镜像又要花费不少时间和精力。

并发性好。Goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个 Go 应用也能有效的利用多个 CPU 核,并行执行的性能好。这和 Python 也是天壤之比。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁 GIL 的原因,多线程的 Python 程序并不能有效利用多核,只能用多进程的方式部署;如果用标准库里的 multiprocessing 包又会对监控和管理造成不少的挑战【我们用的 supervisor 管理进程,对 fork 支持不好】。部署 Python 应用的时候通常是每个 CPU 核部署一个应用,这会造成不少资源的浪费,比如假设某个 Python 应用启动后需要占用 100MB 内存,而服务器有 32 个 CPU 核,那么留一个核给系统、运行 31 个应用副本就要浪费 3GB 的内存资源。

良好的语言设计。从学术的角度讲 Go 语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲,Go 的设计是非常优秀的:规范足够简单灵活,有其他语言基础的程序员都能迅速上手。更重要的是 Go 自带完善的工具链,大大提高了团队协作的一致性。比如 gofmt 自动排版 Go 代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题。把编辑器配置成在编辑存档的时候自动运行 gofmt,这样在编写代码的时候可以随意摆放位置,存档的时候自动变成正确排版的代码。此外还有 gofix, govet 等非常有用的工具。

执行性能好。虽然不如 C 和 Java,但通常比原生 Python 应用还是高一个数量级的,适合编写一些瓶颈业务。内存占用也非常省。

Golang项目部署3,容器部署

容器部署即使用 docker 化部署 golang 应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式。

跨平台交叉编译是 golang 的特点之一,可以非常方便地编译出我们需要的目标服务器平台的版本,而且是静态编译,非常容易地解决了运行依赖问题。

使用以下指令可以静态编译 Linux 平台 amd64 架构的可执行文件:

生成的 main 便是我们静态编译的,可部署于 Linux amd64 上的可执行文件。

我们需要将该可执行文件 main 编译生成 docker 镜像,以便于分发及部署。 Golang 的运行环境推荐使用 alpine 基础系统镜像,编译出的容器镜像约为 20MB 左右。

一个参考的 Dockerfile 文件如下:

其中,我们的基础镜像使用了 loads/alpine:3.8 ,中国国内的用户推荐使用该基础镜像,基础镜像的 Dockerfile 地址: ,仓库地址:

随后使用 " docker build -t main . " 指令编译生成名为 main 的 docker 镜像。

需要注意的是,在某些项目的架构设计中, 静态文件 和 配置文件 可能不会随着镜像进行编译发布,而是分开进行管理和发布。

例如,使用 MVVM 模式的项目中(例如使用 vue 框架),往往是前后端非常独立的,因此在镜像中往往并不会包含 public 目录。而使用了 配置管理中心 (例如使用 consul / etcd / zookeeper )的项目中,也往往并不需要 config 目录。

因此对于以上示例的 Dockerfile 的使用,仅作参考,根据实际情况请进行必要的调整。

使用以下指令可直接运行刚才编译成的镜像:

容器的分发可以使用 docker 官方的平台: ,国内也可以考虑使用阿里云: 。

在企业级生产环境中, docker 容器往往需要结合 kubernetes 或者 docker swarm 容器编排工具一起使用。

容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:

如何部署Golang应用

安装supervisord

# 通过引导程序 ez_setup.py 来安装。这个引导程序会联网下载最新版本setuptools来安装,同时也可以更新本地的setuptools。

wget

sudo python ez_setup.py

# 更新setuptools:

sudo python ez_setup.py -U setuptools

# 安装supervisor

easy_install supervisor

# 生成配置文件

echo_supervisord_conf /etc/supervisord.conf

# 编辑配置文件

vim /etc/supervisord.conf

# 进入vim后找到最后两行,打开注释(取消前面的分号),

# [include]

# files = supervisor.d/*.ini

# 将所有的supervisor配置都放到 /etc/supervisor.d目录

mkdir /etc/supervisor.d

创建 supervisor 对应程序的配置文件

其中的一些路径需要换成自己对应的,这里将 zankbo 这个web 应用放在了对应的用户目录下

通过在生产服务器上设置environment可以在程序里判断是线上还是开发模式,如 zankbo 的 debug判断

当然也可已在启动命令处加入参数,如 command = /home/zankbo/gopath/src/zankbo/zankbo -d 来关闭Debug模式。

if os.Getenv("APP_NAME") == "ZANKBO_PRODUCT" {

beego.RunMode = "prod"

}

vim /etc/supervisor.d/zankbo.ini

# 写入

[program:zankbo]

directory = /home/zankbo/gopath/src/zankbo

environment=APP_NAME="ZANKBO_PRODUCT"

command = /home/zankbo/gopath/src/zankbo/zankbo

autostart = true

startsecs = 5

user = zankbo

redirect_stderr = true

stdout_logfile = /home/zankbo/log/zankbo.log

建立对应的用户

useradd zankbo

# 将www用户加入到zankbo用户组,Nginx以www用户运行

usermod -a -G zankbo www

# 更改用户家目录用户组的权限,使Nginx可以访问

chmod g+rx /home/zankbo

部署Go环境

其中的目录为,go:Go安装目录 gopath:Go工作目录,下面有src、pkg、bin三个目录 log:日志文件夹

[zankbo@MyCloudServer ~]$ pwd

/home/zankbo

[zankbo@MyCloudServer ~]$ vim .bashrc

# 设置Go环境变量,在.bashrc文件末尾写下如下内容

export GOROOT=$HOME/go

export GOPATH=$HOME/gopath

export PATH=$PATH:$GOROOT/bin:$GOPATH/bi

# 切换到用户家目录

[root@MyCloudServer ~]# su - zankbo

[zankbo@MyCloudServer ~]$ ls

go gopath log

将项目代码放到gopath/src下面,如我的播客项目:

[zankbo@MyCloudServer ~]$ tree -L 2 gopath/src/

gopath/src/

├── github.com

│ ├── astaxie

│ ├── beego

│ ├── go-sql-driver

│ ├── howeyc

│ ├── jacobsa

│ ├── smartystreets

│ └── wendal

└── zankbo

├── admin

├── blog

├── build_pkg.sh

├── common

├── conf

├── controllers

├── dbstruct.mwb

├── main.go

├── models

├── static

├── views

└── zankbo

导入项目sql文件到数据库

在项目文件夹执行build

[zankbo@MyCloudServer zankbo]$ pwd

/home/zankbo/gopath/src/zankbo

[zankbo@MyCloudServer zankbo]$ go build

会在项目下生成与包名对应的可执行文件,这里为:zankbo,build的时候可能会遇到错误,比如mysql的密码之类的,可根据提示排错。

通过supervisor 来启动服务

# supervisorctl start zankbo

配置Nginx

server {

listen 80;

server_name zankbo.com ;

root /home/zankbo/gopath/src/zankbo;

error_log logs/zankbo.com.error.log warn ;

location /static/ {

root /home/zankbo/gopath/src/zankbo;

location ~ .*\.(js|css)$ {

access_log off;

expires 1d;

}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {

gzip off;

access_log off;

expires 3d;

}

}

location / {

proxy_pass ;

}

}


本文标题:go语言部署文件 go 部署
浏览地址:http://chengdu.cdxwcx.cn/article/hgsjdi.html