2014年3月25日星期二

[]Go语言知识积累:windows开发环境搭建 - 51CTO.COM

本文自动转发自我的博客: http://www.haofengjing.org/2572.html

特点简介:

1.引入轻量级线程——协程(coroutine),Go语言中叫goroutine。

2.采用Erlang风格的并发模型,即消息是进程间唯一的通信方式(而非共享内存)。两个goroutine之间通信通过channel(通道)进行。

3.对代码风格进行了强制统一,比如public变量必须以大写字母开头,private变量必须以小写字母开头,从而省略了这两个关键字。{}中{的书写不能另起一行等。

4.defer关键字,不管程序是否异常,均在退出时执行的代码。避免了大量try、catch语句。

5.函数允许返回多个值,且最后一个值问error类型,用于在错误的情况下返回详细信息。

6.反对(不提供)函数和操作符的重载,不提供继承、虚函数、虚函数重载。但是提供组合,也达到继承的目的。

7.没有构造函数和析构函数 ,提供接口,与其他语言最大的区别在于接口是非侵入性的。即实现类无需从接口派生

8.支持匿名函数与闭包。

...继续研究中

Windows下,开发环境的搭建:

IDE有两种选择,一个是国人开发的liteIDE,一个是给eclipse下载goclipse插件。但是由于未知原因,我没有调好eclipse中基于gocode的Go语言自动补齐功能。所以我选择了liteIDE,下面介绍如何搭建liteIDE环境,eclipse的方法大家自己探索吧。欢迎分享经验。

1.下载Go语言安装包,进入下面的链接,选择适合自己的安装包进行下载(我用的go1.0.3.windows-386.msi),然后安装即可,记录下安装后的根目录以备配置使用。

下载地址:https://code.google.com/p/go/downloads/list

2.下载liteIDE,进入下面的链接,选择适合自己的安装包(我用的liteidex17.windows-webkit.7z),下载完成后解压到任意目录,然后进入根目录下的bin文件夹,双击liteide.exe即可打开软件。

下载地址:https://code.google.com/p/golangide/downloads/list

软件界面如下:

3.配置liteIDE的信息,第一次打开此IDE时,需要配置相关信息,才能正确使用。点击【查看】→【选项】,打开了选项页面后在列表中选择LiteEnv,如图所示:

4.针对你的系统,修改对应的文件。我是32位系统,所以需要修改win32-user.env和win32.env。修改内容如下:

  1. #nativecompilerwindows386 
  2. GOROOT=E:\go 
  3. GOBIN=E:\go\bin 
  4. GOARCH=386 
  5. GOOS=windows 
  6. CGO_ENABLED=1 
  7. PATH=%GOBIN%;%GOROOT%\bin;%PATH% 
  8. LITEIDE_GDB=gdb 
  9. LITEIDE_MAKE=mingw32-make 
  10. LITEIDE_TERM=%COMSPEC% 
  11. LITEIDE_TERMARGS
  12. LITEIDE_EXEC=%COMSPEC% 
  13. LITEIDE_EXECOPT=/C 

其中GOROOT和GOBIN都是根据之前Go语言安装时选定的目录进行配置的。我安装Go语言时选择的路径是E:\Go

5.配置GOPATH,点击【查看】→【设置GOPATH】,在打开的窗口中的自定义GOPATH处点击浏览,选中你以后想存放Go工程的文件夹,添加后选择ok。如图所示:

6.关闭IDE,重新打开后,在点击【查看】→【工具窗口】→【Package浏览】,打开了Package浏览后,如果能看到Go的目录,则可以使用了。

怀着对先人的尊敬,我们来个HelloWorld之旅~

选择起始页的新建,在模板处选择Go1 Command Project,起个名字,点击ok。则自动生成了HelloWorld程序~

点击编辑窗口上部的BR按钮,即可运行程序,并在编译输出窗口得到输出。

恩,现在就探索到这个阶段。在Eclipse中装goclipse插件遇到种种问题,虽然最后成功安装,但是没有自动补齐功能。所以放弃了~

附一张liteIDE的自动补齐功能截图:

欢迎各路Go大神赐教~

PS: 我存在过,我遇见过,我失败过。 有些路,明明有坑却从没人放警示牌。有些事,明明是错的却没人去管。有些话,明明应该告诉后来人却没人去说。 既然没人做,那就我来吧。希望我曾经历过的挫折不再重现于后来人。希望传承能够不是只挂在嘴边。希望人模人样的"人"能够真正做人。

原文链接:http://www.cnblogs.com/FlameRen/archive/2013/04/08/3007155.html

 

[]Go语言学习笔记(一) : 搭建Windows下的Go开发环境 » Soul Apogee

本文自动转发自我的博客: http://www.haofengjing.org/2570.html

原创文章,转载请注明:转载自Soul Apogee 本文链接地址:Go语言学习笔记(一) : 搭建Windows下的Go开发环境

最近突然对Go语言产生了兴趣,主要是因为在使用python的时候遇到了一些不爽的问题,然后发现了Go。Go是Google出的一个动态语言,语法和C++接近性能也非常的好,而且还支持编译成exe发布,并且不依赖任何虚拟机(其实是打包在exe里面了),这种好语言怎么能够错过?所以便一时兴起,开始学习了起来。由于本人还处于异常小白的阶段,所以文章中可能不免有些错误,欢迎大家各种指正。

安装Go

前往Go语言的官方网站:http://golang.org/,下载对应平台的安装包。如果是x86的系统可以就下载i386的,如果是x64的系统,那么就安装amd64的就可以了。另外Go语言在Windows下的的安装包有两种:msi和zip的。zip的是免安装的,解压在配置一些环境变量之后就可以使用,msi的则是安装包版本的,安装的时候会设置好对应的环境变量。为了方便,我就下了x64上的msi安装包:go1.1.2.windows-amd64.msi。下好安装包后,安装过程就很简单了,下一步到底就好了。 虽然msi会自动配置一些环境变量,但是本人在安装完之后还是遇到了部分环境变量丢失的情况,所以在安装完Go之后,我们最后还是检查一些所有的环境变量是否正常。主要的环境变量有以下几个:

  • GOROOT:Go的安装目录
  • GOPATH:用于存放Go语言Package的目录,这个目录不能在Go的安装目录中
  • GOBIN:Go二进制文件存放目录,写成%GOROOT%\bin就好
  • GOOS:操作系统
  • GOARCH:指定系统环境,i386表示x86,amd64表示x64
  • PATH:需要将%GOBIN%加在PATH变量的最后,方便在命令行下运行Go
  • 我们还可以使用go env来查看所有其他的环境变量的定义 go-env

当环境变量都配置正常之后,Go就已经安装完毕了。现在打开命令行,运行go,大家应该就可以看到如下的提示了。

Hello Go!

现在就让我们一起来Hello World吧!

1
2
3
4
5
package main
import "fmt"
func main() {
    fmt.Println("Hello, World!")
}

将上面的程序保存成hello.go,然后在命令行中执行:

1
go run hello.go

Tada!结果就出来了! go-run

而且Go语言还可以将go程序直接编译成exe,再发布出去,相比python更为方便(需要使用py2exe),只需要在命令行中运行:

1
go build hello.go

就可以看到并执行编译好的exe了。 go-build

另外,我们还可以看到,这个hello.exe居然有1.5M之多,这个应该是因为go把整个虚拟机都打包到了exe里面的缘故,从exe的依赖上来看,他对go已经完全没有依赖了,只有几个系统的dll了。 hello-dependency

IDE

关于IDE每个人的喜好都不同,你可以使用较为独立的开发环境LiteIDE,也可以是VS或者Eclipse,甚至是notepad++,当然更不用说vim和emacs了。在这里,介绍两种比较常见的IDE:LiteIDE和Eclipse。

LiteIDE

LiteIDE算是集成的非常好Go IDE了,编译,调试,代码补全,功能可谓应有尽有。而且免费,开源,基于QT所以还跨平台。其安装异常简单,从官网(https://code.google.com/p/liteide/)上下载对应平台的安装包,然后解压到指定目录即可。 liteide

Eclipse + GoClipse

Eclipse是非常著名的IDE了,所以具体要怎么安装,我就不太多说了,简单介绍一下过程。

  1. http://java.com/上下载并装好最新的JRE
  2. http://www.eclipse.org/上下载最新的Eclipse,解压即可

刚下载下来的Eclipse是不支持Go的,为了让其支持Go语言,我们需要安装一个插件:GoClipse。 项目地址:https://code.google.com/p/goclipse/

安装过程十分简单,只需要在Eclipse中添加一个源:http://goclipse.googlecode.com/svn/trunk/goclipse-update-site/,然后选中GoClipse,安装即可,如下图。 eclipse-install-goclipse

安装完之后,重启Eclipse,我们便可以使用Eclipse来编写Go语言的程序了。

GoCode

使用GoClipse写代码的时候,我们会发现其没有代码补全,为了增加代码补全,我们需要安装gocode。LiteIDE就不需要了,因为其已经内置了gocode。

GoCode是host在github上,使用go写的用来做go语言代码补全的工程,项目地址是:https://github.com/nsf/gocode,里面有非常详细的安装方法。由于go内置了和包管理器类似的工具,所以安装方式也就很简单了。

  1. 安装git:由于安装过程中由于需要用到git,所以需要先安装msysgit或者cygwin,如果你觉得这样很麻烦,有一个更为简单的方法:安装github for windows:http://windows.github.com/
  2. 启动git shell,并运行:go get -u -ldflags -H=windowsgui github.com/nsf/gocode。
  3. 现在到%GOBIN%目录下看一下,就会发现有gocode.exe了。

接下来就需要配置一下Eclipse。打开Windows->Preferences,找到Go->Gocode标签,设置好gocode.exe的路径即可。 goclipse-set-gocode

完成,现在好好写代码吧。 eclipse-goclipse


[]常见开源消息系统 | IT瘾

本文自动转发自我的博客: http://www.haofengjing.org/2568.html

消息系统的作用:异步处理、削减峰值、减少组件之间的耦合。

选择消息系统根据业务需要需要考虑以下几个方面:

  1. 是否持久化
  2. 吞吐能力
  3. 高可用
  4. 分布式扩展能力
  5. 兼容现有协议
  6. 易于维护
  7. 其他,如消息丢失和重复的处理
  8. 避免单点故障
  9. 负载均衡

常见消息系统协议:

  1. STOMP
  2. AMQP
  3. 类似 MEMCACHE 的协议
  4. HTTP
  5. 自定格式

1、2 是不错的可选开源组件:

1. Kafka/MetaQ: 广泛用于 Linkedin 内部 (类似有 Java 版本的国产 MetaQ)

由于优先考虑吞吐,更加适合大数据量的消息收集和处理,比如日志分析、用户行为信息实时报表、集群状态信息收集和分析。

  1. 优先考虑持久化的设计,依靠 page cache 管理内存
  2. 高吞吐 112MB/s 11K msgs/s (比 beanstalkd >70x 吞吐能力)
  3. 支持异步复制
  4. 高可用、基于 Zookeeper 的集群设计、支持消费者失效后重新负载均衡
  5. Kafka 提供 PHP 类库
  6. 支持 ganglia JMX 监控
  7. 需要策略避免重复消息, 消费者更新 Zookeeper 的 offset 的方式 (MetaQ 已经提供了几种方式避免消息重复)
  8. MetaQ 提供 HTTP 接口

http://www.mail-archive.com/kafka-users@incubator.apache.org/msg02082.html https://github.com/neophenix/StateOfTheMQ/blob/master/state_of_the_mq.pdf?raw=true http://s.urge.omniti.net/i/content/slides/Surge2012-ErikOnen_Kafka_Messaging-Paradigms.pdf http://research.microsoft.com/en-us/um/people/srikanth/netdb11/netdb11papers/netdb11-final12.pdf http://dirlt.com/kafka.html http://dirlt.com/index.html http://wiki.secondlife.com/wiki/Message_Queue_Evaluation_Notes

2. NSQ – Golang

无中心设计、节点自动注册和发现。可以考虑作为内部通讯框架的基础。

https://github.com/bitly/nsq * 追求简单部署  * 追求高可用、避免单点故障、无中心设计  * 确保消息送达  * 生产者消费者自动发现、消费者连接所有生产者、向消费者推的模式 * 提供 HTTP 接口

https://speakerdeck.com/snakes/nsq-nyc-golang-meetup https://github.com/davegardnerisme/nsqphp

http://www.davegardner.me.uk/blog/tag/nsq/

3. Beanstalkd

  1. 支持持久化 binlog 设计,重启消息不丢失
  2. 一般
  3. 无高可用设计
  4. 和 memcached 一样的分布式扩展方式
  5. 各种类库
  6. 有 Web 管理工具
  7. 支持同步调用,等待返回
  8. 只有类似 Memcache TCP ASCII 协议, 单文件部署
  9. 支持消息优先级
  10. 9K jobs/s 入队列 5K jobs/s 出队列
  11. 单点故障
  12. 无主从同步复制机制
  13. 最好单机多实例部署

https://github.com/kr/beanstalkd/wiki/Tools https://github.com/pda/pheanstalk

4. Redis

需要自己封装 Pub/Sub

  • 基于 Redis 的复制高可用

其他常见开源消息系统:

ZeroMQ: 轻量级基础消息库

只适合不需要持久化的场景、需要自己封装

  1. 不支持持久化,只提供消息分发, 性能最好
  2. 无 Broker 设计, 无中心故障

RabbitMQ

  • 2500 job/s 入队列 1300 job/s 出队列
  • 适合小消息
  • 分布式无单点设计
  • 底层为 Erlang 实现 有评论: RabbitMQ could not enqueue/dequeue fast enough.

https://blogs.vmware.com/vfabric/2013/04/how-fast-is-a-rabbit-basic-rabbitmq-performance-benchmarks.html

RESTMQ

http://restmq.com/

MemcacheQ

http://memcachedb.org/memcacheq/

HTTPSQS

https://code.google.com/p/httpsqs/

Gearman

http://gearman.org/presentations https://code.google.com/p/shard-query/

Kestrel

http://robey.github.io/kestrel/ http://robey.github.io/kestrel/docs/guide.html

HornetQ

性能差不考虑[3]

Resque

3800 jobs/s 入队列 300 jobs/s 出队列 https://github.com/blog/542-introducing-resque 基于 Redis 的消息队列

Starling

https://github.com/starling/starling

SquirrelMQ

https://code.google.com/p/squirrel-message-queue/

Sparrow – Ruby

https://code.google.com/p/sparrow/

Apache ActiveMQ

ActiveMQ crashed constantly under load.

STOMP HTTP 协议

http://stomp.github.io/stomp-specification-1.2.html

参考:

http://hiramchirino.com/stomp-benchmark/ec2-c1.xlarge/index.html https://blog.serverdensity.com/queueing-mongodb-using-mongodb/ [3] http://x-aeon.com/wp/2013/04/10/a-quick-message-queue-benchmark-activemq-rabbitmq-hornetq-qpid-apollo/ https://news.ycombinator.com/item?id=5531192 http://www.javaplex.com/blog/high-performance-message-queues-get-reviewed/ http://adam.heroku.com/past/2010/4/24/beanstalk asimple andfast queueingbackend/