最佳Java支持的服务器/客户端协议?
我正在编写一个客户机/服务器应用程序,它应该基于消息工作。我希望尽可能地重复使用,而不是写另一个实现,并好奇别人正在使用什么。最佳Java支持的服务器/客户端协议?
特点图书馆应提供:
- 客户端和服务器端功能
- 应该工作基于消息的
- 支持多线程的背后负载平衡器
- 应该工作/防火墙
我用HTTPCore做了几个测试,但底线是必须实现客户端和服务器,只有传输层才会被覆盖。由于网络相关的要求,RMI不是一种选择。
任何想法,高度赞赏。
详细
我的想法是实现其处理客户端通信的客户端/服务器的包装(包括用户名/密码验证),并传入的请求JMS队列中写道:
#1 User --> Wrapper (Check for user/password) --> JMS --> "Server"
#2 User polls Wrapper which polls JMS
单独的进程将处理请求,并可以通过包装器回复客户端。我想使用JMS,因为:
- 它处理持久性不错
- 负载均衡 - 这很容易通过增加额外的服务器作为消费者来处理高峰
- JMSTimeToLive派上用场太
不幸的是,我没有看到自己使用JMS的方法,因为客户端应该只能访问他们的消息,并且在JMS端安装不同的用户听起来也不可行。
那么,HTTP可能是实现它的客户端和服务器代码方面最好的支持 - 但根据您的要求它可能完全不合适。我们需要实际上请参阅一些要求(或者至少对应用程序是什么样的模糊概念),然后才能真正为您提供建议。
我想说最好的支持,如果不是最好的实现,Java的客户端/服务器通信包是Sun的RMI(远程方法调用)。它包含在标准的Java类库中,即使它不是最快的选项,也能完成工作。当然,它是由Sun支持的。几年前,我实现了一个基于回合的游戏框架,并且非常稳定。
我们正在标准化Adobe的AMF,因为我们在客户端和Java6/Tomcat6/BlazeDS/Spring-Framework2.5/iBATIS2.3.4/ActiveMQ-JMS5.2中使用Adobe Flex/AIR, -tier堆栈(Oracle 10g后端)。因为我们正在对Flex客户端开发进行标准化,所以AMF和BlazeDS(现在更好地结合到Spring,这要感谢Adobe和SpringSource在集成上进行合作),这是我们可以使用的最有效和最方便的方式来与服务器端。
我们还大量建立在数据中心的JMS消息 - BlazeDS的,使我们能够弥补我们的Flex客户端的JMS主题订阅。这是非常强大和有效的。
我们的Flex .swf文件的Java .class代码被捆绑到了部署的同一.jar文件。这样,客户端代码的正确版本将被部署到与处理客户端服务调用(或消息传递操作)的相应中间层java代码进行交互。这一直是客户端 - 服务器计算的祸根 - 确保各层的正确版本彼此连接。我们用我们特定的打包和部署方法有效地解决了这个古老的问题。
我们所有的客户机 - 服务器交互工作在HTTP/HTTPS端口80和443,即使在服务器端消息推动,我们与桥接我们ActiveMQ的JMS消息代理BlazeDS的事。
RMI很适合我们。有一些限制,例如无法直接连接到该计算机(如果客户端位于防火墙后面不起作用),则无法向客户端回叫。您还可以轻松地将通信封装到SSL中,或者通过可以封装在SSL中的HTTP进行隧道传输。
如果你最终使用这个记得总是设置分配给客户端类串行版本。您可以在创建它时将其设置为1L,或者如果客户端已经有该类使用serialver.exe来发现现有的类的序列。否则,只要您更改或添加公共方法或与现有客户端的变量兼容性就会中断。
静态最后的serialVersionUID长= 1L
编辑:即进入服务器的每个RMI请求获得了它自己的线程。你不必自己处理。
编辑:我想稍后在问题中添加一些细节。您可以通过HTTP传输RMI,然后您可以使用负载均衡器。
我最近开始玩Hessian,它显示了很多的承诺。它本身使用HTTP,它比RMI over HTTP更简单,它是一个二进制协议,这意味着它比所有基于XML的协议都快。得到Hessian很容易。我最近通过在我们的应用中嵌入Jetty来完成这项工作,配置Hessian Servlet并使其实现我们的API接口。关于Hessian的伟大之处在于它的简单性......就像JMS或HTTP上的RMI一样。在其他语言中也有用于Hessian的库。
使用Spring ....然后挑选的协议。
嗨吉姆,哪些信息是我想念的补充? Tkx链接到这篇文章很遗憾,不幸的是TemporaryQueues的方法不起作用,因为它至少需要一个静态队列。 “坏人”很容易在那里访问消息并滥用临时队列。 – MrG 2009-01-16 17:14:36