1,DefaultEurekaServerConfig回顾
上一篇文章,我们已经对DefaultEurekaServerConfig类做了深入的分析和讲解,我们也知道了其中的设计思想和一些设计模式的使用。接下来我们将继续跟进其他源码的分析。
2,编码器深入分析
// For backward compatibility
//V1版本的服务实例信息转换器
JsonXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH);
XmlXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH);
logger.info("Initializing the eureka client...");
logger.info(eurekaServerConfig.getJsonCodecName());
//初始化服务器编码器 分别是 json和xml的编码器
//CodecWrapper
ServerCodecs serverCodecs = new DefaultServerCodecs(eurekaServerConfig);
这两行代码的作用都是一样的,就是注册编码解析,一个是json的,一个是xml的。
JsonXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH);
XmlXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH);
我就对一个进行相关的分析,进入到JsonXStream.getInstance()中。
默认注册ApplicationConverter应用对象信息的编码和反编码对象
默认注册ApplicationsConverter应用对象信息集合的编码和反编码对象
默认注册DataCenterInfoConverter数据中心对象信息的编码和反编码对象
默认注册InstanceInfoConverter实例对象信息的编码和反编码对象
默认注册LeaseInfoConverter服务续约对象信息的编码和反编码对象
默认注册MetadataConverter元数据对象信息的编码和反编码对象
这个类 V1AwareInstanceInfoConverter 中的源码中,我们可以看到扩展了状态的解析,获取当前服务实例状态的一个方法。
registerConverter(new V1AwareInstanceInfoConverter(),
XStream.PRIORITY_VERY_HIGH);
继续跟进到这个registerConverter中去。
根据优先级值注册到编码注册表中,继续跟进源码
DefaultConverterLookup 这个类中的registerConverter方法中,有一个优先级列表用来保存注册的解析实现类
private final PrioritizedList converters = new PrioritizedList();
匹配Converter实现类的时候通过优先值最高的进行匹配,通过源码可以看到
当前的集合中是否有,如果没有就遍历优先级集合,值越高的优先被匹配,然后保存到map中。
3,编码器的设计模式思考
Converter接口分析
Converter接口继承了ConverterMatcher接口,所有的接口都需要实现
boolean canConvert(Class type);
void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context);
Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context);
通过这个源码我们可以学习到:策略模式 + 优先级设计 + 享元模式
这个Converter有多个实现,并且把默认的实现都注册到优先级集合和map集合中去,当需要查找的匹配的Converter实现时,优先级最高的先匹配,匹配后的可以直接从map中获取,加快性能。
到此我们对注册Converter的源码分析完成,后续继续分析其他的源码。