RPC深入分析
Posted JudyGirl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RPC深入分析相关的知识,希望对你有一定的参考价值。
本文章内容是从奈学教育授课所学~
王雪芬
目录
1.RPC介绍与工作原理
2.RPC调用实现
3.RPC核心功能设计
基础架构图
当某一个某一个模块流量访问大或者业务逻辑复杂的时候,我们需要把某一个模块 拆出来,在画圆圈的地方就是RPC帮我们做的事情.
通过图我们来看RPC帮我们做了什么?
1RPC包含组包解包
2RPC包含数据发送和接受
3RPC帮助开发人员提高效率
RPC核心组成是什么?
1. 远程方法对象代理
当你看到核心组成的时候有没有相关为什么会有它,它的作用是什么?需要对象代理帮我们去调用远端的方法
2. 连接管理:当多个线程调用去调用的远程方法,如何管理连接,可以与数据库连接联想一下
3. 序列化和反序列化: 当经过网络层到传输层传输的时候,我们需要把数据转换而二进制,或者二进制转换为对象信息
4. 寻址与负载均衡,当节点是集群部署的时候我们需要找到机器进行通信
RPC调用方式
1 同步调用
2 异步调用
/**
* 启动UDP服务-王雪芬-2018年7月9日09:12:22
* @throws Exception
*/
public static void UdpRun() throws Exception {
//使用log4j配置文件
LogConfig();
//启动NIO服务,使用NioEventLoopGroup接受处理连接
EventLoopGroup workerGroup = new NioEventLoopGroup();
//DefaultEventExecutorGroup使用它每次都会生成新的线程,所以解决方案制定线程并且是final类型的
final EventExecutorGroup group = new DefaultEventExecutorGroup(16);
try {
//udp不能使用ServerBootstrap
Bootstrap b = new Bootstrap();
//把channel指定类型为NIo形式
b.group(workerGroup).channel(NioDatagramChannel.class)//设置UDP通道
//设置udp的管道工厂
.handler(new ChannelInitializer<NioDatagramChannel>(){
//NioDatagramChannel标志着是UDP格式的
@Override
protected void initChannel(NioDatagramChannel ch)
throws Exception {
// TODO Auto-generated method stub
//创建一个执行Handler的容器
ChannelPipeline pipeline = ch.pipeline();
//执行具体的处理器,调用专门用于处理业务的线程EventExecutorGroup
pipeline.addLast(group,"handler",new UdpServerHandler());//消息处理器
}
})//初始化处理器
//true / false 多播模式(UDP适用),可以向多个主机发送消息
.option(ChannelOption.SO_BROADCAST, true)// 支持广播
.option(ChannelOption.SO_RCVBUF, 2048 * 1024)// 设置UDP读缓冲区为2M
.option(ChannelOption.SO_SNDBUF, 1024 * 1024);// 设置UDP写缓冲区为1M
// 绑定端口,开始接收进来的连接 ,绑定的端口9999
//执行异步操作的时候使用,sync会造成当前线程的阻塞,直到绑定完为止
ChannelFuture f = b.bind(Constants.PORT).sync();
//获取channel通道
channel=f.channel();
log.info("UDP Server 启动!");
// 等待服务器 socket 关闭 。
f.channel().closeFuture().sync();
}finally {
// 优雅退出 释放线程池资源
group.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
public class GPSbaseinfo {
public static final Logger log = Logger.getLogger(GPSbaseinfo.class);
ByteBuffer byteBuf;
public GPSbaseinfo() {
this.byteBuf = ByteBuffer.allocate(1024);
}
private short Call; //报警标志
private String isnoSpeedcall; //速度报警
private Boolean isnotemperaturecall; //温度报警
private Boolean isnoBatterycall; //电池电量异常报警
private short Status; //状态
private String isnoSport; //设备是静止还是运动
private String isnoBattery; //设备是否充电
private String isnoGps; //gps定位是否正常
private String isnoworktime; // 设备是否在工作时段内
}
ByteBuf buf = (ByteBuf) packet.copy().content();//读取客户端的消息
byte[] readbytes = new byte[readbyte.length - 2]; //去除0x7e减一,因为是从0开始的,所以再减一
System.arraycopy(readbyte, 1, readbytes, 0, readbyte.length - 2);
byte[] checkbyte = readbytes;
byte[] clientcheck = CheckUtil.CheckClient(readbyte); //取出校验位
byte[] sendcheck = new byte[readbytes.length - 1]; //减去头部ox7e,然后最后一个减一
System.arraycopy(readbytes, 0, sendcheck, 0, readbytes.length - 1);
byte servercheck = Tast.getXor(sendcheck); //消息头和消息尾进行校验
byte[] servercheckbyte = Utilities.getBooleanArray(servercheck); //得到本身的校验
/**
* 封装数据包
* @return
*/
public byte[] toData(short plaReplyNO,byte result) {
b.clear();
//应答流水号
b.putShort(plaReplyNO);
//时间
String date=new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime());
ResponseSerTime = new byte[7];
this.ResponseSerTime= Utilities.str2Bcd(date);
b.put(this.ResponseSerTime);
//回复结果
b.put(result);
return b.array();
}
以上是关于RPC深入分析的主要内容,如果未能解决你的问题,请参考以下文章