C++ 如何';web启用';传统的C++;应用

C++ 如何';web启用';传统的C++;应用,c++,c,apache,rest,wt,C++,C,Apache,Rest,Wt,我正在开发一个按组织划分用户的系统。每个用户都属于一个组织。每个组织将其数据存储在自己的数据库中,该数据库位于数据库服务器计算机上。db服务器可以管理一个或多个组织的数据库 现有(遗留)系统假定只有一个组织,但我希望通过运行应用程序的“实例”(绑定到一个组织)来“扩展”应用程序,并在服务器计算机上运行多个实例(即运行“单个组织”应用程序的多个实例-每个组织一个实例) 我将为服务器上运行的每个实例提供RESTful API,以便使用瘦客户机访问服务器上运行的实例提供的服务 下面是一个简单的示意图,

我正在开发一个按组织划分用户的系统。每个用户都属于一个组织。每个组织将其数据存储在自己的数据库中,该数据库位于数据库服务器计算机上。db服务器可以管理一个或多个组织的数据库

现有(遗留)系统假定只有一个组织,但我希望通过运行应用程序的“实例”(绑定到一个组织)来“扩展”应用程序,并在服务器计算机上运行多个实例(即运行“单个组织”应用程序的多个实例-每个组织一个实例)

我将为服务器上运行的每个实例提供RESTful API,以便使用瘦客户机访问服务器上运行的实例提供的服务

下面是一个简单的示意图,演示了这些关系:

服务器1->N数据库(每个 组织有一个数据库)

组织1->N个用户

我的问题涉及如何将客户机的RESTful请求“引导”到处理该组织用户请求的适当实例


更具体地说,当我收到一个RESTful请求时,它将来自一个用户(属于一个组织),如何(或者实际上,什么是最好的方式)将请求“路由”到服务器上运行的适当应用程序实例?

这确实是一个非常棘手的问题;仅仅因为有很多可能的答案,哪一个是最好的只能由你和你的环境决定

<>我会在C++中编写一个Apache模块来实现这一点。使用,我设法开始编写非常高效的模块


为了能够为您提供更多解决方案(可能只是设置Squid代理?),您需要指定如何确定需要将客户端重定向到哪个服务器。如果您可以通过IPs,通过GET参数,通过POST XML参数(比如)来实现。等等。

另一个答案说有很多方法可以解决这个问题。让我们假设您没有访问遗留软件源代码的权限,这意味着您无法修改它以侦听不同实例的不同端口

为了解决这个问题,编写Apache模块似乎非常极端(作为一个刚刚完成Apache生产模块编写的人,我建议避免使用它,除非您正在赚大钱)

这种方法可以像你喜欢的那样深奥。例如,如果您的传统软件在正常的英特尔体系结构上运行,并且您有足够的硬件容量,那么有一些虚拟机解决方案,您应该能够创建一个瘦虚拟机,一个运行该软件的单个实例的虚拟机和一个多路复用器来将它们绑定在一起

另一方面,如果您运行的是类似HPUX的东西,那么:-)还有其他方法。你能再详细一点吗


艾哈迈德。

据我所知,这本质上是一个切分问题。无论您如何在硬件级别拆分实例(使用虚拟机、多台服务器、所有服务器都在一台功能强大的服务器上等等),您都需要在您的总体体系结构中有一个中央注册表和代理层,该层将给定用户映射到每个请求的正确目标实例


当然,有很多方法可以实现这一点,所以只要选择一种你知道的、快速的、可以扩展的方法,因为所有的请求都会通过它。我建议使用一个轻量级的无状态web应用程序,该应用程序由一个简单的只读数据库支持,该数据库执行适当的客户机标识符->实例映射,您可以将其加载到内存/缓存中。要增加硬件和实例位置的灵活性,请使用(假设为Java)JNDI存储每个实例的硬件/端口/etc信息,并在标识符映射中将客户端标识符映射到适当的JNDI查找键。

让公共API只指定用户听起来有点脆弱。我会更改公共API,以便请求指定组织和用户,然后有一些简单的服务器端将组织映射到实例(例如,organization foo->instance侦听端口7331)。

我必须承认,我被编写apache模块的想法所吸引——但艾哈迈德提出的观点让我回到了现实:)@morphase我已经做到了,而且还没那么糟糕。使用教程作为我的应用程序的基础,我在半天内就启动并运行了。从那以后,我再也不用回去接触任何apache特定的东西了。没错,但是更改API是一个需要解决的简单问题。我想这是最实用的答案:)