go语言是谷歌2009年首次推出并在2012年正式发布的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(robpike)说:七牛之所以开发go,是因为过去10多年间软件开发的难度令人沮丧。google对go寄予厚望,其设计是让软件充分发挥多核心处理器同步多工的优点,并可解决面向对象程序设计的麻烦。它具有现代的程序语言特色,如垃圾回收,帮助开发者处理琐碎但重要的内存管理问题。go的速度也非常快,几乎和c或c++程序一样快,且能够快速开发应用程序。
最初去评估go语言最重要的原因是,七牛没有找到一门合适的语言。从云计算领域的主要技术方案看,最受欢迎的是c++和java。七牛知道亚马逊是用了java。我个人尝试java做服务端开发是在2007年金山实验,java的风格比较拘束或严谨,与我推崇的编程风格不合,并且在分布式系统开发上没有显著的优势,所以才会关注erlang(也因此有了ecug社区)、go等小众语言。在我评估完go语言后,我认为它是云计算领域最合适的开发语言。
如果说到java曾经的流行,我们会联想到ssh(struts+spring+hibernate);如果提到python,也会联想到django;如果提到ruby,会联想到rubyonrails;如果提到javascript,会联想到nodejs;如果提到php,更是一堆长江后浪推前浪前浪死在沙滩上的web开发框架。这些编程语言社区的繁荣昌盛无一例外都和web开发息息相关,且最终沉淀下来的都是各种五花八门各有千秋的众多web开发框架。可以说,我们当前所面临和web开发的技术选型,从未有过如此的繁荣。繁荣的背后,衬托的是一个大江东流去不复还的pcweb时代。
稳定性来说,云计算都是假设单机是可以宕机的,要在单机的不可靠下让整个集群可靠(这种宕机甚至不为用户所感知)。七牛并不担心单个进程的稳定性,哪怕go程序每天会挂一次,对七牛而言,也是可以接受的。
go语言入门门槛非常之低。有任何其他语言的背景,学习go语言只需要一周的时间。**七牛面试从来不问你会不会go语言。七牛关心的是开发者的能力与七牛业务的匹配度,比如他算法基础如何、是否擅长网络编程、是否适合创业(对事情的责任感)等等。
go语言的哪些特点最吸引人?
并发
go最大的特色就是在语言层面天生支持并发,不需要像其他大多数编程语言那样需要开发者自行实现或借助第三方类库实现并发编程,go在语言级别支持的并发编程,其逻辑简化得通俗易懂简单好上手。
性能
不同于大多数脚本或解释性的高阶编程语言,用go编写的代码直接了当编译成机器码高效执行。
简洁
25个关键字即表达你能想到的所有招式,没有也不需要有任何多余,想干啥事就go一下。
跨平台
x86、amd64(x86_64)、arm;linux、windows、darwin(osx)、freebsd、android(计划go1.4)几乎全平台支持,真正做到一份源码,随处编译,到处运行。
go语言都有哪些常见的应用场景?
作为一个go语言的重度用户来看,当前除了不适合拿来造操作系统以外在操作系统之上应用级的事情都能干。再更具体一点,比如说适用于这样一些使用场景:
系统应用
以前要用c/c++做的系统应用,现在都可以用go来写,事半功倍,而且go完美包容c源代码,两者互相调用还可以混合编译从而无缝集成。
网络应用
包含了常见的服务端编程比如web和apiservice,以前用php/python/ruby/java干的事情现在都可以用go更加简单清晰的来写。再比如还可以拿来做一些proxy(代理)如网络穿透软件等,你懂的。
分布式系统
基于go强大的系统编程加网络编程,打造各种跨网络的分布式系统服务,go社区有不少和分布式系统相关的开源产物。
各种形态的存储和数据库应用
比如groupcache,influxdb等。
客户端应用
包括带界面的桌面软件,以及后续可以想像的移动端应用(比如对android的支持)。
云服务(paas)
如基于go打造的七牛云存储(分布式对象存储系统),比如基于go编写的docker(一款开源的容器虚拟化产物)。
go能做的事情,包含但不限于以上罗列的使用场景。
比如web开发。大多数编程语言之上的web开发框架都是遵照mvc的处理流程去开发web应用:model部分封装数据,controller部分处理业务逻辑,view部分植入变量填充模板页面。而大部分web框架关于mvc的三部分都是在server-side处理,比如对view部分的处理都是在server-side通过程序动态对模版变量求值后再拼接组装成html页面输出给浏览器去呈现。而go开发web应用,并不依赖任何web开发框架,用内置的标准库就可以轻而易举地实现:比如使用net/http标准库就可以数行代码构建一个完整的web骨架应用;再比如,通过关键字struct封装一个数据结构就可以表达原本mvc框架中需要用厚重的orm(object-relationalmapping)才能表达的那部分。大道至简,这可以说是go的哲学。在view这一层,go也有相应标准库提供支持,但更推荐的做法,是当下比较流行的mvvm(model-view-viewmodel):server-side只输出json,浏览器dom作为view层,前端javascript充当contoller部分;这样,不仅减少了server-side的资源消耗还有中间传输的网络流量,而且前端可以更灵活和更丰富,后端也可以更轻盈和更高效,也更有利于项目的分工和协作。
go语言在七牛中都开发了些什么服务?在七牛的代码量中,go语言使用占多少比例?
七牛主要使用go开发了以下服务和工具:
分布式存储系统(distributedkey/valuestorage)数据处理服务(dataprocessing)网络接口服务(restfulapiservice)消息队列服务(messagequeueservice)日志处理系统(logservice)web网站(不含前端javascript)cli命令行和gui图形界面工具其他辅助工具总的来讲,go在七牛七牛的工程中代码覆盖率超过90%。还有10%不能覆盖的原因是七牛给开发者自助使用的web界面需要用javascript编程来实现酷炫的前端,以及七牛为开发者准备了多达超过10种编程语言的sdk。
我们再来看看go在当下这个多核时代的作为。不得不说,go最大的特色就是在语言层面天然支持并发,在go程序里边,你可以通过在一个函数调用前使用关键字go即可让该函数func运行成为一个独立的goroutine,goroutine可以理解成一种比线程更加轻盈更省开销的轻量级协程。go的并发模型就是通过系统的线程来多路派遣这些独立函数的执行,使得每个用关键字go执行调用的函数可以运行成为一个单位协程。当⼀个协程阻塞的时候,调度器就会自动把其他协程安排到另外的线程中去执行,从而实现程序的无等待并行化运行。且调度的开销非常小,单核cpu调度的规模不下于每秒百万次,这使得我们能够创建大量的goroutines,从而可以很轻松地编写并发程序达到我们想要的目的。
同时,go在语言层面还引入了channel这一内置类型来实现并发执行体goroutines之间的消息传递,通信靠channels来传递消息。go遵循csp(communicatingsequentialprocesses)并发模型,通过通信来共享内存而不是用共享内存的方式进行通信。go的并发里边没有共享内存,更没有内存锁,这一切都有利于进行更为安全和简单的并行程序编写。
原文标题:七牛云存储使用Go语言架设网站的经验分享,如若转载,请注明出处:https://www.saibowen.com/tougao/22085.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「赛伯温」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。