我使用 Zeromq 和 C 编程语言编写了一个请求-回复代理。代理将客户端请求路由到适当的服务,然后将回复路由回客户端。这些服务是用JAVA编写的。
有人可以解释一下如何让服务与经纪人进行通信吗?我确信这一定是一个常见的场景,但我没有太多经验,所以有人可以帮助我使我的代码具有互操作性。
请假设服务不支持 Zeromq。这种场景要用node.js吗?我需要编写一个 http 前端吗?
最佳答案
这是使用异步 PUSH/PULL 套接字来实现此目的的一种方法。我对此进行了伪编码,因此请自行填写空白:
假设 Java 服务是驻留在自己进程中的 POJO,假设我们有一个没有 zmq 依赖项的简单服务:
public class MyJavaService{
public Object invokeService(String params){
}
}
现在我们构建一个 Java 委托(delegate)层,它从代理中提取消息,将请求委托(delegate)给 Java 服务方法,并在单独的套接字上返回响应:
//receive on this
Socket pull = ctx.createSocket(ZMQ.PULL)
pull.connect("tcp://localhost:5555")
//respond on this
Socket push = ctx.createSocket( ZMQ.PUSH)
psuch.connect("tcp://localhost:5556")
while( true){
ZMsg msg = pull.recvMsg( pull)
//assume the msg has 2 frames,
//one for service to invoke,
//the other with arguments
String svcToInvoke = msg.popString()
String svcArgs = msg.popString()
if( "MyJavaService".equals(svcToInvoke)){
ZMsg respMsg = new ZMsg()
respMsg.push( (new MyJavaService()).invokeService( svcArgs))
respMsg.send( push)
}
}
在代理端,只需创建 PUSH/PULL 套接字即可与 Java 服务层通信(我不是 C++ 程序员,所以请原谅我)
int main () {
zmq::context_t context(1);
zmq::socket_t push(context, ZMQ_PUSH);
push.bind( "tcp://localhost:5555");
// First allow 0MQ to set the identity
zmq::socket_t pull(context, ZMQ_PULL);
pull.bind( "tcp://localhost:5556");
//code here to handle request/response,
//to clients
..
}
使用 PUSH/PULL 适用于这种方法,但理想的方法是在服务器上使用 ROUTER,在客户端使用 DEALER,以实现完全异步通信,例如 here 。
希望对你有帮助!
关于node.js - JAVA编写的服务如何与C编写的zeromq代理通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19253867/