使用 Go 语言创建 REST API 和微服务
Go转角遇见的2015年降低门槛日历系列正式进入第二天。
今天要写的事情
-
- APIを提供するためのコード
-
- APIを利用するためのコード
-
- マイクロサービス (・∀・)ィィイイ!! かもしれない
- やれなかった / この記事には書いていないこと
以下是使用示例的代码。请参考 README 中的步骤以在您的设备上启动。
提供API所需的程式码
我想告诉你,虽然Go语言有一些适用于API的不错的框架,但是这次我想要告诉你,即使不用这些框架也可以轻松地创建API服务器。
只需要其中一个选项就可以中文转述如下:
基于Go语言的 “A RESTful Micro-Framework” 框架为基础,
通过对其进行修改和调整,实现了所需功能并展示在样例中,
记录了如何编写API服务器的方法。
-
- 首先,我们需要定义API端点应该实现的接口。
-
- https://github.com/pottava/golang-microservices/blob/master/app-dbio/app/http/restapi.go#L32
-
- 我们定义了一个默认实现,它将导致所有的StatusMethodNotAllowed错误。
-
- https://github.com/pottava/golang-microservices/blob/master/app-dbio/app/http/restapi.go#L51
-
- 每个API端点都应该定义一个包含第二个结构的结构体。
-
- https://github.com/pottava/golang-microservices/blob/master/app-dbio/app/controllers/user.go#L18
-
- 然后,只需编写所需实现的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的情况下创建微服务太困难了。