Hadoop RPC协议之 ProtobufRpcEngine

本文详细介绍了如何使用ProtobufRpcEngine实现一个简单的RPC协议,包括生成Java文件、定义接口和服务、实现服务端和客户端代码等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用ProtobufRpcEngine来实现一个简单的RPC协议

add_test.proto

package rpcTest.protobuf;

option java_package = "rpcTest.protobuf";
option java_outer_classname = "ClientProto";
message AddParameters {
	optional int32 para1 =1;
	optional int32 para2 = 3;
}

message AddResult {
	optional int32 result =1;
}

AddService.proto

package rpcTest.protobuf;

option java_package = "rpcTest.protobuf";
option java_outer_classname = "Add";
option java_generic_services = true;
option java_generate_equals_and_hash = true;
import "add_test.proto";

service AddService {
    rpc add(AddParameters) returns (AddResult);
}

进入原代码所在目录,使用以下命令生成java文件
protoc --proto_path=./ --java_out ../../ ./add_test.proto
protoc --proto_path=./ --java_out ../../ ./AddService.proto

AddProtocol.java

package rpcTest.protobuf;

public interface AddProtocol {
    public int add(int para1,int para2);
}

AddImpl.java

package rpcTest.protobuf;

public class AddImpl implements AddProtocol {

    @Override
    public int add(int para1, int para2) {
        // TODO Auto-generated method stub
        return para1 + para2;
    }
}


AddProtocolPB.java

package rpcTest.protobuf;

import org.apache.hadoop.ipc.ProtocolInfo;

import com.google.protobuf.RpcController;

import rpcTest.protobuf.ClientProto.AddParameters;
@ProtocolInfo(protocolName = "rpcTest.protobuf.AddProtocolPB", 
protocolVersion = 1)
public interface AddProtocolPB {
    public ClientProto.AddResult add(RpcController controller,AddParameters p) ;
}

AddProtocolTranslatorPB.java

package rpcTest.protobuf;

import rpcTest.protobuf.ClientProto.AddParameters;

public class AddProtocolTranslatorPB implements AddProtocol {
    final private AddProtocolPB rpcProxy;

    public AddProtocolTranslatorPB(AddProtocolPB proxy) {
        this.rpcProxy = proxy;

    }

    @Override
    public int add(int para1, int para2) {
        // TODO Auto-generated method stub
        AddParameters req = ClientProto.AddParameters.newBuilder()
                .setPara1(para1).setPara2(para2).build();
        return rpcProxy.add(null, req).getResult();
    }

}

AddProtocolServerSidePB.java

package rpcTest.protobuf;

import com.google.protobuf.RpcController;

import rpcTest.protobuf.ClientProto.AddParameters;
import rpcTest.protobuf.ClientProto.AddResult;

public class AddProtocolServerSidePB implements AddProtocolPB,
        Add.AddService.BlockingInterface {
    final private AddProtocol server;

    public AddProtocolServerSidePB(AddProtocol server) {
        this.server = server;
    }

    @Override
    public AddResult add(RpcController controller, AddParameters p) {
        // TODO Auto-generated method stub
        rpcTest.protobuf.ClientProto.AddResult.Builder builder = ClientProto.AddResult
                .newBuilder();
        int result = server.add(p.getPara1(), p.getPara2());
        builder.setResult(result);
        return builder.build();
    }

}

ProtoRpcClient.java

package rpcTest.protobuf;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.ProtobufRpcEngine;
import org.apache.hadoop.ipc.RPC;



public class ProtoRpcClient {
    final static long VERSION = 1;
    public static void main(String[] args) throws IOException {
        Configuration conf = new Configuration();
        String ADDRESS = "localhost";
        int port = 9998;
        RPC.setProtocolEngine(conf, AddProtocolPB.class, ProtobufRpcEngine.class);
        AddProtocolPB proxy = RPC.getProxy(AddProtocolPB.class, VERSION,  new InetSocketAddress(ADDRESS,port),
                conf);
        
         AddProtocol add = new AddProtocolTranslatorPB(proxy);
         int result = add.add(100, 200);
         System.out.println("client result:" + result);
      // int result = proxy.add(5, 6);
       // System.out.println(result);
    }
}

ProtoRpcServer.java

package rpcTest.protobuf;


import java.io.IOException;
import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.ProtobufRpcEngine;
import org.apache.hadoop.ipc.RPC;

import com.google.protobuf.BlockingService;

public class ProtoRpcServer {
    public static void main(String[] args) throws HadoopIllegalArgumentException, IOException{
        Configuration conf = new Configuration();
        String ADDRESS = "localhost";
        int port = 9998;
        RPC.setProtocolEngine(conf, AddProtocolPB.class, ProtobufRpcEngine.class);
             
            RPC.Server  server = new RPC.Builder(conf)
              .setProtocol(
                      AddProtocolPB.class)
              .setInstance((BlockingService)Add.AddService.newReflectiveBlockingService(new AddProtocolServerSidePB(new AddImpl())))
              .setBindAddress(ADDRESS)
              .setPort(port).setNumHandlers(1)
              .setVerbose(true)
              .build();
            server.start();
    }
}

先执行ProtoRpcServer监听端口。

再执行ProtoRpcClient执行客户端程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值