1.rpc调用流程

2.组件
1.Redis注册中心


3.编解码/序列化
在本例的Netty通信中,由于每次调用rpc服务都要发送同一个类对象invoker,所以可以使用Protobuf。但是在接受方法调用结果的时候就不行了,因为我们无法提前确定对方方法返回结果的类型,所以在发送result的时候需要使用序列化将object 变成 byte [] ;接收 result的时候需要使用反序列化将 byte [] 变成 object
invoker
publicclassInvokerimplementsSerializable {
privateStringinterfaceName;
privateStringmethodName;
privateClass[] paramsType;
privateObject[] params;
}

序列化
序列化/反序列化可以使用数据流完成,也就是jdk的那一套序列化 / 反序列化操作。
publicstaticObjectByteToObject(byte[] bytes) {
Objectobj=null;
try {
// bytearray to object
ByteArrayInputStreambi=newByteArrayInputStream(bytes);
ObjectInputStreamoi=newObjectInputStream(bi);
obj=oi.readObject();
bi.close();
oi.close();
} catch (Exceptione) {
System.out.println("translation"+e.getMessage());
e.printStackTrace();
}
returnobj;
}
publicstaticbyte[] ObjectToByte(Objectobj) {
byte[] bytes=null;
try {
// object to bytearray
ByteArrayOutputStreambo=newByteArrayOutputStream();
ObjectOutputStreamoo=newObjectOutputStream(bo);
oo.writeObject(obj);
bytes=bo.toByteArray();
bo.close();
oo.close();
} catch (Exceptione) {
System.out.println("translation"+e.getMessage());
e.printStackTrace();
}
returnbytes;
}
但是这一套操作的性能比较堪忧,我又测试了一遍json序列化反序列化的性能.
json的性能明显要好于jdk的性能。
private static void testJson() throwsIOException {
//10w次 序列化 / 反序列化 耗时238
Personperson=newPerson();
person.setName("tom");
person.setAge(17);
ObjectMapperobjectMapper=newObjectMapper();
longstart=System.currentTimeMillis();
for (inti=0; i<100000; i++) {
person.setAge(i);
Strings=objectMapper.writeValueAsString(person);
objectMapper.readValue(s, Person.class);
}
longend=System.currentTimeMillis();
System.out.println("json / 耗时: "+(end-start));
}
private static void testJdk(){
//10w次 序列化/反序列化耗时: 599ms
Personperson=newPerson();
person.setName("tom");
person.setAge(17);
longstart=System.currentTimeMillis();
for (inti=0; i<100000; i++) {
person.setAge(i+1);
byte[] bys=BytesUtils.ObjectToByte(person);
Objectp=BytesUtils.ByteToObject(bys);
}
longend=System.currentTimeMillis();
System.out.println("jdk / 耗时: "+(end-start));
}
最终敲定,编解码采用protobuf+json的方式
当然我还提供了Jdk的方式
