新聞中心
關(guān)于在go語言中導(dǎo)入當(dāng)前文件夾的步驟
1.先把要導(dǎo)入的包go build - go install
目前創(chuàng)新互聯(lián)公司已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計、秦淮網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
2.接著在要導(dǎo)入的方法中以: 項目名 / 導(dǎo)入的文件名 ?的形式導(dǎo)入即可(如下方test(項目名) / chiid(文件名))
Go語言文件操作
本文主要介紹了Go語言中文件讀寫的相關(guān)操作。
文件是什么?
計算機中的文件是存儲在外部介質(zhì)(通常是磁盤)上的數(shù)據(jù)集合,文件分為文本文件和二進(jìn)制文件。
os.Open() 函數(shù)能夠打開一個文件,返回一個 *File 和一個 err 。對得到的文件實例調(diào)用 close() 方法能夠關(guān)閉文件。
為了防止文件忘記關(guān)閉,我們通常使用defer注冊文件關(guān)閉語句。
Read方法定義如下:
它接收一個字節(jié)切片,返回讀取的字節(jié)數(shù)和可能的具體錯誤,讀到文件末尾時會返回 0 和 io.EOF 。 舉個例子:
使用for循環(huán)讀取文件中的所有數(shù)據(jù)。
bufio是在file的基礎(chǔ)上封裝了一層API,支持更多的功能。
io/ioutil 包的 ReadFile 方法能夠讀取完整的文件,只需要將文件名作為參數(shù)傳入。
os.OpenFile() 函數(shù)能夠以指定模式打開文件,從而實現(xiàn)文件寫入相關(guān)功能。
其中:
name :要打開的文件名 flag :打開文件的模式。 模式有以下幾種:
perm :文件權(quán)限,一個八進(jìn)制數(shù)。r(讀)04,w(寫)02,x(執(zhí)行)01。
如何將用go語言開發(fā)的服務(wù)器程序部署到docker
部署簡單。Go 編譯生成的是一個靜態(tài)可執(zhí)行文件,除了 glibc 外沒有其他外部依賴。這讓部署變得異常方便:目標(biāo)機器上只需要一個基礎(chǔ)的系統(tǒng)和必要的管理、監(jiān)控工具,完全不需要操心應(yīng)用所需的各種包、庫的依賴關(guān)系,大大減輕了維護(hù)的負(fù)擔(dān)。這和 Python 有著巨大的區(qū)別。由于歷史的原因,Python 的部署工具生態(tài)相當(dāng)混亂【比如 setuptools, distutils, pip, buildout 的不同適用場合以及兼容性問題】。官方 PyPI 源又經(jīng)常出問題,需要搭建私有鏡像,而維護(hù)這個鏡像又要花費不少時間和精力。
并發(fā)性好。Goroutine 和 channel 使得編寫高并發(fā)的服務(wù)端軟件變得相當(dāng)容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個 Go 應(yīng)用也能有效的利用多個 CPU 核,并行執(zhí)行的性能好。這和 Python 也是天壤之比。多線程和多進(jìn)程的服務(wù)端程序編寫起來并不簡單,而且由于全局鎖 GIL 的原因,多線程的 Python 程序并不能有效利用多核,只能用多進(jìn)程的方式部署;如果用標(biāo)準(zhǔn)庫里的 multiprocessing 包又會對監(jiān)控和管理造成不少的挑戰(zhàn)【我們用的 supervisor 管理進(jìn)程,對 fork 支持不好】。部署 Python 應(yīng)用的時候通常是每個 CPU 核部署一個應(yīng)用,這會造成不少資源的浪費,比如假設(shè)某個 Python 應(yīng)用啟動后需要占用 100MB 內(nèi)存,而服務(wù)器有 32 個 CPU 核,那么留一個核給系統(tǒng)、運行 31 個應(yīng)用副本就要浪費 3GB 的內(nèi)存資源。
良好的語言設(shè)計。從學(xué)術(shù)的角度講 Go 語言其實非常平庸,不支持許多高級的語言特性;但從工程的角度講,Go 的設(shè)計是非常優(yōu)秀的:規(guī)范足夠簡單靈活,有其他語言基礎(chǔ)的程序員都能迅速上手。更重要的是 Go 自帶完善的工具鏈,大大提高了團(tuán)隊協(xié)作的一致性。比如 gofmt 自動排版 Go 代碼,很大程度上杜絕了不同人寫的代碼排版風(fēng)格不一致的問題。把編輯器配置成在編輯存檔的時候自動運行 gofmt,這樣在編寫代碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的代碼。此外還有 gofix, govet 等非常有用的工具。
執(zhí)行性能好。雖然不如 C 和 Java,但通常比原生 Python 應(yīng)用還是高一個數(shù)量級的,適合編寫一些瓶頸業(yè)務(wù)。內(nèi)存占用也非常省。
Golang項目部署3,容器部署
容器部署即使用 docker 化部署 golang 應(yīng)用程序,這是在云服務(wù)時代最流行的部署方式,也是最推薦的部署方式。
跨平臺交叉編譯是 golang 的特點之一,可以非常方便地編譯出我們需要的目標(biāo)服務(wù)器平臺的版本,而且是靜態(tài)編譯,非常容易地解決了運行依賴問題。
使用以下指令可以靜態(tài)編譯 Linux 平臺 amd64 架構(gòu)的可執(zhí)行文件:
生成的 main 便是我們靜態(tài)編譯的,可部署于 Linux amd64 上的可執(zhí)行文件。
我們需要將該可執(zhí)行文件 main 編譯生成 docker 鏡像,以便于分發(fā)及部署。 Golang 的運行環(huán)境推薦使用 alpine 基礎(chǔ)系統(tǒng)鏡像,編譯出的容器鏡像約為 20MB 左右。
一個參考的 Dockerfile 文件如下:
其中,我們的基礎(chǔ)鏡像使用了 loads/alpine:3.8 ,中國國內(nèi)的用戶推薦使用該基礎(chǔ)鏡像,基礎(chǔ)鏡像的 Dockerfile 地址: ,倉庫地址:
隨后使用 " docker build -t main . " 指令編譯生成名為 main 的 docker 鏡像。
需要注意的是,在某些項目的架構(gòu)設(shè)計中, 靜態(tài)文件 和 配置文件 可能不會隨著鏡像進(jìn)行編譯發(fā)布,而是分開進(jìn)行管理和發(fā)布。
例如,使用 MVVM 模式的項目中(例如使用 vue 框架),往往是前后端非常獨立的,因此在鏡像中往往并不會包含 public 目錄。而使用了 配置管理中心 (例如使用 consul / etcd / zookeeper )的項目中,也往往并不需要 config 目錄。
因此對于以上示例的 Dockerfile 的使用,僅作參考,根據(jù)實際情況請進(jìn)行必要的調(diào)整。
使用以下指令可直接運行剛才編譯成的鏡像:
容器的分發(fā)可以使用 docker 官方的平臺: ,國內(nèi)也可以考慮使用阿里云: 。
在企業(yè)級生產(chǎn)環(huán)境中, docker 容器往往需要結(jié)合 kubernetes 或者 docker swarm 容器編排工具一起使用。
容器編排涉及到的內(nèi)容比較多,感興趣的同學(xué)可以參考以下資料:
如何部署Golang應(yīng)用
安裝supervisord
# 通過引導(dǎo)程序 ez_setup.py 來安裝。這個引導(dǎo)程序會聯(lián)網(wǎng)下載最新版本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
# 進(jìn)入vim后找到最后兩行,打開注釋(取消前面的分號),
# [include]
# files = supervisor.d/*.ini
# 將所有的supervisor配置都放到 /etc/supervisor.d目錄
mkdir /etc/supervisor.d
創(chuàng)建 supervisor 對應(yīng)程序的配置文件
其中的一些路徑需要換成自己對應(yīng)的,這里將 zankbo 這個web 應(yīng)用放在了對應(yīng)的用戶目錄下
通過在生產(chǎn)服務(wù)器上設(shè)置environment可以在程序里判斷是線上還是開發(fā)模式,如 zankbo 的 debug判斷
當(dāng)然也可已在啟動命令處加入?yún)?shù),如 command = /home/zankbo/gopath/src/zankbo/zankbo -d 來關(guān)閉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
建立對應(yīng)的用戶
useradd zankbo
# 將www用戶加入到zankbo用戶組,Nginx以www用戶運行
usermod -a -G zankbo www
# 更改用戶家目錄用戶組的權(quán)限,使Nginx可以訪問
chmod g+rx /home/zankbo
部署Go環(huán)境
其中的目錄為,go:Go安裝目錄 gopath:Go工作目錄,下面有src、pkg、bin三個目錄 log:日志文件夾
[zankbo@MyCloudServer ~]$ pwd
/home/zankbo
[zankbo@MyCloudServer ~]$ vim .bashrc
# 設(shè)置Go環(huán)境變量,在.bashrc文件末尾寫下如下內(nèi)容
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
導(dǎo)入項目sql文件到數(shù)據(jù)庫
在項目文件夾執(zhí)行build
[zankbo@MyCloudServer zankbo]$ pwd
/home/zankbo/gopath/src/zankbo
[zankbo@MyCloudServer zankbo]$ go build
會在項目下生成與包名對應(yīng)的可執(zhí)行文件,這里為:zankbo,build的時候可能會遇到錯誤,比如mysql的密碼之類的,可根據(jù)提示排錯。
通過supervisor 來啟動服務(wù)
# 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 ;
}
}
標(biāo)題名稱:go語言部署文件 go 部署
分享鏈接:http://fisionsoft.com.cn/article/hgsjdi.html