# 做云自缚——应用上云之路

今天扯个闲篇，说说应用上云的事情。

最近这几年，一直都在围着“应用上云”这四个字转悠，看到很多成功的和不太成功的应用上云活动，是的——一个失败的都没有，所以云原生真是厉害，对吧？

应用上云成功了会怎么样呢？一般成功案例会共享的几个好处：

- 应用更快交付、能用更高的频率迭代
- 更高的应用密度，更有效地使用资源
- 监控日志等可观察性方面的增强
- 弹性伸缩在削峰填谷方面的卓越表现
- ...

如果用上了 Service Mesh 或者类似微服务治理技术，多半还会提到分布式追踪、熔断、限流等的好处。

然而面对这种种诱人后果的展示时，很多像我一样的中老年 IT 人可能都会发出一句常见的老年人诘问：这些东西以前没有吗？

- Jenkins 的前身 Hudson 诞生于 2004 年，2011 年定名 Jenkins。
- Maven 大约诞生于 2001 年。
- SonarQube 大约诞生于 2007 年。
- Zabbix 也二十多岁了。
- SpringCloud 其实跟 Kubernetes 几乎同龄。

所以是什么让云原生的林林总总从厚重的历史中脱颖而出的？我认为是 Docker，那个 “Build once, Run anywhere, Configure once, Run anything” 的 Docker。在 Docker 出现之前，IT 界为了造词疲于奔命，从 CMM 到敏捷、从 CI/CD 到 DevOps，另外还有十二要素、微服务、重构等等的方法。而 Docker 出现之后，随着 Google 不断的勒索，Docker 提出的容器镜像打包和运行标准，逐步“贡献”出来成为开放标准，CxI 已经成为云原生世界中最重要的标准群。

名言说：无产阶级失去的只是枷锁，而他们获得的将是整个世界。而我理解的云原生，跟这个口号恰好相反——软件通过自投罗网的方式，交出部分自由，获得自称云原生的资格。“自废武功”的应用有多不自由呢？

- 要清楚地了解从操作系统、构建系统、软件库等的依赖，用内聚的方式进行打包，形成单一的容器镜像（文件）
- 为了能在通用且较为低配的容器节点上顺利运行，通常需要对软件的资源规模有一个足够进行量化的认识，甚至需要为了资源、容量等问题对应用进行拆分。
- 为了进行扩缩容，微服务提供的服务接口要努力摒弃状态，实现幂等，甚至还要完善健康检查、优雅退出等以前不关注的边角料功能。
- 甚至连临时文件和日志都不能随意输出了。
- ...

在应用屈服了之后，过去一直无法施展拳脚的很多方法和工具也焕发了新生——例如 DevOps、敏捷、微服务，甚至还诞生了更具通用性的服务网格、更大跨度的分布式追踪等“更厚”的基础设施。这些先进又复杂的底层设施，因为面对的是具备通用性的业务应用，也具备了明确的支持能力。

## 结论

好好打镜像，好好写 YAML，我们都有美好的未来。
