第 1 周 -周记
最近几个月一直在看框架的知识,包括xxl-job、spring cloud、etl-python、zkClient、zookeeper等等, 现在总结一下最近看的知识点,并总结出一下知识。
1. RPC的实现
查看很多框架的源码,好像对于多web的调用方式,基本都是RPC去实现的,当然实现的方式有很多种,比如HTTP的实现、Netty的nio实现,他们之间的区别在哪里, 这个暂时无法确定,因为我对netty的nio 不怎么熟悉,对http的restful请求了解。
2. 序列化的方式
对xxl-job 中有查看对象的序列化,其实现方式为xxxx。 对于其他java对象的序列化,一般来说都是实现Serializable就可以了。
还有zkClient 中的序列化是指定对应的 serializable 实现类SerializableSerializer和BytesPushThroughSerializer。
SerializableSerializer的serialize, 是将对象通过流的方式实现, stream.writeObject(serializable)
,
deserialize也是流的方式显示,Object object = inputStream.readObject();
。除了这些还有以下序列的工具比如 Jackson, fastjson,gson , Hessian, Kryo 等等,Javason 主要利用ObjectMapper 的writeValueAsString和readValue进行序列化和反序列的。
比较
框架 | 对象 | 序列化 | 反序列化 |
---|---|---|---|
xxl-job | HESSIAN1 | HessianOutput .writeObject(obj) | HessianInput.readObject() |
xxl-job | HESSIAN | Hessian2Output.writeObject(obj) | Hessian2Input.readObject() |
xxl-job | PROTOSTUFF | RuntimeSchema.createFrom(cls) | ProtostuffIOUtil.mergeFrom(bytes, message, schema) |
xxl-job | KRYO | kryoLocal.get().writeObject(output, obj) | kryoLocal.get().readObject(input, clazz) |
xxl-job | JacksonSerializer | objectMapper.writeValueAsBytes(obj) | objectMapper.readValue(bytes, clazz) |
Serializable接口 | ObjectInputStream | writeObject | readObject |
zkClient | SerializableSerializer | serialize(实现:stream.writeObject(serializable) ) | deserialize(实现:Object object = inputStream.readObject() ) |
Jackjson | ObjectMapper | writeValueAsString | readValue |
Fastjson | JSON类 | toJSON | parseObject |
Gson | Gson对象 | toJson | fromJson |
查看Java Serializable:明明就一个空的接口嘛, 在jdk中搜索defaultWriteObject
会出现如下图
xxl-job
----- HESSIAN1
HessianOutput .writeObject(obj)
HessianInput.readObject()
xxl-job
----- HESSIAN
Hessian2Output.writeObject(obj)
Hessian2Input.readObject() |
xxl-job
----- PROTOSTUFF
RuntimeSchema.createFrom(cls)
ProtostuffIOUtil.mergeFrom(bytes, message, schema)|
xxl-job
----- KRYO
kryoLocal.get().writeObject(output, obj)
kryoLocal.get().readObject(input, clazz) |
xxl-job
----- JacksonSerializer
objectMapper.writeValueAsBytes(obj)
objectMapper.readValue(bytes, clazz)|
Serializable接口
----- ObjectInputStream
writeObject
readObject
zkClient
----- SerializableSerializer
serialize(实现:stream.writeObject(serializable) )
deserialize(实现:Object object = inputStream.readObject() ) |
Jackjson
----- ObjectMapper
writeValueAsString
readValue
Fastjson
----- JSON类
toJSON
parseObject
Gson
----- Gson对象
toJson
fromJson
tips: static 和 transient修饰的字段无法serializable
3. juc中的知识
lock, synchronized, volatile, AQS, countDownLatch,CyclicBarrier, Semaphore,Condition, juc的原子类Atomic**, ThreadPool, 这些知识都在《java高并发编程》中有,其中我还收集了一些,可以查看自己整理的目录,Java多线程系列目录(共43篇)-转, 链接中讲解的很清楚了,这里就不重复了。
4. 队列
队列,这里说的队列泛指消息中间件功能中的队列。一般就是消息的存取,其中自己写了生产者与消费者5种实现方式
5. zookeeper的应用
利用zookeeper实现了 master 选举、分布式队列、负载均衡、分布式锁、发布与订阅实例。
详见我的github , zk_code
引用
PS: 若你觉得可以、还行、过得去、甚至不太差的话,可以“关注”或者“点赞”一下,就此谢过!