Go 如何使用 Rails 集成开发 Go API

gingerhot for Railstack · 2017年09月29日 · 最后由 afly 回复于 2017年10月20日 · 10549 次阅读

go-on-rails 是一个 Rails 的 generator,已经发布为 gem,用来在 Rails 项目中集成或是开发 Golang 应用。

项目地址:https://github.com/railstack/go-on-rails

本文不会讲述详细的使用方法,所以先把现有的几个示例教程放一下:

  • 简单示例 仿照 Rails guides 里那个入门的 demo,演示如何使用 go-on-rails 创建和生成一个简单 blog 的 Go API。
  • 高级教程 如何创建一个 Golang 项目,并和 rails_admin, devise, cancancan 等集成,为 Go 项目快速增加一个管理后台。同时该项目演示了如何使用 Rails 5.1 新发布的 webpacker 工具,并利用 React 制作独立的前端界面在 Rails 中调用 Go 接口。
  • 如何从 Go API 读取 Rails session 讲解如何在一个 go-on-rails 生成的 Go 接口中读取 Rails 的 session 做用户验证

go-on-rails 做些什么

  1. 使用 Rails 创建 model,然后 go-on-rails 根据 model 的定义生成相应 Go 的数据结构以及一些基本的 CRUD 方法、添加 validation,同时也生成了分页等方法
  2. 对以上生成的这些方法生成 godoc 文档
  3. 根据 Rails 的数据库配置,生成数据库连接配置
  4. 一些命令行工具帮助自动化常见任务,比如安装默认依赖、format 生成的文件、查看 godoc 文档等

为什么使用 go-on-rails

这个工具的目标用户首先是 Rails 开发者,想进行 Golang 的学习或者是想在 Rails 项目中集成 Go API。也就是要对 Rails 熟悉,否则可能很多人不会为了尝试这个工具来学习 Rails 的。

接下来主要说一下为什么会有这个 gem,或者说使用 Rails 开发 Go 项目真的有什么优势吗?

  1. 配置管理。比如通过在 Rails 中对数据库进行配置,生成的 Go 项目会根据 Rails 的配置生成相应环境数据库的连接配置。同样,其它的配置也可以利用 Rails 的配置来共享使用。

  2. 利用 Rails 丰富的工具链,比如用 rails db:seed 写入测试数据,利用 rails console 对数据进行测试等,以及数据库管理部分的 rails db:* 等操作。

  3. 方便对数据库进行各种 migrations 的管理,不用手写 schema,延续了 Rails 程序员开发过程中对数据库的操作习惯。

  4. model 的定义同样会方便 Rails 开发者的习惯,go-on-rails 会对 association 和 validation 中的大部分生成操作函数。

  5. Rails 5.1 中 webpacker 的发布,更突显了 Rails 在做“Web 集成开发环境”方面的新能力。更多前后端分离系统的出现,使在 Rails 中集成 Go API 的重复工作量大大降低,只需要修改一下调用的链接可能就完成了一次系统改造。另外,使用 webpacker 可以很方便的制作前端页面来调用 Go API。关于如何使用可以看这里的教程

  6. 对于某些中小规模的系统,通过在 Rails 中集成 Go API 可以改善一些接口的性能,而不需要对系统架构进行重构。

go-on-rails 目前还在开发过程中,欢迎各种参与和 pr。


【UPDATE】本项目无意间获得了 matz 的转推加持:https://twitter.com/yukihiro_matz/status/1031768139858501632

一种新思路。。。

👍 已 star。

好奇问个问题,为什么放弃 rails 选择了 go?

yfractal 回复

还是利用 Rails 环境开发 Go,明显是没有放弃 Rails 哦 😄

gingerhot 回复

哈哈,我用词不当。我是想问,为啥不是直接用 rails 开发呢?是因为预期的并发比较大吗?

我应该算是 rails 粉,不过 rails 肯定是不完美的,所以想知道这些问题的所在。

yfractal 回复

其实就是性能问题了,Go 因为语言自身的特性做服务的优势还是很明显的。

gingerhot 回复

今天李笑来通过学习学习在学习的公众账号发布了一篇关于用 Go 打造区块链基础原型的文章,也可以看一看,我个人觉得后期的数据会成为更加快速的发展状态,除了关注现在的知识付费和区块链以外,后期的发展还是会上升到下一个混合现实的交互场景当中去,感觉现在学习的知识体系越来越不够用了;

xiaoweirails 回复

是一篇翻译的文章,浅显易懂。对于入门 Go 和 理解区块链原理都很有帮助。

其实之前有想法在 go-on-rails 中加入对 hyperleger 的支持,当然这还需要再看下了。

gingerhot 回复

Go Hack 2017 黑客马拉松可以去看看,我现在也在看 Go,准备用 Go 做个项目参加这个 Go Hack 比赛。http://huiyi.csdn.net/activity/product/goods_list?project_id=3664

gingerhot 回复

多谢多谢,😄

还想再多了解一点,大约并发上到什么程度就需要考虑用 go 呢?我觉得我的问题有点多。。。

yfractal 回复

其实这是个无解的问题。因为没有一个量化说系统到了什么程度时就需要何种语言出场了,这不是语言层面的问题。因为 Rails 服务大型项目的案例也很多。

我上面说的是“Go 在做服务方面有优势”,这个优势包括很多东西。比如 Go 在语言层面原生支持的并发模型,它自带的 http 包对于一个入门小白也可以写出并发 Web 服务,而 Rails 在这方面需要额外的服务器的支持,比如 puma 等。毕竟还有很多程序员并不是很擅长把一个程序改成并发的。所以说 Go 语言的方案也只是一种选择而已。

如果想了解更多,建议还是去学习一下 Go。

yfractal 回复

最近看到几篇文章,都是从 Rails 迁移到 Go 的案例。这些文章基本都是在 2015 年发的。希望能借助解答上面的问题:

gingerhot 回复

太感谢了! 并发、函数式编程,Go、Elixi,这些其实最近都有关注。就是想走出去,多了解一些 😄 。并发编程很有意思!

再次感谢分享!

13 楼 已删除

这真是刚打瞌睡就送来了枕头,楼主是咱的贴心人👍 👍 👍

需要 登录 后方可回复, 如果你还没有账号请 注册新账号