我正在我们公司实现一个新应用程序,并且正在寻找进行集群的方法。根据 jboss 文档 here 有两种可用的架构。 .
- 客户端拦截器
- 外部负载平衡
问题1:在客户端拦截器架构中。客户端拥有代理对象,它知道将消息路由到哪个服务器。这里的客户是谁?我知道 java 脚本/HTML 无法保存代理对象。它是节点前面的 spring/servlet 层吗?
问题 2:外部负载均衡器是否了解节点可以包含的代码和服务,或者它只是使用算法将请求委托(delegate)给?
最佳答案
对于 1 - 客户端是远程 EJB 动态代理和/或应用程序客户端容器(桌面应用程序)
对于 2 - 外部负载均衡器对代码一无所知。 (我发现这个解决方案的使用远远超过问题 1 中的场景)
配置集群的方法有很多种,具体取决于您的负载平衡和容错目标。例如,您可以在非集群的应用程序服务器之间进行负载平衡。容错能力较低,性能更快,因为没有 session 复制。
这里有关于第 1 点的更多详细信息。
假设问题 1 中我有一个分布式应用程序。假设一个Web应用程序和EJB运行在一个应用程序服务器上,我希望调用另一个应用程序服务器的一些EJB。
当您调用远程 EJB 时,应用程序服务器会生成一个类,该类会传输到调用服务器。这就是动态代理,它包含所有网络通信的东西。
在应用服务器市场中,我们通常会看到两种形式的配置,(1) 动态代理类,它了解集群并调用其他节点,(2) 带有节点列表的 CORBA URL,即 corbaloc: :nodeA.host.com,nodeB.host.com/...
这里有关于第二点的更多细节。
第二种情况通常是我们向“外部”世界的调用者提供基于 HTTP 的服务、WebUI、REST、SOAP 等。
带有 mod_jk 插件的 Apache HTTPD 是 JBoss 文档 here 中的一个示例。
请求可以发送到不同的服务器来解决负载或故障。 HTTP session 对象在节点之间复制。 (JBoss 中的 JGroups 库处理此问题,IP 多播也是一种常用技术)
因此,负载均衡器/反向代理不需要了解代码,它只需要了解要将请求转发到的 URL,集群中的应用程序服务器会协作获取 session 信息。
关于java - 客户端拦截器和外部负载均衡架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32275463/