[关闭]
@yibo 2015-11-09T10:00:00.000000Z 字数 3483 阅读 865

Golang 的一个简短介绍

Golang Supervisor


最近学习了一下 Golang,刚好有个相对比较独立的小需求,就试着 Golang 写了一下。这里简单介绍一下。

需求是这样的:前端 H5 需要使用微信的 JS-SDK 来调用微信的自定义分享接口,需要后端提供权限验证的配置(关于 JS-SDK 可以参考 微信JS-SDK说明文档

实现的逻辑也很简单:
0. 前端调用一个后端提供的接口
1. 后端根据微信公众号的 appid 和 appsecret 获取 access_token 并缓存
2. 通过 access_token 获取 api_ticket 并缓存
3. 根据 api_ticket 及其他一些参数生成 signature 并返回给前端

相关代码可以从 http://hg.s.diandian.com/jiemo-golang 获取
(除了 redis、zookeeper 用了第三方的包,其他的都是用 Go 的标准包。遇到的问题:Java 中可以利用现成的第三方包 Jedis 实现 Redis 的分布式,Go 中没有找打类似的)

下面介绍一下 Golang 的安装与环境、交叉编译、部署。

Golang 简介

先介绍一下 Golang 吧,它的设计者是 Robert Griesemer, Rob Pike 和 Ken Thompson,当年设计 C 和 Unix,后来的 Plan9 团队中的人。现在已经有很多公司和项目开始 Go 进行开发了(国外如 Google、AWS、CloudFlare、CoreOS、Docker 、Facebook、Dropbox等,国内如七牛、阿里等)。
再来看看如下公司开源的go库:
(1)Facebook开源其 Go 库 https://github.com/facebookgo
(2)Dropbox开源了其基于 Go 语言的工具库 https://github.com/dropbox/godropbox

Golang 的优点:

缺点也是有的:它的错误处理机制导致代码中要有很多处理错误的代码,第三方包和解决方案远不及 Java,目前第三方包都是从 github 获取的。

安装

首先在官网下载对应平台的安装包(目前最新的版本是1.5.1),也可以用源码编译安装,不过我感觉用安装包安装的就行了。

这里以 OS X 为例:
下载后直接运行 pkg 文件,一路 next,安装完成后 Go 的发行版会被安装到 /usr/local/go 中。

p.s. Mac 上也可以直接用 Homebrew 安装 Go

然后将 /usr/local/go/bin 添加到 PATH 环境变量中。

执行 go 没有报 command not found: go 话应该就是没啥问题的。

配置 GOPATH

go 命令依赖一个很重要的环境变量:GOPATH

GOPATH 支持设置多个目录,因为平时要用go get获取一些第三方的代码,而go get默认会把这些代码下载到第一个工作区,所以一般会设置两个或以上的工作区目录(将自己的代码和第三方的代码分离),例如:

  1. $ export GOPATH=$HOME/golang/lib:$HOME/golang/work

GOPATH 目录下约定有三个子目录:

其中 src 目录是需要手动新建的,pkg、bin 目录都可以在运行 go buildgo install等命令时自动生成。

IDE

Go 目前还没有官方的 IDE,有一个国人开发的 LiteIDE 还不错,就是有时候不是太稳定,容易崩溃。也可以使用 IntelliJ IDEA、Eclipse 或 Sublime 安装对应的 GO 插件,使其支持 GO 语言。
如果只是为了学习 Go,可以使用官方的 Playground 在线运行 Go 程序。

调试:Go 用 GDB 调试。

学习 Go

Go 从 1.0 到 1.5 语法感觉没什么变化,网上关于其语法的文章也很多,官网也有语法讲解和训练(https://tour.golang.org)。

以下是一些 Golang 的学习资源:

  1. Go 指南:官网链接:https://go-tour-zh.appspot.com/welcome/1(需要梯子),如果无法打开请用国内链接:http://tour.studygolang.com/

  2. 《The Way to Go》,如果看英文感觉吃力,github上无闻大牛已经做了中文译本:https://github.com/Unknwon/the-way-to-go_ZH_CN

  3. 《Go 学习笔记 第四版》雨痕写的,该电子书在 github 开源:https://github.com/qyuhen/book

  4. 《Go Web编程》,是谢大(beego的作者)写的书,github中文目录链接:https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/preface.md

  5. 《Go 编程基础》视频教程,此教程是无闻大牛讲解的,github视频链接:https://github.com/Unknwon/go-fundamental-programming

编译

编译运行于本地环境 GO 程序的话直接 go build,比如

  1. $ go build jiemoapp.com/server/token

主要说下交叉编译,也就是 OS X 平台下编译的出可以运行于 Linux 或 Windows 的 Go 程序。

首先用 go env 查看一下本机的 go 环境

  1. $ go env
  2. GOARCH="amd64"
  3. GOBIN=""
  4. GOEXE=""
  5. GOHOSTARCH="amd64"
  6. GOHOSTOS="darwin"
  7. GOOS="darwin"
  8. GOPATH="/Users/yibo/golang/lib:/Users/yibo/golang/work"
  9. GORACE=""
  10. GOROOT="/usr/local/go"
  11. GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
  12. GO15VENDOREXPERIMENT=""
  13. CC="clang"
  14. GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common"
  15. CXX="clang++"
  16. CGO_ENABLED="1"

交叉编译涉及到两个环境变量——GOOSGOARCH,别代表 Target Host OS 和 Target Host ARCH。我的 Go 是采用安装包安装的,默认情况的这两个环境变量和本机的 GOHOSTOSGOHOSTARCH是一样的。

明白了这两个环境变量后就可以开搞了,先编译一个 Linux 下的

  1. $ cd $GOPATH/src
  2. $ GOOS=linux GOARCH=amd64 go build -o example_linux example.com/your/package

然后你就能在当前目录下看到一个名为example_linux的可执行文件了,如果想看编译过程的详细信息,go build 的时候加上 -x

交叉编译 Windows 的无非就是改下GOOSGOARCH,如下

  1. $ GOOS=windows GOARCH=amd64 go build -o example.exe example.com/your/package

部署

部署本来没什么好讲的,Go 的部署简单无比,直接把编译好的那个可执行文件拉到服务器上,改下权限就能跑起来了。

不过 Go 有个 bug,无法成为守护进程(Daemonize)——也不知现在解决了没有。

也有几种实现 Go 语言 daemon 的方案,不过得先了解 Linux 的守护进程是咋实现的。我采用一种简单的方式,用第三方的工具来管理(也是谢大《Go Web 编程》书中推荐的)—— Supervisor。

p.s. 其实想简单点的话,也可以直接用 nohup commend & 来后台运行,至于其与 daemon 的区别,可以参考 linux 的nohup & 和daemon 总结)

Supervisor 是用 Python 实现的一个进程管理工具,它会帮你把它转成 Daemon 程序(并且它要求被管理的程序必须是非 Daemon 的)

安装 Supervisor:

  1. # easy_install supervisor

配置:参考 Supervisor – 服务管理

内网可以访问 http://10.10.5.11:9001 看到 Supervisor 的管理页面(用户名:admin 密码:123456)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注