基于Netty实现的RPC框架
RpcServer server = new RpcServer("127.0.0.1",1234); HelloServiceImpl impl = new HelloServiceImpl(); server.export(HelloService.class, impl);
RpcClient client = new RpcClient("127.0.0.1",1234); HelloService service = client.refer(HelloService.class); //同步调用 System.out.println(service.hello("test rpc"));
默认的远程调用都是同步的,发起异步调用需要设置RpcContext.setAsync(true),异步调用有两种方式:Future方式、callback方式,可以单独使用也可以混合使用
RpcContext.setAsync(true)
Future
callback
Future方式
RpcClient client = new RpcClient(“127.0.0.1”,1234); HelloService service = client.refer(HelloService.class); RpcContext ctx = RpcContext.getContext(); ctx.setAsync(true); String obj=service.hello(“test rpc”); System.out.println(obj==null); Future f =ctx.getFuture(); System.out.println(f.get());
callback方式
RpcClient client = new RpcClient(“127.0.0.1”,1234); HelloService service = client.refer(HelloService.class); RpcContext ctx = RpcContext.getContext(); ctx.setAsync(true); ctx.setCallback(new Callback() {
@Override public void onSuccess(Object result) { System.out.println(“success ”+ result); } @Override public void onError(Throwable thr) { System.out.println(“error”); thr.printStackTrace(); } }); String obj=service.hello(“test rpc”); System.out.println(obj==null);
单向调用是一种特殊类型的异步调用,意味着客户端对本次调用不期待服务端的响应结果。实际上服务端对于单向调用请求也不会作出响应。对于特定场景单向调用性能更好,但并不那么可靠。
//单向调用 RpcContext ctx = RpcContext.getContext(); ctx.setOneway(true); System.out.println(service.hello("test rpc")==null);