Amazon WebServices 中 Tomcat 上 J2EE webapp 的设计注意事项

Posted

技术标签:

【中文标题】Amazon WebServices 中 Tomcat 上 J2EE webapp 的设计注意事项【英文标题】:Design considerations for J2EE webapp on Tomcat in Amazon WebServices 【发布时间】:2016-08-22 07:31:53 【问题描述】:

我的项目正在寻求将新的 j2ee 应用程序部署到 Amazon 的云中。 ElasticBeanstalk 支持 Tomcat 应用程序,这看起来很完美。在编写可能与服务器上的独立 tomcat 不同的应用程序时,是否有任何特殊的设计注意事项需要牢记?

例如,我了解服务器旨在自动扩展。这像集群吗?我们的应用程序框架往往喜欢在 HttpSession 中粘贴状态,这是一个问题吗?或者当它说它会自动扩展时,这仅仅是指内存和 CPU 吗?

【问题讨论】:

您在云中进行部署,这意味着您应该遵循 12factor 建议:12factor.net。首先,它们应该是无状态的。 【参考方案1】:

AWS 上的自动扩展是通过添加更多服务器而不是添加更多 CPU/RAM 来完成的。您可以手动添加更多 CPU/RAM,但需要关闭服务器一分钟才能进行更改,然后配置服务器上运行的任何软件以利用添加的 RAM,因此这不是自动扩展的方式.

Elastic Beanstalk 基本上是 Amazon EC2 服务器、弹性负载均衡器和 Auto Scaling 组的管理界面。它为您设置了所有这些,并提供了一种方便的方式来轻松部署应用程序的新版本。 Elastic Beanstalk 将在 Elastic Load Balancer 后面创建 EC2 服务器,并使用 Auto Scaling 配置随着应用程序负载的增加添加更多服务器。它处理在准备好接收流量时将服务器添加到负载均衡器,并在不再需要时将它们从负载均衡器中删除并删除额外的服务器。

对于在 Tomcat 上运行的 Java 应用程序,您有几个选项可以很好地处理水平扩展。您可以在负载均衡器上启用粘性会话,以便来自特定用户的所有请求都将发送到同一台服务器,从而保持 HttpSession 与用户绑定。这样做的主要问题是,如果从池中删除服务器,您可能会丢失一些 HttpSession,并导致“卡在”该服务器上的任何用户都从您的应用程序中注销。对此的解决方案是将您的 Tomcat 实例配置为将会话存储在共享位置。有 Tomcat 会话存储实现可以与 ElastiCache (Redis) 和 DynamoDB 等 AWS 服务一起使用。如果您还不熟悉 DynamoDB,我建议您使用其中之一,可能是 Redis 实现。


将 Java 应用程序迁移到 AWS 的另一个考虑因素是您不能使用任何依赖多播的工具或库。您可能没有对任何事情使用多播,但根据我的经验,我必须迁移到 AWS 的每个 Java 应用程序都依赖多播进行集群,我必须对其进行修改以使用不同的集群方法。

此外,为了成功迁移到 AWS,我建议您阅读一些关于 VPC、私有 IP 与公共 IP 和安全组的内容。对这些主题的深刻理解是设置网络的关键,这样您的网络服务器就可以以安全和高性能的方式与您的数据库和缓存服务器通信。

【讨论】:

以上是关于Amazon WebServices 中 Tomcat 上 J2EE webapp 的设计注意事项的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Amazon Api 的时间戳和签名

在 amazon ec2 cloud(Linux 服务器)上设置 crontab

适用于 Amazon S3 的基于开源或付费 JavaScript 的文件管理器 [关闭]

delphi7 WebServices 读取数据

Web Services简单介绍

LR12中针对WebServices协议的三种脚本开发模式