如何使用 REST API 和数据库扩展 Java 应用程序?

Posted

技术标签:

【中文标题】如何使用 REST API 和数据库扩展 Java 应用程序?【英文标题】:How do I scale a Java app with a REST API and a Database? 【发布时间】:2016-04-20 21:51:25 【问题描述】:

我有一个典型的无状态 Java 应用程序,它提供 REST API 并在 Postgresql 数据库中执行更新 (CRUD)。

但是客户数量正在增长,我觉得有必要

增加冗余,这样如果一个失败,另一个发生 为此,我可能需要一个负载平衡器? 通过不淹没网络和仅一台服务器的 CPU 来提高响应速度(但是负载平衡器如何不会被淹没?) 也许我需要分发数据库? 我希望能够无缝更新我的应用程序(我见过一个叫做 kubernetes 的东西这样做):一个一个地杀死每个冗余节点并立即用更新的版本替换它 我的应用程序还存储了一些图像文件,它们的磁盘大小增长很快,我需要能够分发它们 所有这些都必须是可备份的

这是我现在所拥有的图表(Java 应用程序和数据库都在同一台服务器上):

什么是最好/正确的缩放方式?

谢谢!

【问题讨论】:

【参考方案1】:

网络服务器:

在负载平衡器后面的多台服务器上运行您的应用。使用 AWS Elastic Beanstalk 或通过 EC2 + Autoscaling Groups + ELB 推出您自己的解决方案。

您提到了对负载均衡器“泛滥”的担忧,但如果您使用 Amazon 的 Elastic Load Balancer 服务,它会自动扩展以处理您获得的任何流量,因此您无需担心此问题。

数据库服务器:

将您的数据库移至 RDS 并启用多可用区故障转移。这将创建一个热备用服务器,如果您的主服务器出现问题,您的数据库将自动故障转移到该服务器。 (可选)添加只读副本以横向扩展您的数据库容量。

如果您还没有缓存,请开始在 Redis 中缓存您的数据库查询。有一些插件可以很容易地用 Hibernate 做到这一点。如果您的应用程序定期执行相同的查询,这将减轻您的数据库服务器的巨大负担。为您的 Redis 服务器使用 AWS ElastiCache 或 RedisLabs。

图片:

停止在您的网络服务器上存储您的图像文件!这会产生很多可扩展性问题。将它们移至 S3 并直接从 S3 提供它们。 S3 为您提供无限的存储空间、自动备份以及直接从 S3 提供图像的能力,从而减少了 Web 服务器的负载。

部署:

这里有太多的解决方案,以至于它只是一个关于某人更喜欢哪种方法的问题。如果您使用 Elastic Beanstalk,那么它会为部署提供解决方案。如果您不使用 EB,那么有数百种解决方案可供选择。我建议先设计您的环境,然后再选择适合您设计的环境的自动化部署解决方案。

备份:

如果您正确执行此操作,您的网络服务器上应该不会有太多需要备份的内容。使用 Elastic Beanstalk,您重建 Web 服务器所需的只是您已签入 Git 的代码和配置文件。如果您最终不得不备份 EC2 服务器,则需要查看 EBS 快照。

对于数据库备份,RDS 将自动执行每日备份。如果您想要在 RDS 之外进行备份,您可以使用 pg_dump 和 cron 作业自行安排这些备份。

对于图像,您可以启用 S3 版本控制和多区域复制。

CDN:

您没有提到这一点,但您应该研究一下 CDN。这将使您的应用程序得到更快的服务,同时减少服务器上的负载。 AWS 提供了 CloudFront CDN,我也建议看看 CloudFlare。

【讨论】:

您将如何在非 AWS 环境中进行扩展。假设您有 5 个微服务实例在内部服务器上的 PCF 上运行,并且您预计每秒会收到数千个请求。在这种情况下我们将如何扩展? 您可以使用 DNS 负载平衡。将您的服务 IP 地址提供给 DNS,并使用循环法按顺序提供服务。也许您可以不提供服务的 IP 地址,而是在新服务器上构建和配置 HAProxy 以实现负载平衡,并将其 IP 提供给 DNS。

以上是关于如何使用 REST API 和数据库扩展 Java 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

REST API 中的竞争条件

扩展REST API - 架构

如何使用 ANGULAR 5 的 ARC 扩展发送 POST 请求以测试 api Rest?

如何使用 Java 防止 XSS 攻击或 Rest API JSON 中的不可信数据?

PHP 中的 REST API 输出到 JSON 文件扩展名

如何使用Activiti Rest模块