版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Go API编程13-4-25Go API编程基于beego打造高效API之路Apr 25, 2013高级研究员,:3999/qcon.slide#81/42Go API编程13-4-25Agenda什么是API为什么使用API开发API开发中几个关键点Go适合API开发API框架beego的beego如何开发项目 实际项目的经验和教训:3999/qcon.slide#82/42Go API编程13-4-25什么是APIAPIApplication programinterface:3999/qcon.slide#83/42Go API编程
2、13-4-25API调用GET:3999/qcon.slide#84/42Go API编程13-4-25谁在使用APIGoogleAmazon淘宝腾讯:3999/qcon.slide#85/42Go API编程13-4-25API为中心的应用设计:3999/qcon.slide#86/42Go API编程13-4-25API-Centric的好处服务多个终端,特别是现在移动互联网的快速发展标准化,无论是对外还是对内都能实现统一标准(http+json/xml) 适合团队之间的协作代码清晰,结构化,可维护性强安全性,可以利用认证系统做到API
3、的安全去中心化,易扩展,API的无状态化,可以很方便的进行扩展实现模块化,实现最小化的API之后,可以通过组合又可以拼装新的API 可以快速将内部的API进行开放,让应用迅速的得到开发者的支持:3999/qcon.slide#87/42Go API编程13-4-25API的典型部署方案:3999/qcon.slide#88/42Go API编程13-4-25API的关键点要求:运行快速开发高效运行Go语言特别适合API编程,它在这三个特点中找到了平衡。:3999/qcon.slide#89/42CodeBox-腾讯:为了开发效率与运行效率之
4、间的平衡,使用php+HipHop,google使用+psyco, 冥冥之中感觉,最后可能都会被开发效率和运行效率都不错的golang统一了。Go API编程13-4-25什么是Go?Go出自名门Google公司,是一门并发支持、回收的编译型系统编程语言,是一门具有在静态编译语言的高性能和动态语言的高效开发之间拥有良好平衡点的编程语言。均是著名的 IT 工程师:该项目的三Rob Pike,Go 语言项目总Unix 团队成员,参与的项目Plan,贝尔9,Inferno 操作系统和 Limbo 编程语言;Ken Thompson,贝尔Unix 团队成员,C 语言、Unix 和 Plan 9 的创始
5、人之一,与 Rob Pike 共同开发了 UTF-8 字符集规范,图灵奖获得者。Robert Griesemer,参与开发 Java HotSpot 虚拟机;:3999/qcon.slide#810/42Go API编程13-4-25Go的语法特性:3999/qcon.slide#811/42Go API编程13-4-25Go的主要特点语法简单,和C类似,入门很快类型内存安全以非常直观和极低代价的方案实现高并发高效的回收机制快速编译(同时解决C语言中头文件太多的问题) 为多核计算机提供性能提升的方案UTF-8编码支持跨平台编译集成工具丰富,特别是gofmt、
6、godoc:3999/qcon.slide#812/42Go API编程13-4-25对于Go的担心新语言是不是不够?很多bug?很多是新的,是不是GC和Scheduler是不是不够成熟?Google扼杀了很多有用的项目,就如最近的Googleer, Go语言会是下一个吗?:3999/qcon.slide#813/42Go API编程13-4-25Who are useGoogleBBC Worldwide HeroKu dotCloud CloudFlare SoundCloud Mozilla Services Apcera七牛盛大360127.0.0.
7、1:3999/qcon.slide#814/42Go API编程13-4-25Go的例子之入门:3999/qcon.slide#815/42package mainimport (fmt)const (HELLO = hello WORLD = world)var (name string iintj string)func main() name = astaxie i = 100j = qconfmt.Println(HELLO, WORLD, name, i,j)RunGo API编程13-4-25Go的例子之函数:3999/qcon.slide#81
8、6/42package mainimport (fmt)func delay(a string) fd,err:=os.Open(a.txt) if err!=nilreturn3 2defer fd.()hi astaxiedefer fmt.Println(exit the func delay exec)fmt.Println(hi, a)exit the func delay exec01func AddMult(a, b int) (sum, mult int) 2return a + b, a * b344 4func main() hi astaxiea := int1, 2ex
9、it the func delay execfor _, v := range a 0RunKillfmt.Println(AddMult(2, v) delay(astaxie)Go API编程13-4-25Go的例子之网络编程:3999/qcon.slide#817/42package mainimport (fmt net/http)func main() http.HandleFunc(/, hello) http.ListenAndServe(localhost:8000, nil)func hello(w http.ResponseWriter, r *http.
10、Request) fmt.Fprintln(w, Hello, Gophers! Welcome to Qcon!)RunGo API编程13-4-25Go的例子之并发:3999/qcon.slide#818/42package mainimport (fmt; net/http; time)func main() urls := string, start := time.Now()done := make(chan string) for _, u := range urls go func(u string) resp, err := http.Get(u) if er
11、r != nil done - u + + err.Error() else done - u + + resp.Status(u)for _ = range urls fmt.Println(-done, time.Since(start)RunGo API编程13-4-25Go的例子之json:3999/qcon.slide#819/42package mainimport (encoding/json; fmt; os)type ColorGroup struct IDintnamestring Colors stringfunc main() group := Col
12、orGroup ID:1,name:Reds,Colors: stringCrimson, Red, Ruby, Maroon,b, err := json.Marshal(group) if err != nil fmt.Println(error:, err)os.Stdout.Write(b)RunGo API编程13-4-25Go适合API编程静态编译跨平台,很多问题扼杀在编译阶段内置net/http,处理网络应用得心应手内置JSON、XML处理,方便处理表现层语言级别的并发支持,编写并发简单方便丰富的内置包,借鉴了很多的思想足够简单就会让我们的程序足够相比PHP、Ruby具有性能优势
13、:3999/qcon.slide#820/42Go API编程13-4-25API开发关注点:并发处理go并发http处理http内置包数据操作io/os/strings/strconv/sql包XML/JSON处理json/xml包日志处理log包用户认证oauth/oauth2/basic/Digest authentication数据加密 aes/dec/md5/hash/sha1等包:3999/qcon.slide#821/42Go API编程13-4-25beego是什么beego是一个基于Go语言开发的应用框架,主要思路来源于tornado和si
14、ntra,主要有如 下这些特性:REST设计加强型路由MVC模式智能日志模块 ini配置模块 XML、JSON输出常用模板函数缓存系统Session模块.com/astaxie/beego(:3999/qcon.slide#822/42Go API编程13-4-25beego之目录结构:3999/qcon.slide#823/42Go API编程13-4-25beego之入门:3999/qcon.slide#824/42package mainimport (.com/astaxie/beego)type MainController st
15、ruct beego.Controllerfunc (this *MainController) Get() this.Ctx.WriteString(hello world)func (this *MainController) Post() this.Ctx.WriteString(hi post)func main() beego.Router(/, &MainController) beego.Run()RunGo API编程13-4-25beego执行逻辑:3999/qcon.slide#825/42Go API编程13-4-25beego项目目录结构127.0.0
16、.1:3999/qcon.slide#826/42Go API编程13-4-25beego之辅助工具bee工具:3999/qcon.slide#827/42go /astaxie/beeGo API编程13-4-25beego之API开发1、使用bee工具创建项目2、编写3、器,设计API的对应逻辑器路由以短域名为例,设计一个应用API接口设计:3999/qcon.slide#828/42shorturl/shorten长链转短链shorturl/expand短链转长链bee create shorturlGo API编程13-4-25短域名逻
17、辑之一 shorturl.go:3999/qcon.slide#829/42package controllersimport (.com/astaxie//astaxie/beego/cache shorturl/ms)var (urlcache cache.Cache)func init() urlcache, _ = cache.NewCache(memory, interval:0)type ShortResult struct UrlShort string UrlLong stringtype ShortController struct bee
18、go.ControllerGo API编程13-4-25短域名逻辑之一 shorturl.go:3999/qcon.slide#830/42func (this *ShortController) Post() var result ShortResultlongurl := this.Input().Get(longurl) beego.Info(longurl)result.UrlLong = longurlurlmd5 := ms.GetMD5(longurl) beego.Info(urlmd5)if urlcache.IsExist(urlmd5) result.U
19、rlShort = urlcache.Get(urlmd5).(string) else result.UrlShort = ms.Generate()err := urlcache.Put(urlmd5, result.UrlShort, 0) if err != nil beego.Info(err)err = urlcache.Put(result.UrlShort, longurl, 0) if err != nil beego.Info(err)this.Datajson = result this.ServeJson()Go API编程13-4-25短域名逻辑之二 expand.g
20、o:3999/qcon.slide#831/42package controllersimport (.com/astaxie/beego)type ExpandResult struct beego.Controllerfunc (this *ExpandResult) Get() var result ShortResultshorturl := this.Input().Get(shorturl) result.UrlShort = shorturlif urlcache.IsExist(shorturl) result.UrlLong = urlcache.Get(s
21、horturl).(string) else result.UrlLong = this.Datajson = result this.ServeJson()Go API编程13-4-25短域名之逻辑 m.go:3999/qcon.slide#832/42func Generate() (tiny string) globalnum+num := globalnum fmt.Println(num)alpha := merge(getRange(48, 57), getRange(65, 90) alpha = merge(alpha, getRange(97, 122)if
22、 num = 1 if num 62 runes = append(runes, alphanum-1) else runes = append(runes, alphanum%62)num = num / 62for i, j := 0, len(runes)-1; i j; i, j = i+1, j-1 runesi, runesj = runesj, runesiGo API编程13-4-25路由:3999/qcon.slide#833/42func main() beego.Router(/, &controllers.MainController) beego.R
23、outer(/v1/shorten, &controllers.ShortController) beego.Router(/v1/expand, &controllers.ExpandResult) beego.Run()Go API编程13-4-25最后的效果及测试缩短域名:获取长域名::3999/qcon.slide#834/42GETPOSTGo API编程13-4-25beego模板善的地方测试表单验证热编译:3999/qcon.slide#835/42Go API编程13-4-25基于beego的实际项目(I)1、短域名服务使用beego开发了一
24、个类似bitly的短域名服务,提供盛大内部项目使用,目前一台机器: 32G内存、8核、centos64,redis数据库,数据量在1000w多点,运行半年多时间了,至 今没有出现过一次down机或者奔溃2、合作项目使用beego提供系统级别服务,集成电路板信号,智能分析nginx配置,提供大数据量的和页面3、内部系统目前这个项目还在开发中,主要是利用beego做两个服务,一个是服务器端,收集,一个是客户端,收集并上报给服务器端,如果和服务端断开,那么以暂存数据,防止数据丢失,同时还支持类似puppet的功能,支持程序自动升级,部署其他程序等功能。:3999/qcon.slide#836/42Go API编程13-4-25基于beego的实际项目(II)4、日志分析系统以前采用hadoop来分析日志的来源和省份,发现hadoop分析这么大的数据,性能不的一套架构,squid日志每小时分割上报,每小时对是很好,延迟比较大,目前采用日志进行分割,然后进行UV、PV、省份、运营商、浏览器、数据量等的分析,同时把日志进行按域名分割,提供用户原始日志5、分发系统实现了类似BT的块分发机制,但是实现了机房之间的单文件流,机房内的块copy等功的智能分发,从文件上传到下发到每一台服
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2021届湖北省孝感市普通高中高一下学期期末考试数学试题
- 2025年建筑施工《春节节后复工复产》工作实施方案 合计3份
- 小学一年级20以内数学口算练习题大全
- 学校聘用教师劳动合同书5篇
- 《肌组织课件》课件
- 你听“你听多美”命题作文写作指导与精彩例文
- 湖南高考语文试题分析报告
- 《劳动定额知识》课件
- 商超连锁店话务员工作总结
- 税务筹划与规划实践经验分享
- 部队保密安全课件
- 园林施工技术创新-洞察分析
- 医院窗帘、隔帘采购 投标方案(技术方案)
- 2025届湖北省高三上学期12月联考语文试题
- 国家开放大学《Photoshop图像处理》章节测试题参考答案
- 期末检测卷(试题)-2024-2025学年三年级上册数学人教版
- 江苏省南京市2023-2024学年高一上学期物理期末试卷(含答案)
- 新疆乌鲁木齐市(2024年-2025年小学五年级语文)人教版阶段练习(上学期)试卷及答案
- 2024年人教版八年级生物上册期末考试卷(附答案)
- JGJ120-2012建筑基坑支护技术规程-20220807013156
- 2024年叉车租赁合同经典版(四篇)
评论
0/150
提交评论