原创:猿天地(微信公众号ID:cxytiandi),欢送分享,转载请保留出处。
在工作中,我置信很多人都有上面这样的感触:
- 这谁的代码呀,看不下去了
- 这破代码,一行正文也没有
- 这代码,还没我写的好
- 这代码,有bug吧
- 这代码,。。。。。。。
是不是很实在,咱们往往在看他人代码的时候就会有下面这些想法。我认为次要的起因还是大部分看的都是业务代码,而且很多是多年积攒下来的,也没有重构,而后一年年的堆逻辑,最初就变成shi山了。
当然也有不少的人代码写的的确很好,简洁易懂,咱们在看他人代码的时候要抱着学习的态度去看,同样的逻辑,看看他人是怎么写的,为什么这样写,如果是本人会怎么写,比照下,这样的话你就有播种了。
明天想跟大家聊的话题次要是看开源我的项目的源码,因为业务代码大家每天都能看。所以往往只会去用某些框架,而疏忽了它的外在。
多看开源我的项目的源码是很好的学习机会,特地是当你遇到问题的时候,或者想要做一个什么性能的时候,如果有其余框架中也有相似性能,那么你就晓得怎么做了。
案例一
比方我在做一个性能,须要集成多种配置核心,如果依赖了Nacos那就用Nacos,如果依赖了Apollo,那就用Apollo。在主动拆卸的类中就要解决这种没有依赖的状况,最开始想的就是这样解决:
@ConditionalOnClass(value = com.alibaba.nacos.api.config.ConfigService.class)@ConditionalOnMissingClass(value = { "com.alibaba.cloud.nacos.NacosConfigProperties" })@Beanpublic NacosConfigUpdateListener nacosConfigUpdateListener() { return new NacosConfigUpdateListener();}
而后测试发现,如果在我的项目没有依赖Nacos的状况下,这里就会报错,尽管加了判断也不行。这个时候我就再想,其余的一些框架中是如何实现的呢?
这个时候我就想到之前看Zuul的源码,外面也有相似的需要。会应用不同的Client来进行调用,比方ApacheHttpClient, OkHttpClient。
发现Zuul外面是加了动态类进行判断的,这就不会报错了。如下:
@Configuration@ConditionalOnClass(value = com.alibaba.nacos.api.config.ConfigService.class)@ConditionalOnMissingClass(value = { "com.alibaba.cloud.nacos.NacosConfigProperties" })protected static class NacosConfiguration { @Bean public NacosConfigUpdateListener nacosConfigUpdateListener() { return new NacosConfigUpdateListener(); }}
案例二
当我须要管制Feign的调用逻辑,替换调用的URL时我就想到之前看过Sleuth的源码,Sleuth做为一款链路跟踪框架,外部对很多框架进行了集成。
像Feign这种近程调用的,须要对它进行扩大,而后透传链路跟踪的数据。所以当我也有相似需要的时候,就能够参考Sleuth的实现。
下面贴了Sleuth中的TracingFeignClient源码,TracingFeignClient就是Sleuth中对Feign Client的扩大,减少了Sleuth本人的一些逻辑。而后这个TracingFeignClient最终会在启动的时候替换掉Feign默认的Client。
案例三
当我须要对Redis做埋点监控的时候,又想起了之前看过opentracing中对Redis的监控代码,就能够借鉴外面的形式。
地址:
https://github.com/opentracing-contrib/java-spring-cloud/
外面就是用了AOP对RedisConnectionFactory和RedisConnection进行了替换,也不必动框架底层的代码,扩大就行。
总结
写本文的目标就是为了通知大家,在平时无事的时候除了学习一些框架的应用,也要去翻翻源码。尽管过后不肯定用的到,然而在你当前遇到相似问题的时候,你会有映象说,过后我在某某框架中看到过相似的解决方案,这就是你的常识积攒。
另一个点就是这些框架中都会用到一些好的设计,也是咱们能够学习参考的案例。
最初就是在面试中也有遇到说:有没有看过框架的源码啊之类的问题?
如果真的看过,并且记住了,这个时候你就能够和面试官娓娓而谈,称兄道弟了。
对于作者:尹吉欢,简略的技术爱好者,《Spring Cloud微服务-全栈技术与案例解析》, 《Spring Cloud微服务 入门 实战与进阶》作者, 公众号猿天地发起人。