DZone>Web Dev Zone>首次使用Render and Go软件
首次使用Render和Go
看看使用Go创建一个新的API,然后将其部署到Render PaaS的效率有多高,这两者都是第一次使用零开发。
CORE -
1月26日,22日 - Web Dev Zone -教程
喜欢 (3)
评论
保存
鸣叫
11.76K浏览次数
加入DZone社区,获得完整的会员体验。
我的记忆能力会让我的妻子发疯。本周早些时候,我给她讲完一个我从长期记忆中回忆起来的故事后,她问了我两个问题。
-
你是怎么记住这种事情的?
-
为什么你会记得那段记忆?
说实话,我不知道如何回答她的问题,只知道我在生命的早期就认识到这种能力。我们都同意,如果有一个 "无用的琐事节目",我将是世界冠军......双手奉上。
我觉得我第一次经历的一些事件往往被索引在我大脑的长期腔室中,后来成为我的故事来源,我觉得有必要与她分享。就职业影响而言,不需要花太多精力就能回忆起我第一次使用一种编程语言或开始使用一种服务或框架。
读到Render提供的服务--一个承诺 "零开发 "的服务--让我想去试一试它。看了看支持的语言列表,我看到了一个用对我来说很陌生的编程语言创建服务的机会。
因此,我决定试一试Go编程语言,希望能在我的长期记忆库中增加一个新的存款。
魔术8球服务
为了使事情变得有趣,考虑一个例子,美泰公司要求创建一个RESTful API,模仿1946年发明的魔术8球玩具。
对于那些不知道的人来说,魔力8球是一种新奇的物品,可以执行基本的算命任务。8号球的图像朝上,拿着球的人问一个 "是 "或 "否 "的问题,然后把它翻过来,显示出答案。答案神奇地从玩具内的黑色海洋中漂浮到顶部。
最初的设计包含了20个独特的答案,接受标准是在RESTful API中只允许这些回答。
十个正面的答案用绿色的子弹注明,剩下的十个是不确定的(黄色)和负面的(红色)答案的平等组合。
API的消费者只需要发出一个标准的GET请求,它将从可能的选项列表中返回一个随机的答案。为了验证,美泰公司还希望有第二个端点来检索这个新服务的所有可用答案的列表。
通过我的设计,我们可以通过以下端点来满足这些要求。
-
GET
/answer- 随机返回20个可用答案中的一个 -
GET
/answers- 返回所有20个可用答案的列表。
开始使用Go
在访问Go网站的下载页面时,我注意到安装过程与开始使用Java编程语言非常相似。安装程序采用了类似于向导的设计,我基本上只需要点击按钮来浏览整个过程。完成后,我用下面的终端命令来验证安装是否成功。
壳牌
╭─me@johnjvester ~
╰─$ go version
go version go1.17.6 darwin/amd64
使用IntelliJ IDEA,我添加了Go插件,并使用文件|新建|项目...命令开始了一个新项目。
项目名称为magic-eight-ball ,看起来很适合这项工作。
经过一些研究,我发现Gin网络框架提供了用Go编写的RESTful API所需的功能,所以我用以下命令安装了它。
Shell
$ go get -u github.com/gin-gonic/gin
为了在我的源代码中引用Gin,我只需要包括以下导入。
Go
import "github.com/gin-gonic/gin"
现在我们准备开始构建Magic 8-Ball API。
创建Magic 8-Ball API
我想做的第一件事是建立API的数据端。在这个例子中,下面的JSON结构将构成提供答案时的响应体。
JSON
{
"id" : number,
"response" : string
}
在Go中,这个JSON有效载荷被定义(如下图所示)并添加到main.go 文件中。
Go
type response struct {
ID int `json:"id"`
Response string `json:"response"`
}
由于所有的数据都是静态的,我将标准答案添加到main.go 文件中。
Go
var responses = []response{
{ID: 1, Response: "It is certain."},
{ID: 2, Response: "It is decidedly so."},
{ID: 3, Response: "Without a doubt."},
{ID: 4, Response: "Yes definitely."},
{ID: 5, Response: "You may rely on it."},
{ID: 6, Response: "As I see it, yes."},
{ID: 7, Response: "Most likely."},
{ID: 8, Response: "Outlook good."},
{ID: 9, Response: "Yes."},
{ID: 10, Response: "Signs point to yes."},
{ID: 11, Response: "Reply hazy, try again."},
{ID: 12, Response: "Ask again later."},
{ID: 13, Response: "Better not tell you now."},
{ID: 14, Response: "Cannot predict now."},
{ID: 15, Response: "Concentrate and ask again."},
{ID: 16, Response: "Don't count on it."},
{ID: 17, Response: "My reply is no."},
{ID: 18, Response: "My sources say no."},
{ID: 19, Response: "Outlook not so good."},
{ID: 20, Response: "Very doubtful."},
}
为了利用响应变量,我在main.go 文件中添加了两个函数。
转到
func getAllAnswers(c *gin.Context) {
c.IndentedJSON(http.StatusOK, responses)
}
func getRandomAnswer(c *gin.Context) {
rand.Seed(time.Now().Unix())
c.IndentedJSON(http.StatusOK, responses[rand.Intn(len(responses))])
}
getAllAnswers() 函数只是简单地以JSON格式返回响应列表,而getRandomAnswer() 函数则从20个选项中随机抽取一个,并以JSON格式返回该值。
最后,main() 函数设置了服务所使用的端点和端口。
浏览器:Go
func main() {
router := gin.Default()
router.GET("/answers", getAllAnswers)
router.GET("/answer", getRandomAnswer)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
if err := router.Run(":" + port); err != nil {
log.Panicf("error: %s", err)
}
}
这就是满足美泰公司制定的验收标准所需的全部内容。
为了启动该应用程序,我们从终端运行以下命令。
Shell
╭─me@johnjvester ~/projects/jvc/go/magic-eight-ball
╰─$ go run .
显示的日志包括下面提到的那些。
Shell
[GIN-debug] GET /answers --> main.getAllAnswers (3 handlers)
[GIN-debug] GET /answer --> main.getRandomAnswer (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080
我可以用以下命令发送curl请求来测试API。
Shell
╭─me@johnjvester ~
╰─$ curl http://localhost:8080/answer
这是我收到的响应。
Shell
{
"id": 6,
"response": "As I see it, yes."
}%
在Go服务运行没有任何问题的情况下,我把代码作为一个新项目上传到GitLab上。
现在我准备看看Render是如何工作的。
通过GitLab部署到Render
开始使用Render是快速、简单和免费的。我只是选择了使用我的GitLab凭证,这样在选择要部署的项目时就很容易了。
为了开始使用,我在Render仪表板上选择了 "新建 "按钮,并选择了Web服务选项。
我在GitLab上选择了我的magic-eight-ball 项目。
在Render平台中,我决定将我的服务称为jvc-magic-eight-ball ,并保持所有其他选项的默认值。
向下滚动,我选择了让这个服务在免费计划中运行。
然后,我点击了创建网络服务按钮。在几分钟内,Render仪表板显示我的服务已经启动并运行。
我向Render上我的服务的URL发送了一个请求(https://jvc-magic-eight-ball.onrender.com/answer),我收到了以下响应。
JSON
{
"id": 5,
"response": "You may rely on it."
}
仅仅点击了几下,我就把我的第一个用Go编写的RESTful API部署到了Render平台上--这并没有产生任何费用。更重要的是,Render的方法不需要任何DevOps技能或知识就能完成我的任务。
总结
这篇文章的引言谈到了我在几年(如果不是几十年)后保留和回忆历史事件的能力。事实上,整个实验从开始到结束花了我不到一个小时的时间,这当然值得成为另一个这样的事件。
从2021年开始,我一直试图按照以下的使命宣言生活,我觉得这可以适用于任何IT专业人士。
"将你的时间集中在提供特性/功能上,以扩大你的知识产权的价值。充分利用框架、产品和服务来处理其他事情。
- J. Vester
在这篇文章中,我不仅能够用很少的源代码快速产生一个功能性的API,而且我还能够通过执行一系列的小步骤将项目部署到云供应商。承诺的是Zero DevOps,而Zero DevOps已经实现。这使我能够集中时间为我的客户提供功能。
如果你对完整的源代码感兴趣,只需浏览一下GitLab。
知道我目前有API和应用程序在Heroku生态系统中运行,我计划在未来几周开始研究从Heroku到Render的转换是什么样的。到目前为止,我对Render所能提供的东西印象深刻。
祝你有一个非常好的一天!
主题。
Go、 Golang、 Render、 魔术、 8球、 rest api
DZone贡献者所表达的观点属于他们自己。
DZone上的热门话题
评论