• 为什么用 RPC at 2016年7月26日

    Coding 已经在生产环境大量使用 grpc + protobuf 作为内部通信的框架和协议,我们最初的 rpc 实现也是构建在 protobuf 上的,但只支持 java,后面发现项目越大使用的语言越多,跨语言通信成了一个问题,刚好那时候 grpc 也开源了,我们就慢慢的从一些小的服务开始切换到 grpc 上,目前大部分内部组件通信已经是通过 grpc 进行了。

    我们最初采用 grpc 的目的就是为了规范接口代码和多语言支持,还有它的社区和开发也比较活跃。

    简单列举一些优缺点和对比:

    • 使用 protobuf 作为序列化库, 专门的 IDL 语法也使得接口定义更加简洁规范了,protobuf 内置支持兼容性处理,proto3 支持 json 序列化,更容易和其它系统交互;
    • 原生支持各种编程语言,加上自动生成 rpc 的服务器端和客户端代码框架,省去了自己编写的麻烦,把更多精力放到业务逻辑实现上;
    • 底层数据传输基于 HTTP/2,所以也会带来 flow control, header compression 等 HTTP/2 特性,数据传输还支持压缩、加密、重试(支持 Backoff)等,性能相应该会有一定提升(没有做测试);
    • 原生的 负载均衡 支持,更加方便扩容(此功能目前已设计完毕,并不是所有语言都已完全实现,所以我们目前使用的还是是自己的实现);
    • 开发调试就不像 REST 接口那样有很多现成的命令行或图形界面工具可以使用,grpc 的数据通信传输的是二进制的 protobuf 数据,不利于调试,而且 grpc 的 cli 还不够完善,所以我们测试基本上都是通过写代码进行的;
    • 作为吃螃蟹的人,肯定是会踩到一些坑的,我们在使用过程中也遇到了一些问题,但没有特别严重的。

    grpc 目前还处于 Beta 阶段,但对外的 API 已经稳定,而且已经有很多知名项目在采用了,比如 etcd v3 和 docker containerd

  • 看到有对 Coding 的经验感兴趣的,我也来分享一下(图片来自 coding blog):

    这里主要对一些图上可能不太清楚的部分展开一些介绍:

    • 通过 NFS 共享仓库的存储到不同的 git worker 上(分担 CPU 和 IO),每个 worker 上运行 rpc server(GitD) 和 RepoManager
    • Git Server 是 http/ssh/git 协议的 router,负责认证和转发请求给 rpc server( GitD),也是多实例的
    • Git 服务 完全不依赖 web 服务,即使网站挂了也只会影响到网页上的代码浏览,而不会影响到 git 客户端的操作
    • RepoManager 主要是给 web 端对 git 仓库的操作提供 rpc 服务的,比如网页上的代码浏览和 MR 功能都是它的使用者
    • 同样的,因为使用了网络存储,必然会导致性能有所下降,我们也做了大量的缓存以提升 web 端服务的响应速度

    Coding 后端主要的开发语言是 java 和 go,当然也有少量的 ruby 组件,基本上所有组件都是以微服务的方式运行,相互之间使用 rpc 来通信。Git Server 和 GitD 组件完全使用 go 语言编写,相信大家通过 ssh 客户端的调试信息也可以看到,ssh 协议的路由是通过 golang 的 crypto/ssh 库实现的(公钥存储也是在数据库里的),RepoManager 和 web 后端采用 java 语言编写。

    更详细的介绍可以看 coding blog 里这篇关于代码托管架构的文章:CODING 代码托管架构升级之路

  • CDN 是不是有问题?经常连接超时。

    Gem::RemoteFetcher::FetchError: Errno::ETIMEDOUT: Operation timed out - SSL_connect (https://gems.ruby-china.org/gems/fog-vmfusion-0.1.0.gem)
    Installing fog-atmos 0.1.0
    Installing fog-ecloud 0.3.0
    Installing fog-profitbricks 0.0.3
    Installing fog-terremark 0.1.0
    Installing fog-voxel 0.1.0
    Installing fog-aws 0.1.1
    Installing fog-brightbox 0.8.0
    Installing fog-radosgw 0.0.4
    Installing fog-sakuracloud 1.0.1
    Installing fog-serverlove 0.1.2
    Installing fog-softlayer 0.4.7
    
    Gem::RemoteFetcher::FetchError: Errno::ETIMEDOUT: Operation timed out - SSL_connect (https://gems.ruby-china.org/gems/fog-storm_on_demand-0.1.1.gem)
    An error occurred while installing fog-vmfusion (0.1.0), and Bundler cannot continue.
    Make sure that `gem install fog-vmfusion -v '0.1.0'` succeeds before bundling.
    

    dig 了下,貌似解析回来的是个加拿大的 IP 地址:

     ~ dig @114.114.114.114 gems.ruby-china.org
    
    ; <<>> DiG 9.10.3-P4 <<>> @114.114.114.114 gems.ruby-china.org
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53557
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;gems.ruby-china.org.       IN  A
    
    ;; ANSWER SECTION:
    gems.ruby-china.org.    553 IN  CNAME   12f7b4-0.ca.1251971244.clb.myqcloud.com.
    12f7b4-0.ca.1251971244.clb.myqcloud.com. 553 IN A 45.113.69.41
    
    ;; Query time: 51 msec
    ;; SERVER: 114.114.114.114#53(114.114.114.114)
    ;; WHEN: Wed Apr 06 11:05:44 CST 2016
    ;; MSG SIZE  rcvd: 106
    
  • 好像不支持 iPad?

  • 感觉这个页面好危险的样子,没做限制?https://ruby-china.org/?pp=help

  • #25楼 @lgn21st 多谢理解,此事到此为止了 😄

  • #22楼 @nouse 你好像又说远了,我只是个开发,其他的事情还平时还真不管。以下纯粹是个人观点:人家都已经认错了,你们就不能给个机会?我今早才看到这里的帖子,可能不是非常了解事情始末。请问哪里在博同情了,人家道歉了,你们要求公司号道歉人家也照做了,非得闹到把人送到监狱你才满意?虽然大家的出发点都是好的,但也要静下心来好好交流才能解决问题,不要一味的批判,给人留点余地,谢谢。

  • #20楼 @luikore 谢谢你的相信。虽然知道会有人来说洗地,但还是来了,站在公司角度可能更多是大事化小,站在个人角度,实在看不下去一个还不能算很入行的市场妹子这么被。。

  • 这个问题明显被盖上 “性别歧视” 的帽子来上纲上线和扩大了,文章或许有些偏离活动主旨,但也只是宣传的角度不是很好,绝没有某些人认为的恶意,都适可而止吧。

  • 在 coding.net 上部署问题 at 2015年8月04日

    #7楼 @uynil这里 发讨论把你的问题描述清楚。