package com.rpc.client; import com.rpc.dto.Invocation; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.ChannelPipeline; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.serialization.ClassResolvers; import io.netty.handler.codec.serialization.ObjectDecoder; import io.netty.handler.codec.serialization.ObjectEncoder; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Objects; /** * *************************************************** * @ClassName RpcProxy * @Description 描述 * @Author maojianyun * @Date 2020/2/19 15:11 * @Version V1.0 * **************************************************** **/ public class RpcProxy { /** * 泛型方法 * @param clazz * @param <T> * @return */ public static <T> T create(Class<?> clazz){ return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 若调用的是object的方法、则直接进行本地调用 if (Object.class.equals(method.getDeclaringClass())) { return method.invoke(this, args); } // 远程调用 return rpcInvoke(clazz, method, args); } }); } private static Object rpcInvoke(Class<?> clazz, Method method, Object[] args){ RpcClientHandler handler = new RpcClientHandler(); NioEventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new ObjectEncoder()); pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.cacheDisabled(null))); // 添加自定义处理器 pipeline.addLast(handler); } }); ChannelFuture future = bootstrap.connect("localhost", 8888).sync(); Invocation invocation = new Invocation(); invocation.setClassName(clazz.getName()); invocation.setMethodName(method.getName()); invocation.setParamTypes(method.getParameterTypes()); invocation.setParamValues(args); // 将调用参数发出 future.channel().writeAndFlush(invocation).sync(); future.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); } finally { group.shutdownGracefully(); } return handler.getResult(); } }
最近下载更多
夏伟杰 LV1
2021年11月8日
Apsara LV1
2021年5月13日
13021603815 LV7
2021年4月12日
qqguodoudou LV1
2020年12月15日
大朗丶起来喝药了 LV4
2020年7月1日
280286951 LV17
2020年6月13日
zhengfei0421 LV6
2020年6月2日
RobinOOOooo LV6
2020年3月28日
dagf113225 LV68
2020年2月23日
王东东 LV17
2020年2月22日
最近浏览更多
1909741473 LV8
2月19日
不止是六位数 LV7
2023年3月20日
aixiao5213 LV1
2022年12月28日
yinyun1985 LV14
2022年10月31日
wz520135 LV7
2022年10月16日
xsxtxbb LV8
2022年10月10日
__起飞的猪 LV10
2022年6月15日
Lp5080lp LV9
2022年6月6日
林间听风 LV10
2022年4月11日
1145304128 LV12
2022年4月1日