Gem Sails - 构建 Thrift Server 实现跨语言之间调用

huacnlee · 2014年12月30日 · 最后由 jimrokliu 回复于 2014年12月30日 · 4584 次阅读

什么是 Thrift

The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.

Thrift 用于实现跨语言之间调用的服务框架,它支持 C++, C#, Cocoa, D, Delphi, Erlang, Haskell, Java, OCaml, Perl, PHP, Python, Ruby, NodeJS, Go, Smalltalk... 非常多热门的语言,可以直接基于写好的接口描述文件 (IDL) 生成目标语言的本地化代码。

我们现在目前的项目至少有 C, Java, Ruby, PHP 期间各种语言有各种不同团队负责不同侧重点的服务。 团队合作的时候,我们用 Thrift 来实现跨语言之间的调用。

所以基于 Thrift 的 Ruby 库实现了一套服务器框架,让我们可以快速构建一个类似 Rails 一样易用、可维护的 Thrift Server,内部非常多的实现都和 Rails 一模一样,你可以完全用 Rails 的使用习惯来开发。

今年的 RubyConf China 2014 上,@ 罗昕 曾经讲过类似的主题《RailsService: Create microservices with(or without) Rails》,当然此 Gem 有受他的启发

Sails 是从我们的实际项目上面抽出来的,断断续续发布了好几个版本,也解决了 N 多 Real world 环境的问题,比如 Capistrano 部署重启载入的问题,Linux 发送 kill -USR2 $pid 重启的问题等等

功能

  • 让你像在用 Rails 一样配置、开发、使用
  • 进程管理,守护进程(Thrift 默认没有这些东西)
  • I18n 支持;
  • 尽可能兼容 Rails 接口,以便能支持一些 Gem,比如我们已经在我们的项目上面同时用 Sails 和 second_level_cache;
  • Migration 功能;
  • 同时支持 ThreadPool 和 NonBlocking 模式;
  • sails console;
  • Sails.cache, Sails.logger, Sails.root 之类和 Rails 一模一样的东西
  • 熟悉的 Rails log 打印信息

还有待解决的

  • 开发模式自动重新载入新的代码,以及部署模式收到 USR2 信号软重启;
  • 更多的 Rails 细节;

一些例子

打信息:

Processing by UserService#find_user_quota at 2014-12-29 18:36:52 +0800
  Parameters: {:req=><ThriftServer::CommonRequest user_id:36, session_id:"afa4b600fd2f8a15baece2e365c0cf6f", ip:"127.0.0.1">}
  UserQuota Load (9.3ms)  SELECT  `user_quota`.* FROM `user_quota` WHERE `user_quota`.`user_id` = 36 LIMIT 1
Completed 200 OK in 13.73ms (DB: 9.3ms)

一些命令

$ sails s
$ sails stop
$ sails restart
$ sails s --daemon
$ sails c
irb> Sails.root
 => #<Pathname:/Users/jason/work/foo> 
irb> Sails.root.join("log")
 => #<Pathname:/Users/jason/work/foo/log> 
irb> Sails.cache.write("foo", 1)
 => true 
irb> Sails.cache.read("foo")
 => 1
irb> reload!

项目地址

https://github.com/huacnlee/sails

Build Status Gem Version

Node 有一个 Sails 框架,刚看到标题的时候还以为这货改行了呢。不过大大这个东西很好,很有意思,关注一下。

赞 将来用 sails 开发面向其他语言的服务,可能会跟跟用 rails 开发 web 应用一样流行

其实是 RPC,哈哈

有意思,先马后看

要跟团队都招呼下,各类语言的保留词多避免下,以前用 ruby thrift 对接 c++ 服务遇到好多。

还以为是是罗老师的东西开源了~

我也以为是 node 的 sails...

我也想过类似的架构,但我有一些服务的调用是异步,我更想用 ZMQ 的方式去做。

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