第一个是无状态应用,这是大多数互联网公司已经有了,这类应用负载均衡不需要做会话保持,大量的状态都是放在共享的 Redis 或数据库中,这种应用能快速上云,能快速部署、弹性伸缩、自动容错,因为容器比较小,而且同时在一个集群中混合部署很多业务,提高资源利用率。

如果是有状态的应用,可以实现 X86 化,跑到虚拟机中。但是负载均衡是需要做保持的,一定程度用了 ESB、Java Session、Java Context,把状态在内存中保存,这样是可以上云,可以对它进行无状态改造,把相应的状态抽出来,就很容易做无状态化。

既使是有状态应用也可以把它放在云上,一是实现快速部署、开发、测试三个环节打通,这是容器做的。其次是可以快速扩容,既使是有状态,新用户跑到新应用上前端做会话保持,可能不能快速收缩,收缩的时候只等新扩的机器上面的用户慢慢都走了以后再把它关掉。也许能提升利用率,这个不一定能提升。

像中间件的容器一般来说是比较大,而且占的资源比较多,很多时候是 1G 跑不了几个容器,提升的利用率不会太多,也许能提升一半,不像用 Tomcat 混合部署可能能提升到 2 - 3 倍的资源利用率,反正能有所提升。

完全依赖本地持久化的应用上云比较难。

比较典型的是数据库。通过分布式存储一定程度能解决这个问题,或者数据库本身就是一个分布式数据库,自然可以上云。

一般传统的 Oracle 数据库,上云的意义不是太大,上云也得定点安装,业务数据不是在云上飘来飘去,需要指定机器,但是数据持久化部分还是挂载出来放在本地硬盘上。

大家经常问哪些应用适合上云,这不是黑白分明的问题。把应用改造到哪一步,上云就得到多少优点。最近五年开发应用,基本上 90%,不管是 WebLogic、WAS,都可以把应用部分、业务逻辑部分搬上云。

这就是刚才说的无状态改造,把负载均衡从有状态改为无状态,把相应的状态放在 Redis 缓存中,基本上就实现了。