-
rpc 远程处理调用
-
本地客户端 Consumer(客户端)
-
远程服务提供者 Provider(服务端)
-
consumer 和 provider 需要有相同的接口
- 我们在使用feign或者之类的rpc都是类似(个人理解)
-
使用netty完成连接 在连接中使用动态代理
- 客户端在动态代理的方法调用中(Invoke) 使用netty 所维持的 channel 完成request 的发送 并异步等待返回结果
- 服务端在接受特定的请求后解析自定义协议中的数据,使用代理完成请求任务,并且返回respons
-
服务端动态代理没写了(因为cglib不是很熟)
一、Consumer
1.启动程序
public class ConsumerBootStrap {
EventLoopGroup consumer;
Bootstrap bootstrap;
public ConsumerBootStrap() {
consumer = new NioEventLoopGroup();
bootstrap = new Bootstrap();
}
public void boot(String hostName, int port) {
boot0(hostName, port);
}
private void boot0(String hostName, int port) {
ChannelFuture channelFuture = bootstrap.group(consumer)
.handler(new RpcChannelHandlerInitializerClient())
.channel(NioSocketChannel.class)
.connect(hostName, port);
try {
channelFuture.sync();
} catch (InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
}
}
2.协议解码
public class RpcConsumerDecoder extends ReplayingDecoder<RpcMessage.RpcMessagePojo> {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
Charset charset = CharsetUtil.UTF_8;
RpcMessage.RpcMessagePojo.Builder builder = RpcMessage.RpcMessagePojo.newBuilder();
RpcMessage.Response.Builder responseBuilder = RpcMessage.Response.newBuilder();
builder.setMessageType(RpcMessage.RpcMessagePojo.MessageType.RESPONSE);
int responseHeaderSize = in.readInt();
String string=in.readBytes(responseHeaderSize).toString(charset);
responseBuilder.setResponseHeader(string);
int descriptionSize = in.readInt();
string=in.readBytes(descriptionSize).toString(charset);
System.out.println(string+"----");
responseBuilder.setDescription(string);
int resultSize = in.readInt();
responseBuilder.setResult(in.readBytes(resultSize).toString(charset));
out.add(builder.setResponse(responseBuilder.build()).build());
//自由返回对应类型才会被指定了对应类型的handle 捕捉处理
}
}
3、业务handler
public class RpcConsumerHandler extends SimpleChannelInboundHandler<RpcMessage.RpcMessagePojo> implements Callable<RpcMessage.RpcMessagePojo> {
ChannelHandlerContext ctx;
RpcMessage.RpcMessagePojo request;
RpcMessage.RpcMessagePojo response;
@Override
protected synchronized void channelRead0(ChannelHandlerContext ctx, RpcMessage.RpcMessagePojo msg) throws Exception {
response = msg;
notify();
//唤醒线程继续执行call
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("active");
this.ctx = ctx;
}
@Override
public synchronized RpcMessage.RpcMessagePojo call() throws Exception {
ctx.writeAndFlush(request);
//传送到服务端
//开始等待
wait();
return response