这里说的“容器”,指的是组成软件系统的逻辑上的可执行文件或过程,诸如:
- Web服务器1 (比如Apache HTTP服务器、Apache Tomcat、微软IIS、WEBrick等);
- 应用服务器(如IBM WebSphere、BEA/Oracle WebLogic、JBoss AS等);
- 企业服务总线和业务流程编排引擎(如Oracle Fusion中间件等);
- SQL数据库(如Oracle、Sybase、微软SQL服务器、MySQL、PostgreSQL等);
- NoSQL数据库(如MongoDB、CouchDB、RavenDB、Redis、Neo4j等);
- 其他存储系统(如亚马逊S3等);
- 文件系统(特别是如果你在数据库以外读/写数据);
- Windows服务;
- 独立/控制台应用程序(即“public static void main”风格的应用程序);
- Web浏览器和插件;
- cron和其他计划的工作容器。
1 如果多个Java EE Web应用程序或.NET网站是同一个软件系统的部件,通常会在单独的类加载器或应用程序域里被执行。我用单独的容器来展示它们,因为它们是独立的,要靠进程间通信(比如远程方法调用、SOAP、REST,等)来协同工作。
图上的每一个容器都可以指定下面这些项。
- 名称 :容器的逻辑名称(如“面向互联网的Web服务器”、“数据库”等)。
- 技术 :容器的技术选择(如Apache Tomcat 7、Oracle 11g等)。
- 职责 :容器职责的高层次声明或清单。你也可以展示一张驻留在每个容器中关键组件的小图,但我发现这通常会把图搞得很乱。
如果你纠结于容器图中是否要包含一个框,只要问自己,这个框是否会(或者能)部署到一个单独的物理或虚拟硬件上。你展示在容器图上的每件东西都应该能够单独部署。这并不意味着你必须将它们部署在单独的基础设施上,但它们应该能够单独部署。