NuLab Offices

生产力软件公司 Nulab 以微服务和 Kubernetes 提高了自己的生产力

Challenge

Nulab 的主要任务是构建生产力软件,但却发现自己的生产力被绘图产品 Cacoo 的旧版单体式 Java 应用程序拖了后腿。“我们的技术太老,”软件工程师 Jay Chen 说,“Cacoo 越来越大,真的很难找到系统里所有可能存在的漏洞。但我们必须要部署,还要知道它的运行情况,压力真的很大。”增加新特征花费的时间很长,加上公司在三个大洲都开设了办事机构,工程师们需要跨时区开发同样的应用程序。

Solution

Nulab 开始把单体应用程序拆分成微服务,选择 Kubernetes 进行编排。

Impact

产生影响:部署新代码到生产比以前快了 6 倍:从 40 分钟减少到 6 分钟。“这就大不一样了,”Chen 说,“拆分成微服务之前,每一个细小的变化都要等一个小时才能部署。”Kubernetes 还提高了可靠性。“我们的 SRE 团队不再需要不停地登录服务器,检查服务器宕机的原因,然后再重启服务器,”他说,“这些事情 Kubernetes 就都做了,它有自愈功能。如果微服务出现故障,不需要停机就能自动重启。”

挑战:
行业:
地点:
云类型:
产品类型:
出版:
September 29, 2020

使用的项目

Envoy
gRPC
Kubernetes

一些数据

部署新代码到生产比以前快了 6 倍

部署只需 6 分钟,不再是 40 分钟

新工程师加入只需 1 天,不再是 1 周

Nulab 用生产力工具 Backlog、Cacoo、Typetalk 服务全球 400 万用户。“我们的使命是让大家不管身处何地,都会觉得生产力很有趣、很享受,”营销总监 Bing Han 说,“很多客户在全球各地都有办公室,他们都用我们的工具沟通。”

但 Nulab 却发现自己的生产力被运行在 AWS 上的 Cacoo 旧版单体式 Java 应用程序拖了后腿。“我们的技术太老,”软件工程师 Jay Chen 说,绘图工具 Cacoo 是 7 年前装在 Java 6 上的,每一次版本升级都要一个工程师花整整2 周时间,还要额外再花 1 周时间测试。“Cacoo 越来越大,真的很难找到系统里所有可能存在的漏洞,”他说,“但我们必须要部署,还要知道它的运行情况,压力真的很大。”

应用程序扩展很难,系统增加新特征或新功能也很难。“每一个细小的变化都要花费更长的时间,”Chen 说。

此外,Nulab 自 2004 年在日本创立之后,近年来将办公机构拓展到了 3 个大洲。2017 年,Nulab 的技术领袖开始寻求工程师全球办公解决方案。团队决定把单体应用程序拆分成 Go 语言写的微服务。“微服务对每个成员都绝对必要,这样就能跨时区开发相同的应用程序了,”Chen 说。迁移已经完成大约 80% ;但还有一个微服务在用 Java。“这就是微服务的魅力所在,”他说。

团队曾考虑用 Docker Swarm 做编排,但后来决定采用 Kubernetes。“Kubernetes 能支持我们需要的更多功能,”Chen 说,“Kubernetes 客户端都整合了 API,这是一个用户友好型 UI,可以用我们的证书登录。kubectl 是一个非常有用的指令,使用很简便。”

Nulab 团队使用 kops,为 Cacoo 应用在 AWS EC2 上创建自己的 Kubernetes,堆栈中还有其他 CNCF 技术:Prometheus、Envoy 和 gRPC。

凭借 Kubernetes,Nulab 取得了很好的结果。部署新代码到生产比以前快了 6 倍:从 40 分钟减少到 6 分钟。“这就大不一样了,”Chen 说,“拆分成微服务之前,每一个细小的变化都要等一个小时才能部署。”

Kubernetes 还提高了可靠性。“我们的 SRE 团队不再需要不停地登录服务器,检查服务器宕机的原因,然后再重启服务器,”他说,“这些事情 Kubernetes 就都做了,它有自愈功能。如果微服务出现故障,不需要停机就能自动重启。”

“Kubernetes 在所有客户端都整合了 API,这是一个用户友好型 UI,可以用我们的证书登录。kubectl 是一个非常有用的指令,使用很简便。”

— Nulab 软件工程师 Jay Chen

正如预期,微服务提高了 Nulab 分布式团队的工作效率。“现在我们能给每个微服务分配职责和所有权,所以就不会再有代码合并冲突了。工作顺利了,还给我们省下了大把时间。”

新的架构和 Kubernetes 使 Cacoo 团队增加产品新特征成为可能,新增加的事件系统会在一个用户更新团队的 Cacoo 图表时,向团队所有成员发送通知。之前,“很难创建这样的系统,所以我们推迟了计划,”Chen 说。现在有了微服务架构,“创建流程完善这个特征很容易。”

从第一天开始,Nulab 的软件工程师就有“简便许多”的使用体验,Chen 说。“用单体应用程序的时候,我们要给每个工程师都安装 Java 和所有的产品服务器。Java 版本是我们面对的一个大问题。版本不对,就没法启动。所以每一次有新工程师加入,我们就得搭上一周时间。”

而现在,只需要一天。Nulab 的本地开发环境用 Docker Compose。“新加入的工程师只需要克隆一份报告,所有内容就都安装、创建到容器里了,不会有任何问题,”Chen 说,“对工程师和 SRE 团队来说,管理变得简单了。kubectl 指令能解决一切问题。”

“现在我们能给每个微服务分配职责和所有权,所以就不会再有代码合并冲突了。工作顺利了,还给我们省下了大把时间。”

— Nulab 软件工程师 Jay Chen

Chen 给其他考虑使用微服务和 Kubernetes 的用户提出如下建议:“你不能仅是拆除旧版应用,然后马上就开始使用微服务。你要慢慢迁移,检查是否所有功能都能正确实施。所以最好的方法就是一个一个地转为微服务。”

鉴于 Nulab 仍在迁移过程中,Chen 建议使用 RabbitMQ 进行微服务和旧版应用程序之间的通讯。“我觉得继续使用旧版应用程序是一个不错的解决方案,这样在旧版应用程序和微服务之间,不会有过多依赖,”他说。

Nulab 团队最终希望实现完全迁移,全部改成微服务,这样就能完全移除旧版应用了。Chen 说:“这给我们省下一大笔钱。” Backlog 项目管理工具正在准备进行下一次迁移,会给整个 Nulab 公司节约不少费用。“最初只是在 Cacoo 上试验一下,我们觉得试验非常成功,”Chen 说,“所以我们要把解决方案推广到公司其他团队。”