使用 Go 语言创建 REST API 和微服务

Go转角遇见的2015年降低门槛日历系列正式进入第二天。

今天要写的事情

    • APIを提供するためのコード

 

    • APIを利用するためのコード

 

    • マイクロサービス (・∀・)ィィイイ!! かもしれない

 

    やれなかった / この記事には書いていないこと

以下是使用示例的代码。请参考 README 中的步骤以在您的设备上启动。

提供API所需的程式码

我想告诉你,虽然Go语言有一些适用于API的不错的框架,但是这次我想要告诉你,即使不用这些框架也可以轻松地创建API服务器。

只需要其中一个选项就可以中文转述如下:
基于Go语言的 “A RESTful Micro-Framework” 框架为基础,
通过对其进行修改和调整,实现了所需功能并展示在样例中,
记录了如何编写API服务器的方法。

    1. 首先,我们需要定义API端点应该实现的接口。

 

    1. https://github.com/pottava/golang-microservices/blob/master/app-dbio/app/http/restapi.go#L32

 

    1. 我们定义了一个默认实现,它将导致所有的StatusMethodNotAllowed错误。

 

    1. https://github.com/pottava/golang-microservices/blob/master/app-dbio/app/http/restapi.go#L51

 

    1. 每个API端点都应该定义一个包含第二个结构的结构体。

 

    1. https://github.com/pottava/golang-microservices/blob/master/app-dbio/app/controllers/user.go#L18

 

    1. 然后,只需编写所需实现的HTTP方法的逻辑即可。

 

    https://github.com/pottava/golang-microservices/blob/master/app-dbio/app/controllers/user.go#L22

真简单啊!

如果想要将API设计成RESTful风格,可以根据资源ID进行分支处理,就像这样。
如果想要从请求体中提取JSON,可以按照如下方式进行实现。
如果想要从查询字符串中获取参数,可以按照queries.Get(“limit”)这样的方式编写,尽管在示例中并没有演示这一点。

对于方法名奇怪,或者本来就是一个API服务器的话,包名应该是resources而不是controllers。我不接受这样的暖心留言,请原谅。

用于使用API的代码

只要是RESTful API,我认为返回值应当是JSON2。在 https://github.com/pottava/golang-microservices/blob/master/app-webui/app/models/api.go#L40 这个链接中,我会将结构体指针作为参数resJSON传递给它。如果你希望接收的不是JSON而是字符串,可以传递空值nil给它,并将其作为函数的返回值接收。

当你从数据获取的API中接收到用户信息时,可以按照以下方式进行操作。
https://github.com/pottava/golang-microservices/blob/master/app-webui/app/models/user.go#L29

顺便提一下,虽然这是细枝末节的事情,但我认为如果服务器端支持,就应该有一个压缩解压逻辑。

顺便说一下,在这个示例中,API结果中包含了”封套”,但如果没有的话,也许更简单会更好。这完全取决于个人喜好!

可能是一个令人兴奋的微服务!(・∀・)ィィイイ!!

我喜欢使用docker-compose3,通过多个小型服务来构建一个应用程序,真的非常棒。

    • コンパイルがより高速: Goとはいえ、モノリシックにつくるとコンパイルに数秒かかるように..

 

    • APIを RESTfulにしやすい: セッションの分離 & サーバ間のみにアクセス制限するのがかんたん

 

    • 一部サービスの更新、引き継ぎ、モック化、エンドポイント変更、開発言語の変更などが容易

 

    サービスが依存する引数・環境変数が明確になって管理がらくになる

诸如此类,等等。

顺带一提,由于将用户认证作为单独的服务的影响,我们对CORS和Ajax的设置进行了一些不常用的配置,并将其记录下来。

https://github.com/pottava/golang-microservices/blob/master/app-authentication/app/http/http.go#L133:
这是一个链接,链接到 GitHub 上的一个名为“golang-microservices”的项目中的“app-authentication”文件夹中的“http.go”文件的第133行。

https://github.com/pottava/golang-microservices/blob/master/app-webui/app/assets/js/app/index.jsx#L7:
这是一个链接,链接到 GitHub 上的一个名为“golang-microservices”的项目中的“app-webui”文件夹中的“assets/js/app/index.jsx”文件的第7行。

必须两边都写才能交出Cookie啊!(无奈之感)

我无法做到 / 这篇文章没有提到的事情

限制速度

我认为API提供方最好有一个节流功能。实际上,当我写了实际的代码后,设置值周围变得复杂,所以我在这个例子中省略了全部内容,但我正在使用这个。http://gopkg.in/throttled/throttled.v2

指数后退

这里谈论的是API利用方面的问题,即错误时的重试算法。
也可以称为指数退避,这非常重要。
以下是关于AWS的文章,不熟悉的朋友可以参考。
在AWS上进行错误重试和指数退避。

所以,我正在根据这些参考资料尝试着实施这个。
由于测试不完善,所以我也从这次的样本中剥离了它。

希望能够好好使用其中之一。希望在AdoKale中能够找到一些实例使用。

要使用docker的新网络功能,docker-compose需要在v1.5或更高版本上才能运行。

很抱歉,我没有写过XML的例子。

我觉得在没有docker-compose的情况下创建微服务太困难了。

bannerAds