Go+Beego实现简单API接口

发布网友 发布时间:4小时前

我来回答

1个回答

热心网友 时间:4小时前

项目地址:https://github.com/CJFJack/go_api_demo

背景

在日常运维工作中,当遇到同时维护多台服务器的场景,经常需要用到ansible、saltstack、puppet等工具。但某些场景下,服务器之间处于不同的内网,又不想开放ssh端口到公网,或者遇到跨平台的情况下,saltstack又觉得太重,可以尝试自己实现agent,达到操作服务器的目的。

借用saltstack的一张执行原理图:

Beego介绍

Beego是一个能够快速开发Go应用程序的WEB框架。它可以用来迅速地开发API、网络App和后端服务。同时,它也可以作为RESTful框架。其设计灵感主要来自Python和Rails流行的框架,借鉴了Python语言开发的框架Tornado和Flask以及Ruby开发的web框架Sinatra。

Beego与其他框架的最大区别,是我们不仅在追求框架性能的同时,更加关注于开发效率,程序员的生产力。通常情况下,我们做一个业务的时候,在使用一些WEB框架需要纠结的选择各种组件和编写自己的中间件,将这些代码拼接到一起,这个繁琐过程可以理解成我们拿了一堆锤子、钉子在组装一个工具,做好了工具才能开始需求,导致我们开发人员陷入到选轮子、造轮子的加班困境中。

借助bee工具可以轻松创建基于beego的api项目

//安装gogetgithub.com/beego/bee//创建api项目beeapi<yourprojectname>//创建web项目beenew<yourprojectname>?简单的接口认证

客户端请求api接口时,在请求的header中加入指定的token

定义APIController,在Prepare函数中校验请求token,实现权限校验

packageauthimport("fmt""github.com/astaxie/beego""go_api_demo/base""go_api_demo/base/response")typeAPIControllerstruct{base.BaseController}func(c*APIController)Prepare(){c.EnableXSRF=falsetoken:=fmt.Sprintf("Token%s",beego.AppConfig.DefaultString("api::token",""))headerToken:=c.Ctx.Input.Header("Authorization")iftoken!=headerToken{c.Data["json"]=response.UnAuthorizationc.ServeJSON()}}

接下来就可以在其他处理请求的crontroller中继承APIController

packagev1import("github.com/astaxie/beego/logs""go_api_demo/base/auth""go_api_demo/base/response""go_api_demo/forms")typeTeststruct{auth.APIController}func(c*Test)Post(){ifc.Ctx.Request.Method=="POST"{c.Data["json"]=response.Okform:=forms.TestPostForm{}ifrawData,err:=c.ParsePostForm(form);err==nil{logs.Info(rawData)//dosomething...}else{logs.Error(err)c.Data["json"]=response.BadRequest}}else{c.Data["json"]=response.BadMethod}}func(c*Test)Get(){ifc.Ctx.Request.Method=="GET"{c.Data["json"]=response.Ok//uuid:=c.GetString("uuid")//logs.Info(uuid)}else{c.Data["json"]=response.BadMethod}}

添加路由

路由一般包含版本信息,便于以后扩展和迭代

packageroutersimport("github.com/astaxie/beego"v1"go_api_demo/controllers/api/v1")funcinit(){//v1v1Test:=beego.NewNamespace("v1",beego.NSAutoRouter(&v1.Test{}))beego.AddNamespace(v1Test)}

最后分享两个go执行shell脚本的方法

实时打印输出

import("fmt""github.com/astaxie/beego/logs""io""os/exec""strings")funcasyncLog(readerio.ReadCloser)error{cache:=""buf:=make([]byte,1024,1024)for{num,err:=reader.Read(buf)iferr!=nil{iferr==io.EOF||strings.Contains(err.Error(),"closed"){returnnil}returnerr}ifnum>0{oByte:=buf[:num]oSlice:=strings.Split(string(oByte),"\n")line:=strings.Join(oSlice[:len(oSlice)-1],"\n")logs.Info(fmt.Sprintf("%s%s\n",cache,line))cache=oSlice[len(oSlice)-1]}}}funcRunShellPrintRealtime(scriptPathstring)error{logs.Info("runshellstart")cmd:=exec.Command("sh","-c",scriptPath)stdout,_:=cmd.StdoutPipe()stderr,_:=cmd.StderrPipe()iferr:=cmd.Start();err!=nil{logs.Info(fmt.Sprintf("Errorstartingcommand:%s......",err.Error()))returnerr}goasyncLog(stdout)goasyncLog(stderr)iferr:=cmd.Wait();err!=nil{logs.Info(fmt.Sprintf("Errorwaitingforcommandexecution:%s......",err.Error()))returnerr}logs.Info("runshellfinish")returnnil}

执行完成后打印输出

funcRunShell(scriptPathstring)error{logs.Info("startrunshell")cmd:=exec.Command("/bin/bash","-c",scriptPath)err:=cmd.Run()iferr!=nil{logs.Error(fmt.Sprintf("ExecuteCommand%sfailed:%s",scriptPath,err.Error()))returnerr}logs.Info(fmt.Sprintf("ExecuteCommand%sfinished.",scriptPath))logs.Info("runshellfinish")returnnil}

参考文档

Golang:https://golang.google.cn/

Beego:https://beego.me/

项目地址:https://github.com/CJFJack/go_api_demo

公众号:AIOps自动化运维

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com