Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 软件即服务(SaaS)的应用程序设计_Java_Dns_Distributed_Saas_Java Ee 7 - Fatal编程技术网

Java 软件即服务(SaaS)的应用程序设计

Java 软件即服务(SaaS)的应用程序设计,java,dns,distributed,saas,java-ee-7,Java,Dns,Distributed,Saas,Java Ee 7,所以我目前正在设计SaaS应用程序。我的设计有点小问题。 假设我在www.mycompany.com下部署了一个应用程序。用户购买订阅,从而获得对应用程序的访问权。 现在我想要的是一种在用户购买订阅时创建此应用程序新实例的“方法”,例如: 约翰拥有维加公司。当他购买访问/使用我的应用程序的许可证时,会创建一个新实例,可通过www.vega.mycompany.com访问。 创建他的帐户后,将部署新的应用程序实例,并创建新的DB,并与新创建的应用程序实例链接 其背后的原因是: John可能会生成大

所以我目前正在设计SaaS应用程序。我的设计有点小问题。 假设我在www.mycompany.com下部署了一个应用程序。用户购买订阅,从而获得对应用程序的访问权。 现在我想要的是一种在用户购买订阅时创建此应用程序新实例的“方法”,例如:

约翰拥有维加公司。当他购买访问/使用我的应用程序的许可证时,会创建一个新实例,可通过www.vega.mycompany.com访问。 创建他的帐户后,将部署新的应用程序实例,并创建新的DB,并与新创建的应用程序实例链接

其背后的原因是:

  • John可能会生成大量数据,因此拥有多个较小的DBs比为每个客户提供一个更好
  • John可能会存储敏感数据,而他不希望将这些数据存储在与其他用户相同的数据库中
  • 我想用Java开发这个应用程序。我用来创建SaaS应用程序新实例的管理应用程序也将用Java开发。 现在我的问题是:

  • 我如何真正做到这一点?我是否只要在创建新帐户时在应用程序容器(比如Tomcat)中部署相同的WAR文件
  • 我如何从administrators应用程序创建“vega”子域?这可能吗
  • 如果有一个bug或者我想简单地更新一些东西,并且我有1000个这个应用程序的实例,我如何才能顺利地完成它
    我现在正在研究一个类似的问题/解决方案,尽管它是用C#编写的,但它将在linux和mono上运行,我相信我的解决方案是不依赖语言的

    首先,要开发像你我一样的SaaS应用程序,需要为每个新客户提供一个新的实例,这并不是真正的最佳实践(据我所知)。由于您提到的问题,设置新环境并处理许多并发实例,其中包括更新或可能将它们移动到不同的服务器/基础结构

    对我来说,这个决定是因为应用程序的初始设计不好,数据设计更简单,最终安全性更好,因为现在可以只给每个客户对其数据库的一小部分的权限,而我这边的SQL注入或其他错误都不能改变这一点,因为权限是在数据库级别强制执行的。(我完全意识到,你仍然可能有bug)

    我的解决方案: 使用。它比传统的虚拟机轻量级得多,为您提供了额外的抽象和安全性,例如,允许用户上载文件,……此外,部署一个新容器非常简单和快速,因此您可以在用户注册后几秒钟内完成

    我在主机上使用一个Nginx服务器作为反向代理,它将请求转发给每个客户的相应容器。这里的问题是在更新配置文件后重新启动Nginx,而不丢失任何流量,这有点棘手

    更新应用程序也很容易,因为您只需要发布映像的新版本,停止所有正在运行的容器,并使用新映像重新启动它们。但是要做到这一点,容器不能保存任何数据,请记住。-这里的问题是再次以一种用户不会注意到的方式更新它,对我来说——因为我的客户只在一个时区,这很容易——只需将其安排在凌晨4点,祈祷没有人会疯狂到在那个时候醒来和工作:)


    这并没有给你可能99999%的可用性,但这不是我的目标,这是一个很好的折衷,便于管理这些容器。其他优点是-您可以在任何linux机器上测试生产环境,并且您可以将代码移动到您想要的任何地方,只需更改Nginx反向代理配置。

    因此,基本上我开发了一个应用程序,就好像它将在单实例模式下运行一样,然后将这些容器与应用程序一起部署?你打算用docker还是已经用过了?我可以自动创建/部署新容器吗?例如,可以从Java/Python/bash任何级别进行吗?我已经在使用它来设置演示和测试版本。Docker是通过几个简单的命令来控制的,所以你可以用任何可以发出linux命令的东西(我有bash脚本和NodeJS脚本)来自动化它。哦,是的,当你使用Docker部署你的应用程序时,它在每个容器中都是唯一的,所以它可以始终侦听相同的端口。。。还支持从git存储库设置自动构建。通过这种方式,您甚至可以自动化更新过程,我有一个小脚本正在帮助我()-虽然我还没有在生产中使用此脚本,所以请小心,您可以找到和的一些相关信息